Eamonn

人生苦短,我用Python

· 默认分类Python · · 637次浏览

基于Scrapy与RabbitMQ结合的优化分布式爬虫框架

scrapy_rabbit.png
目的:
降低数据采集的漏采率
提高数据的采集效率
使项目之间代码复用性提高
采集进度可视化
使得采集过程中中断后,可以继续采集

架构:
Spiders(爬虫器):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
Engine(引擎):框架核心,负责Spider、RabbitMQ、Downloader、ItemPipeline中间的通讯,信号、数据传递等
RabbitMQ(消息队列):它负责接受引擎发送过来的Request请求,并按照指定优先级进行整理队列
Downloader(下载器):负责下载Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Engine(引擎),由引擎交给Spider来处理
ItemPipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方
Downloader Middlewares(下载中间件):介于Scrapy引擎和下载器之间的中间件,主要是处理Scrapy引擎与下载器之间的请求及响应
Spider Middlewares(Spider中间件):介于Scrapy引擎和爬虫之间的中间件,主要工作是处理蜘蛛的响应输入和请求输出

框架整体工作顺序:
Spiders将所有Requests发送给Engine
Engine对Requests不做处理直接存入到RabbitMQ消息队列中
所有Requests都已存入到RabbitMQ中后,通过Middlewares过滤发送给Downloader
Downloader在网络上获取到Response数据后,经过Middleware过滤返回给Engine,如果请求失败则将Requests返回到RabbitMQ
Engine获取到数据后返回给Spiders,Spiders对收到的数据进行处理,解析出Items或 者Requests
将解析出来的Items或者Requests发送给Engine
Engine获取到Items或者Requests,将Items发送给ItemPipline进行持久化存储,将Reques存入到RabbitMQ

提升点:
1)使得采集过程可以做到断点续爬
2)原生支持分布式采集,生产与消费可以同时进行,并且可以使用多个消费者同时消费
3)采集效率得到提高,漏采率大幅下降
4)采集进度以及速度都可以通过RabbitMQ后台直观的看到

评论 (0条)