架构概述¶
本文档描述了Scrapy的架构及其组件如何交互。
概述¶
下图展示了Scrapy架构的概览,包括其组件以及系统内部发生的数据流概述(由红色箭头表示)。下面包含了组件的简要描述,并提供了关于它们的更详细信息的链接。数据流也在下面进行了描述。
数据流¶
Scrapy中的数据流由执行引擎控制,流程如下:
Engine 将请求发送到 Downloader,经过 Downloader Middlewares(参见
process_request())。一旦页面完成下载, Downloader 会生成一个响应(包含该页面)并将其发送到引擎,通过 Downloader Middlewares(参见
process_response())。Engine 接收来自 Downloader 的响应并将其发送到 Spider 进行处理,通过 Spider Middleware(参见
process_spider_input())。Spider 处理响应并返回抓取的项目和新的请求(用于后续操作)到 Engine,通过 Spider Middleware(参见
process_spider_output())。Engine 将处理后的项目发送到 Item Pipelines,然后将处理后的请求发送到 Scheduler 并请求可能的下一个请求 进行爬取。
该过程重复(从步骤3开始),直到没有来自 Scheduler的更多请求。
组件¶
Scrapy引擎¶
引擎负责控制系统所有组件之间的数据流,并在某些操作发生时触发事件。有关更多详细信息,请参见上面的数据流部分。
调度器¶
scheduler 接收来自引擎的请求,并将它们排队,以便在引擎请求时稍后(也向引擎)提供它们。
下载器¶
下载器负责获取网页并将其提供给引擎,引擎再将其提供给蜘蛛。
爬虫¶
蜘蛛是由Scrapy用户编写的自定义类,用于解析响应并从中提取items或额外的请求以继续跟踪。更多信息请参见Spiders。
项目管道¶
项目管道负责处理由爬虫提取(或抓取)的项目。典型任务包括清洗、验证和持久化(如将项目存储在数据库中)。更多信息请参见项目管道。
下载器中间件¶
下载器中间件是位于引擎和下载器之间的特定钩子,当请求从引擎传递到下载器时,以及响应从下载器传递到引擎时,它们会处理这些请求和响应。
如果需要执行以下操作之一,请使用下载器中间件:
在请求发送到下载器之前处理请求 (即在Scrapy将请求发送到网站之前);
在将接收到的响应传递给爬虫之前进行更改;
发送一个新的请求,而不是将接收到的响应传递给爬虫;
将响应传递给蜘蛛而不获取网页;
静默地丢弃一些请求。
更多信息请参见Downloader Middleware。
爬虫中间件¶
Spider中间件是位于引擎和Spider之间的特定钩子,能够处理Spider的输入(响应)和输出(项目和请求)。
如果需要,请使用Spider中间件
处理爬虫回调的输出 - 更改/添加/删除请求或项目;
后处理 start_requests;
处理爬虫异常;
根据响应内容,对某些请求调用errback而不是callback。
更多信息请参见 Spider Middleware。
事件驱动网络¶
Scrapy 是用 Twisted 编写的,这是一个流行的事件驱动网络框架,适用于 Python。因此,它是使用非阻塞(也称为异步)代码来实现并发的。
有关异步编程和Twisted的更多信息,请参见以下链接: