十五:爬虫-Scrapy-redis分布式

一:python操作redis

1.redis的安装与连接

安装
pip install redis
连接
r = redis.StrictRedis(host='localhost',port=6379,db=0)

2.redis数据类型相关操作

(1)字符串相关操作
import redis
class TestString(object):# 初始化 连接redis数据库def __init__(self):self.r = redis.StrictRedis(host='127.0.0.1', port=6379)# 设置值def test_set(self):res = self.r.set('user1', 'yueyue-1')print(res)# 取值def test_get(self):res = self.r.get('user1')print(res,type(res))res = res.decode('UTF-8')print(res, type(res))# 设置多个值def test_mset(self):d = {'user2': 'yueyue-2','user3': 'yueyue-3'}res = self.r.mset(d)print(res)# 取多个值def test_mget(self):l = ['user2', 'user3']res = self.r.mget(l)print(res)# 删除def test_del(self):self.r.delete('user2')if __name__ == '__main__':t = TestString()# t.test_set()t.test_get()
(2)列表相关操作
import redisclass TestList(object):def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=1)# 插入记录def test_push(self):res = self.r.lpush('common', '1')print(res)res = self.r.rpush('common', '2')print(res)# 弹出记录def test_pop(self):res = self.r.lpop('common')res = self.r.rpop('common')# 范围取值def test_range(self):res = self.r.lrange('common', 0, -1)print(res)if __name__ == '__main__':t = TestList()# t.test_set()# t.test_push()t.test_range()
(3)集合相关操作
import redisclass TestSet(object):def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=1)# 添加数据def test_sadd(self):res = self.r.sadd('set01', '1', '2')# redis升级到3.0以后不支持 bytes, string, int , float以外的数据类型。# 删除数据def test_del(self):res = self.r.srem('set01', 1)# 随机删除数据def test_pop(self):res = self.r.spop('set01')if __name__ == '__main__':t = TestSet()# t.test_set()# t.test_push()t.test_pop()
(4)哈希相关操作
import redisclass TestHash(object):def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=1)# 批量设值def test_hset(self):dic = {'id': 1,'name': 'huawei'}res = self.r.hmset('mobile', dic)# 批量取值def test_hgetall(self):res = self.r.hgetall('mobile')print(res)# 判断是否存在	存在返回1  不存在返回0def test_hexists(self):res = self.r.hexists('mobile', 'id')print(res)if __name__ == '__main__':t = TestHash()# t.test_set()# t.test_push()t.test_hexists()

二:scrapy_redis操作分布式爬虫

1.scrapy-redis介绍

1  Scrapy分布式爬虫意味着几台机器通过某种方式共同执行一套爬取任务,
这就首先要求每台机器都要有Scrapy框架,一套Scrapy框架就有一套Scrapy五大核心组件,
引擎--调度器--下载器--爬虫--项目管道,各自独有的调度器没有办法实现任务的共享,
所以不能实现分布式爬取。
2  假设可以实现Scrapy框架的调度器共享,那么就能实现分布式爬取了吗?
答案是不能,因为我们实现了任务的共享,但是框架之间的项目管道是单独的,
我们的任务下载完之后,我们爬取的有效信息还是不能全部存放在某个指定的位置,
所以要想实现分布式爬虫,需要同时满足调度器和项目管道的共享才可以达到分布式的效果。

2.共享爬取队列的维护

集合 无序且不重复  请求去重 达到去重的效果 

3.scrapy-redis工作流程

scrapy-redis.png

4.scrapy_redis中的settings文件

# Scrapy settings for example project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
#     http://doc.scrapy.org/topics/settings.html
#
SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'
# 需要改
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
# 指定去重方式 给请求对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"    # 指定那个去重方法给request对象去重
# 设置调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"    # 指定Scheduler队列
# 队列中的内容是否进行持久保留 True redis关闭的时候数据会保留
# False 不会保留
SCHEDULER_PERSIST = True        # 队列中的内容是否持久保存,为false的时候在关闭Redis的时候,清空Redis
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"ITEM_PIPELINES = {'example.pipelines.ExamplePipeline': 300,'scrapy_redis.pipelines.RedisPipeline': 400,    # scrapy_redis实现的items保存到redis的pipline
}LOG_LEVEL = 'DEBUG'# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 1

5.运行结束后redis中多了三个键


dmoz:requests 存储待爬取的请求对象。
这些请求可能包括爬取的URL、请求头、请求体等信息。
Scrapy使用这些请求对象来发送HTTP请求并获取响应数据。dmoz:item 存储已经爬取到的数据。
这些数据可能包括HTML页面中提取的文本、链接、图片等信息。
Scrapy使用这些数据来进行进一步的分析和处理。dmoz:dupefilter 存储已经爬取过的请求的指纹。
Scrapy使用指纹来避免重复爬取同一个URL。
如果一个请求的指纹已经存在于dupefilter中,那么Scrapy将不会再次爬取该请求。

6.setings文件的补充

setings.py# 取消日志
# LOG_LEVEL = 'WARNING'# 需要改
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
# 指定去重方式 给请求对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 队列中的内容是否进行持久保留 True redis关闭的时候数据会保留
# False 不会保留
SCHEDULER_PERSIST = True# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}ITEM_PIPELINES = {# 'DMBJ.pipelines.DmbjPipeline': 300,# 将数据保存到redis中'scrapy_redis.pipelines.RedisPipeline': 400,
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/316239.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决VMware 虚拟机 ubuntu 20.04 异常关闭导致虚拟网卡 ens33 无法工作问题

问题描述 由于经常使用 SSH 远程链接 VMware 中的虚拟机 ubuntu,每次关闭都是挂起,时间久了,虚拟机运行有些卡顿了,此时可以通过 Linux 命令重启或者关闭 ubuntu,也可以之间使用 VMWare 中的【虚拟机】-- 【电源】-&g…

HPM6750开发笔记《GPIO例程深度解析》

目录 创建工程: 代码分析: 1.头文件包含: 2.宏定义: 3.中断服务程序(ISR): 清除中断标志: 处理 LED 状态切换: 处理用户按键状态: 处理其他情况&…

WPF+Halcon 培训项目实战(11):HS组件封装

文章目录 前言相关链接项目专栏运行环境匹配图片封装组件新增类库项目选择依赖顺序并添加Nuget修改原本矩形方法运行结果: 对矩形进行抽象封装抽象基类矩形抽象改造 圆形抽象封装代码运行结果 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原…

基于Rangenet Lib的自动驾驶LiDAR点云语义分割与可视化

这段代码是一个C程序,用于处理来自KITTI数据集的激光雷达(LiDAR)扫描数据。程序主要实现以下功能: 1. **读取和解析命令行参数**:使用Boost库中的program_options模块来定义和解析命令行参数。这包括扫描文件路径、模型…

计算机毕业设计 基于SSM的果蔬作物疾病防治系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

第二十七章 正则表达式

第二十七章 正则表达式 1.正则快速入门2.正则需求问题3.正则底层实现14.正则底层实现25.正则底层实现36.正则转义符7.正则字符匹配8.字符匹配案例19.字符匹配案例211.选择匹配符(|)12.正则限定符{n}{n,m}(1个或者多个)*(0个或者多…

介绍两本书《助推》与《耐力》

冠历最后一年已经养成了没有冲突的情况下每天跑步、读书的习惯,今天突发奇想:是否重新挑战下每日写作。 ​ 今天介绍两本书。第一本是《助推》,这本书是由于真友 吾真本 的介绍开始读的。 一句话介绍这本书,那就是:如果…

Hive08_分区表

一 分区表 1 概念: 分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询…

机器人制作开源方案 | 多地形适应野外探索智能车

1. 作品基本介绍 如今,智能机器人在军事、制造业、交通运输、航天航空、医疗、服务等领域已有广泛的应用,智能车是机器人研究领域的一项重要基础内容,在各种移动机构中,最为常见的是轮式移动方式,当今社会正处于科技高…

Linux 断言的使用

断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供

霹雳吧啦Wz《pytorch图像分类》-p4GoogLeNet网络

《pytorch图像分类》p4GoogLeNet网络详解 一、GoogLeNet网络中的亮点1.inception结构2.使用11的卷积核进行降维及映射处理3.GoogLeNet辅助分类器4.模型参数 二、模块代码1.BasicConv2d2.Inception 三、课程代码1.module.py2.train.py3.predict.py 一、GoogLeNet网络中的亮点 论…

ES(Elasticsearch)的基本使用

一、常见的NoSQL解决方案 1、redis加粗样式 Redis是一个基于内存的 key-value 结构数据库。Redis是一款采用key-value数据存储格式的内存级NoSQL数据库,重点关注数据存储格式,是key-value格式,也就是键值对的存储形式。与MySQL数据库不同&a…