当前位置:   article > 正文

基于scrapy-redis的分布式爬虫的配置_要想让scrapy结合redis,应该对scrapy爬虫请求的调度算法进行修改,以下哪种修改不

要想让scrapy结合redis,应该对scrapy爬虫请求的调度算法进行修改,以下哪种修改不

Scrapy是一个框架,他本身是不支持分布式的。如果我们想要做分布式的爬虫,就需要借助一个组件叫做Scrapy-Redis,这个组件正是利用了Redis可以分布式的功能,集成到Scrapy框架中,使得爬虫可以进行分布式。

利用Redis数据库实现分布式爬取,基本思想是将Scrapy爬虫的请求都放到Redis Queue中,所有的爬虫也都从指定的Redis Queue中获取请求,Scrapy-Redis组件中默认使用SpiderPriorityQueue来确定获取的先后次序,待爬取评论页面的参数队列的共享是爬虫可以部署在其他服务器上完成同一个爬取任务的一个关键点。

Master端管理Redis数据库和分发下载任务,Slave部署Scrapy爬虫提取网页和解析提取数据,最后将解析的数据存储在同一个MySQL数据库中。
在进行分布式爬虫之前,我们需要在master端搭建一个redis数据库,在slave端安装scrapy和分布式调度组件scrapy_redis。

对于master端,它的任务是获取某个景点的每一页内容的request存放在redis中,对访问参数进行去重、分配,对于slave端,最核心的模块是从master端的redis中获得待爬取页面的request,从而获取页面的response,解析提取字段。具体为爬虫从redis中取到request,开始运行爬虫访问链接,将下载器返回的Response,爬虫根据spider定义的爬取规则识别是否有匹配规则的内容字段,若有将字段存储,返回到模型中,等待数据存储操作。重复上述操作,直到待爬取页面请求队列为空,爬虫则等待新的请求。

Scrapy详细流程:

在这里插入图片描述Spiders将请求(访问链接的请求)传递给引擎(中间的),引擎拿到请求之后,将它交给调度器(下方的),调度器会以合理的队列来调度它们,再将这些请求传给引擎,引擎拿到这些请求后,会将这些请求交给下载器(右方的),下载器接收到请求后,会依次从internet上下载数据,得到response后,将response传递给引擎,引擎拿到请求结果后,会将请求结果给spiders,spiders对response进行解析,将解析得到的有用的数据items传递给引擎,然后引擎将这个数据类传给item pipelines,并进行后续处理,将其进行存储。
流程:
1.创建一个新的scrapy项目:scrapy startproject myspider
2.制作爬虫:爬数据,创建及编辑spider文件,取数据,解析网页结构。
3明确目标:item定义结构化数据字段,用来保存爬取到的数据。
4.存储数据:直接导出结构化文件,编写pipeline持久化数据库存储。

scrapy_redis 与 scrapy 的区别

1.增加了Redis 数据库;
2.队列:
– scrapy 本身不支持爬虫 request 队列共享,即一个队列只能服务于一个爬虫,不支持分布式爬取;
– scrapy-redis 则把 request 队列存放于 Redis 数据库,多个爬虫 spider 可以到同一个 Redis 数据库里读取;
3.去重:
– scrapy 使用 set 集合实现 request 去重,通过将 request 与 set 中的已有 request 进行比对,如果已存在则丢弃;
– scrapy-redis 使用 Dupelication Filter 组件实现去重,scrapy-redis 调度器从引擎接受 request 并判断是否重复,并将不重复的 reuquest 写入 Redis 中的 队列,之后调度器从队列中根据优先级 pop 出一个 reuqest 发送给爬虫引擎 spider 进行处理

分布式爬虫的优势:

解决目标地址对IP访问频率的限制的问题;
利用更高的带宽,提高下载速度;

分布式爬虫开始前的配置:

1.修改 spider.py将爬虫的父类已经改成RedisSpider

2.修改pipeline:
修改mysql数据库连接,以保障所有数据都能保存在master的mysql数据库中。
master 上 mysql 的 host 为 127.0.0.1
slave 上 mysql 的 host 为 master 的 ip
3.修改 settings.py
替换 SHCEDULER,使用scrapy_redis进行任务分发与调度
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
4.使用 scrapy_redis 去重队列:
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”

5.使用 ‘优先级队列’进行爬虫调度,即各个主机获取请求的先后次序:
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderPriorityQueue’

6.设置redis地址和端口:
REDIS_HOST = ‘127.0.0.1’ # 修改为Redis的实际IP地址
REDIS_PORT = 6379 # 修改为Redis的实际端口
如果不设置 Redis 的地址和端口,系统会默认 Redis 运行在本机。

分布式爬虫的大致流程:

在这里插入图片描述
Spiders将请求传递给引擎(中间的),引擎拿到请求之后,将它交给调度器(上方的),scrapy-redis调度器从引擎接受 request 并判断该请求是否重复,并将不重复的 requests 写入 Redis 中的 队列,之后各个主机按照顺序获取请求从队列中获取request;(红色为与scrapy不同的地方)再将这些请求传给引擎,引擎拿到这些请求后,会将这些请求交给下载器(右方的),下载器接收到请求后,会依次从internet上下载数据,得到response后,将response传递给引擎,引擎拿到请求结果后,会将请求结果给spiders,spiders对response进行解析,将解析得到的有用的数据items传递给引擎,然后引擎将这个数据类传给item pipelines,并进行后续处理,将其存储到同一个mysql数据库。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/592475
推荐阅读
相关标签
  

闽ICP备14008679号