scrapy分布式的几个重点问题


我们之前的爬虫都是在同一台机器运行的,叫做单机爬虫。
scrapy的经典架构图也是描述的单机架构。

那么分布式爬虫架构实际上就是:
由一台主机维护所有的爬取队列,每台从机的sheduler共享该队列,协同存储与提取。
分布式爬虫的多台协作的关键是共享爬取队列。

队列用什么维护呢?
推荐redis队列
redis是非关系型数据库,用key-value形式存储,结构灵活,他不像关系型数据库必须要由一定的结构才能存储。
key-value可以是多种数据,非常灵活。
另外,redis是内存中的数据结构存储系统,处理速度快,性能好。
提供了队列,集合多种存储结构,方便队列维护和去重操作。

怎样来去重?
如果多台机器不仅往请求队列存,还同时从里面取,那么如何保证每台机子请求和存储的队列是不重复的呢?
借助redis集合
redis提供集合数据结构,我们知道集合里面的元素是不重复的
首先,在redis中存储每隔request的指纹。
在向request队列中加入request前首先验证这个request的指纹是否已经加入到集合中。
如果已存在,则不添加requets到队列,
如果不存在,则将request添加入队列并将指纹加入集合。

怎样防止中断?
在爬取的过程中,难免会有某台机子卡掉了,这时怎么办?
在每台从机scrapy启动时都会首先判断当前redis request队列是否为空。
如果不为空,则从队列中取得下一个request执行爬取。
如果为空,则重新开始开始爬取,第一台从机执行爬取想队列中添加request。

怎样实现该架构?
要做到:
维护request队列
对台从机调度reuqest
设置去重
链接redis

已经有了比较成熟的库scrapy-redis

scrapy-redis库实现了如上架构,改写了scrapy的调度器,队列等组件
利用它可以方便地实现scrapy分布式架构
https://github.com/rolando/scrapy-redis
原文地址:https://www.cnblogs.com/themost/p/7131797.html