架构概览

本文档描述了 Scrapy 的架构及其组件如何交互。

概览

下图展示了 Scrapy 架构的概览,包括其组件以及系统内部数据流的轮廓(由红色箭头表示)。下面简要介绍了这些组件,并提供了指向其详细信息的链接。数据流也将在下面描述。

数据流

Scrapy architecture

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

  1. 引擎Spider 获取初始的待爬取请求。

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

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

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

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

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

  7. Spider 处理响应并向 引擎 返回抓取到的项目和新的请求(待跟进),返回过程会经过 Spider 中间件 (参见 process_spider_output())。

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

  9. 该过程重复(从第3步开始),直到 调度器 不再有新的请求为止。

组件

Scrapy 引擎

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

调度器

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

下载器

下载器负责抓取网页,并将其提供给引擎,引擎再将其提供给 Spider。

Spiders

Spiders 是 Scrapy 用户编写的自定义类,用于解析响应并从中提取 项目 或生成待跟进的额外请求。更多信息请参见 Spiders

项目管道

项目管道负责处理 Spider 提取(或抓取)到的项目。典型任务包括清洗、验证和持久化(如将项目存储到数据库中)。更多信息请参见 项目管道

下载器中间件

下载器中间件是介于引擎和下载器之间的特定钩子,用于处理从引擎传递到下载器的请求,以及从下载器传递回引擎的响应。

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

  • 在请求发送到下载器之前(即 Scrapy 将请求发送到网站之前)对其进行处理;

  • 在将收到的响应传递给 Spider 之前对其进行修改;

  • 发送一个新的请求,而不是将收到的响应传递给 Spider;

  • 无需抓取网页即可将响应传递给 Spider;

  • 悄悄地丢弃某些请求。

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

Spider 中间件

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

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

  • 对 Spider 回调的输出进行后处理 - 更改/添加/删除请求或项目;

  • 对起始请求或项目进行后处理;

  • 处理 Spider 异常;

  • 根据响应内容,对某些请求调用 errback 而不是 callback。

更多信息请参见 Spider 中间件

事件驱动网络

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

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