架构概述

本文档描述了 Scrapy 的架构及其组件之间的交互方式。

概述

下图显示了 Scrapy 架构的概述,包括其组件和系统内部发生的数据流轮廓(由红色箭头表示)。下面包含了组件的简要描述以及指向有关它们的更多详细信息的链接。数据流也在下面进行了描述。

数据流

Scrapy architecture

Scrapy 中的数据流由执行引擎控制,流程如下:

  1. 引擎爬虫 获取初始请求进行爬取。

  2. 引擎 将请求调度到 调度器 中,并请求下一个要爬取的请求。

  3. 调度器 将下一个请求返回给 引擎

  4. 引擎 将请求发送到 下载器,并经过 下载器中间件(参见 process_request())。

  5. 页面下载完成后,下载器 生成一个响应(包含该页面)并将其发送到引擎,并经过 下载器中间件(参见 process_response())。

  6. 引擎下载器 接收响应,并将其发送到 爬虫 进行处理,并经过 爬虫中间件(参见 process_spider_input())。

  7. 爬虫 处理响应,并将提取的项目和新的请求(待跟踪)返回给 引擎,并经过 爬虫中间件(参见 process_spider_output())。

  8. 引擎 将处理后的项目发送到 项目管道,然后将处理后的请求发送到 调度器,并请求可能的下一个要爬取的请求。

  9. 该过程重复(从步骤 3 开始),直到 调度器 中没有更多请求为止。

组件

Scrapy 引擎

引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。有关更多详细信息,请参见上面的 数据流 部分。

调度器

调度器 从引擎接收请求,并将它们排队以供稍后(也发送到引擎)在引擎请求时提供。

下载器

下载器负责获取网页并将它们提供给引擎,引擎再将它们提供给爬虫。

爬虫

爬虫是由 Scrapy 用户编写的自定义类,用于解析响应并从中提取 项目 或要跟踪的其他请求。有关更多信息,请参见 爬虫

项目管道

项目管道负责在爬虫提取(或抓取)项目后对其进行处理。典型任务包括清理、验证和持久化(例如将项目存储在数据库中)。有关更多信息,请参见 项目管道

下载器中间件

下载器中间件是位于引擎和下载器之间的特定钩子,当请求从引擎传递到下载器以及响应从下载器传递到引擎时,它们会处理这些请求和响应。

如果您需要执行以下操作之一,请使用下载器中间件:

  • 在请求发送到下载器之前处理它(即,在 Scrapy 将请求发送到网站之前);

  • 在将接收到的响应传递给爬虫之前更改它;

  • 发送新的请求而不是将接收到的响应传递给爬虫;

  • 在不获取网页的情况下将响应传递给爬虫;

  • 静默丢弃一些请求。

有关更多信息,请参见 下载器中间件

爬虫中间件

爬虫中间件是位于引擎和爬虫之间的特定钩子,能够处理爬虫输入(响应)和输出(项目和请求)。

如果您需要执行以下操作,请使用爬虫中间件:

  • 后处理爬虫回调的输出 - 更改/添加/删除请求或项目;

  • 后处理 start_requests;

  • 处理爬虫异常;

  • 根据响应内容为某些请求调用 errback 而不是回调。

有关更多信息,请参见 爬虫中间件

事件驱动的网络

Scrapy 使用 Twisted 编写,这是一个流行的 Python 事件驱动的网络框架。因此,它使用非阻塞(也称为异步)代码来实现并发。

有关异步编程和 Twisted 的更多信息,请参阅以下链接: