[Architecture overview] - Scrapy 框架概览
摘要:关于scrapy架构的简单介绍。
1 整体架构
下面的这张图是我对官方文档中 Scrapy 框架的描述的翻译加转述,基本能让大家明白Scrapy整一个流程是怎样的。图中的粉色圆形序号表示流程顺序,粉色箭头表示数据流向,灰色带序号文字表示对对应的粉色序号的解释。详细参看下图:
2 部件解释
Scrapy Engine(爬虫引擎)
爬虫引擎负责所有组件之间的数据交换和事件触发。
Scheduler(任务规划器)
接收从引擎发送的请求(requests)并将请求添加至队列(enqueues),当引擎发起请求时反馈(feed)请求。
Downloader(下载器)
下载器负责抓取网页并将其反馈给引擎,引擎反过来将其提供给爬虫。
Spiders(爬虫)
爬虫是有用户编写的用于解析响应和提取结构化数据,并进一步发出请求。
Item Pipeline(数据管道)
用于进一步处理由爬虫解析的数据,一般任务有:清理数据、验证数据、数据持久化。
Downloader middlewares(下载中件)
下在中件位于爬虫引擎和下载器之间,在下面情况下你需要使用下载中件:
- 需要处理请求,在引擎将请求发送给下载器前( Scrapy 将请求发送给目标网站前);
- 需要处理响应,在响应发送给引擎前;
- 需要将一个新的请求发送给引擎,而不是发送下载器接收的响应;
- 不用请求网络数据,直接将数据发给引擎;
- 静默丢弃一些请求。
Spider middlewares(爬虫中件)
爬虫中间位于爬虫和引擎之间,用于处理爬虫的输入 (response) 和输出 (items、 requests),在下面情况下你需要使用爬虫中件:
- 改变、添加、移除 requests 或 items 时;
- 发起初始请求(start_requests);
- 处理爬虫异常;
- 根据响应内容发起 errback (错误反馈) 而不是 callback (回调处理)。
3 其他内容
- Scrapy 是使用 Twisted 编写的,Twisted 是Python中一个事件驱动型网络框架,因此它是使用非阻塞式(异步)的代码实现并发。
Scrapy 使用了 LIFO (后进先出)的队列方法存储请求,因此用 Scrapy 写的爬虫是深度优先的(DFO order),如果需要广度优先(BFO)可以按如下设置:
DEPTH_PRIORITY = 1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
关于深度优先和广度优先可以参看下图理解:
1、深度优先
2、广度优先
本节参考文档:
Architecture overview
Frequently Asked Questions
参考
摘抄自:Architecture overview - Scrapy 框架概览 - 知乎,感谢作者。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。