分布式 scrapy 的组件源码介绍完了, 大致总结一下, 相关组件目录如下:
《RedisSpider 的调度队列实现过程及其源码》
《scrapy 中 scrapy_redis 分布式内置 pipeline 源码及其工作原理》
《scrapy 分布式调度源码及其实现过程》
《scrapy 分布式 Spider 源码分析及实现过程》
《scrapy 分布式去重组件源码及其实现过程》
《scrapy_redis 中序列化源码及其在程序设计中的应用》
《scrapy_redis 分布式组件 Connection 源码解读及工作原理》
其架构如图:
在对比 scrapy 架构:
在架构上 scrapy_redis 比 scrapy 多了一个中介 Redis, 正是通过 Redis 实现的去重和数据储存, 同时 scrapy_redis 实现了四个组件的重写, Scheduler(调度),Duplication Filter(去重), Item Pipeline(数据管道),Base Spider(爬虫基类)
分布式爬虫运行机制如下:
要求运行在不同机器上的源码一致, 尤其是 Redis 的配置, 相同的 Redis 才能实现共同去重和分布式爬虫之间的通信, 同时相应的在配置文件 setting.py 中启用 scrapy_Rediszi 自定义实现的组件
- DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
- SCHEDULER = "scrapy_redis.scheduler.Scheduler"
- SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
至于 pipeline 在需要使用 Redis 储存数据的情况下也可以启用
Spider 开始运行, 构造 Request 对象, 然后根据 Request 对象的 URL 及其其他 headers 信息对 Request 去重
去重后的 Request, 会被调度序列化后放入 Redis 实现的队列或者堆栈或者优先级队列中
适当时候会取出 Request 交给下载器, 然后开始下载, 下载完的 resposne 对象会交给 Spider 解析, 从而继续上一个流程.
来源: https://yq.aliyun.com/articles/694370