架构概述

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

概述

下图展示了Scrapy架构的概览,包括其组件以及系统内部发生的数据流概述(由红色箭头表示)。下面包含了组件的简要描述,并提供了关于它们的更详细信息的链接。数据流也在下面进行了描述。

数据流

Scrapy架构

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

  1. EngineSpider 获取初始的 Requests 进行爬取。

  2. EngineScheduler 中安排请求,并请求下一个要爬取的请求。

  3. Scheduler 返回下一个请求到 Engine

  4. Engine 将请求发送到 Downloader,经过 Downloader Middlewares(参见 process_request())。

  5. 一旦页面完成下载, Downloader 会生成一个响应(包含该页面)并将其发送到引擎,通过 Downloader Middlewares(参见 process_response())。

  6. Engine 接收来自 Downloader 的响应并将其发送到 Spider 进行处理,通过 Spider Middleware(参见 process_spider_input())。

  7. Spider 处理响应并返回抓取的项目和新的请求(用于后续操作)到 Engine,通过 Spider Middleware(参见 process_spider_output())。

  8. Engine 将处理后的项目发送到 Item Pipelines,然后将处理后的请求发送到 Scheduler 并请求可能的下一个请求 进行爬取。

  9. 该过程重复(从步骤3开始),直到没有来自 Scheduler的更多请求。

组件

Scrapy引擎

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

调度器

scheduler 接收来自引擎的请求,并将它们排队,以便在引擎请求时稍后(也向引擎)提供它们。

下载器

下载器负责获取网页并将其提供给引擎,引擎再将其提供给蜘蛛。

爬虫

蜘蛛是由Scrapy用户编写的自定义类,用于解析响应并从中提取items或额外的请求以继续跟踪。更多信息请参见Spiders

项目管道

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

下载器中间件

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

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

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

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

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

  • 将响应传递给蜘蛛而不获取网页;

  • 静默地丢弃一些请求。

更多信息请参见Downloader Middleware

爬虫中间件

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

如果需要,请使用Spider中间件

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

  • 后处理 start_requests;

  • 处理爬虫异常;

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

更多信息请参见 Spider Middleware

事件驱动网络

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

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