架构概览

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

概览

下图展示了 Scrapy 架构的概览及其组件,并概述了系统中发生的数据流(由红色箭头表示)。下方包含组件的简要描述,以及指向更详细信息的链接。数据流也在下方进行了描述。

数据流

Scrapy architecture

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

  1. 爬虫(Spider)引擎(Engine)获取初始请求(Requests)。

  2. 引擎(Engine)将请求(Requests)调度到调度器(Scheduler)中,并请求下一个待爬取的请求。

  3. 调度器(Scheduler)将下一个请求(Requests)返回给引擎(Engine)

  4. 引擎(Engine)通过下载器中间件(Downloader Middlewares)(参见 process_request())将请求(Requests)发送给下载器(Downloader)

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

  6. 引擎(Engine)接收从下载器(Downloader)发送来的响应(Response),并通过爬虫中间件(Spider Middleware)(参见 process_spider_input())将其发送给爬虫(Spider)进行处理。

  7. 爬虫(Spider)处理响应(Response),并通过爬虫中间件(Spider Middleware)(参见 process_spider_output())将提取的项目(items)和新的请求(Requests)(待跟随的)返回给引擎(Engine)

  8. 引擎(Engine)将处理后的项目(items)发送到项目管道(Item Pipelines),然后将处理后的请求(Requests)发送到调度器(Scheduler),并请求可能存在的下一个待爬取的请求。

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

组件

Scrapy 引擎

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

调度器

调度器(Scheduler)接收来自引擎的请求,并将它们排队,以便在引擎请求时后续(也发送给引擎)提供。

下载器

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

爬虫

爬虫(Spiders)是 Scrapy 用户编写的自定义类,用于解析响应并从中提取项目(items)或额外的待跟随请求。更多信息请参阅爬虫(Spiders)

项目管道

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

下载器中间件

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

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

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

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

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

  • 不抓取网页就将响应传递给爬虫;

  • 静默丢弃某些请求。

更多信息请参阅下载器中间件(Downloader Middleware)

爬虫中间件

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

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

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

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

  • 处理爬虫异常;

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

更多信息请参阅爬虫中间件(Spider Middleware)

事件驱动网络

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

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