Lzh on GitHub

Architecture 1.overview (架构概述)

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

Overview (概述)

下图显示了 Scrapy 架构的概述及其组件,以及系统中发生的数据流(由红色箭头表示)。下面简要介绍了这些组件,并提供了指向其详细信息的链接。数据流也在下面进行了描述。

Data flow (数据流)

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

  1. 引擎爬虫获取初始的待抓取请求。
  2. 引擎将请求调度到调度器中,并请求下一个待抓取请求。
  3. 调度器将下一个请求返回给引擎
  4. 引擎将请求发送给下载器,在此过程中会经过下载器中间件(参见 process_request())。
  5. 页面下载完成后,下载器生成一个响应(包含该页面),并将其发送给引擎,在此过程中会经过下载器中间件(参见 process_response())。
  6. 引擎下载器接收响应,并将其发送给爬虫进行处理,在此过程中会经过爬虫中间件(参见 process_spider_input())。
  7. 爬虫处理响应,并将抓取到的项目和新的待跟随请求返回给引擎,在此过程中会经过爬虫中间件(参见 process_spider_output())。
  8. 引擎将处理后的项目发送给项目管道,然后将处理后的请求发送给调度器,并请求可能的下一个待抓取请求。
  9. 此过程重复(从第 3 步开始),直到调度器中没有更多请求。

Components (组件)

Scrapy Engine (Scrapy 引擎)

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

Scheduler (调度器)

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

Downloader (下载器)

下载器负责抓取网页并将其提供给引擎,引擎又将其提供给爬虫。

Spiders (爬虫)

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

Item Pipeline (项目管道)

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

Downloader middlewares (下载器中间件)

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

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

  • 在请求发送到下载器之前(即在 Scrapy 将请求发送到网站之前)立即处理请求;
  • 在将接收到的响应传递给爬虫之前对其进行更改;
  • 发送新的请求而不是将接收到的响应传递给爬虫;
  • 在不抓取网页的情况下将响应传递给爬虫;
  • 静默丢弃某些请求。

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

Spider middlewares (爬虫中间件)

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

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

  • 对爬虫回调的输出进行后处理——更改/添加/删除请求或项目;
  • 对起始请求或项目进行后处理;
  • 处理爬虫异常;
  • 根据响应内容为某些请求调用 errback 而不是 callback。

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

Event-driven networking (事件驱动网络)

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

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