Python之爬虫(二十二) Scrapy分布式原理

关于Scrapy工做流程回顾

Scrapy单机架构git

上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列。github

分布式架构redis

我将上图进行再次更改mongodb

这里重要的就是个人队列经过什么维护?
这里通常咱们经过Redis为维护,Redis,非关系型数据库,Key-Value形式存储,结构灵活。
而且redis是内存中的数据结构存储系统,处理速度快,提供队列集合等多种存储结构,方便队列维护数据库

如何去重?
这里借助redis的集合,redis提供集合数据结构,在redis集合中存储每一个request的指纹
在向request队列中加入Request前先验证这个Request的指纹是否已经加入集合中。若是已经存在则不添加到request队列中,若是不存在,则将request加入到队列并将指纹加入集合服务器

如何防止中断?若是某个slave由于特殊缘由宕机,如何解决?
这里是作了启动判断,在每台slave的Scrapy启动的时候都会判断当前redis request队列是否为空
若是不为空,则从队列中获取下一个request执行爬取。若是为空则从新开始爬取,第一台丛集执行爬取向队列中添加request数据结构

如何实现上述这种架构?
这里有一个scrapy-redis的库,为咱们提供了上述的这些功能
scrapy-redis改写了Scrapy的调度器,队列等组件,利用他能够方便的实现Scrapy分布式架构
关于scrapy-redis的地址:https://github.com/rmax/scrapy-redis架构

搭建分布式爬虫

参考官网地址:https://scrapy-redis.readthedocs.io/en/stable/scrapy

前提是要安装scrapy_redis模块:pip install scrapy_redis
这里的爬虫代码是用的以前写过的爬取知乎用户信息的爬虫分布式

修改该settings中的配置信息:

替换scrapy调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

添加去重的class
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

添加pipeline
若是添加这行配置,每次爬取的数据也都会入到redis数据库中,因此通常这里不作这个配置
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}

共享的爬取队列,这里用须要redis的链接信息
这里的user:pass表示用户名和密码,若是没有则为空就能够
REDIS_URL = 'redis://user:pass@hostname:9001'

设置为为True则不会清空redis里的dupefilter和requests队列
这样设置后指纹和请求队列则会一直保存在redis数据库中,默认为False,通常不进行设置

SCHEDULER_PERSIST = True

设置重启爬虫时是否清空爬取队列
这样每次重启爬虫都会清空指纹和请求队列,通常设置为False
SCHEDULER_FLUSH_ON_START=True

分布式

将上述更改后的代码拷贝的各个服务器,固然关于数据库这里能够在每一个服务器上都安装数据,也能够共用一个数据,我这里方面是链接的同一个mongodb数据库,固然各个服务器上也不能忘记:
全部的服务器都要安装scrapy,scrapy_redis,pymongo

这样运行各个爬虫程序启动后,在redis数据库就能够看到以下内容,dupefilter是指纹队列,requests是请求队列

相关文章
相关标签/搜索