框架体系

本文档描述了Scrapy框架的各部分之间是如何相互联系的。

综述

图示描述了Scrapy框架和它各组件,以及内部数据在系统内如何活动(通过红色箭头表示)。 下面是对这些组件的描述,以及它们更详细的信息的链接。同时也有关于数据流的描述。

Data flow

Scrapy architecture

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

  1. 引擎爬虫器 中获取爬虫的 初始请求对象(一个或者多个)。
  2. 引擎调度器 中调度请求对象并获取下一个要爬取的请求对象。
  3. 调度器 返回下一个请求对象给 引擎
  4. 引擎 通过 下载器中间件 (见 process_request())将请求对象传递给 下载器
  5. 一旦页面完成下载, 下载器 将生成一个响应对象(该页面的)然后通过 下载器中间件 传递给引擎(见 process_response())。
  6. 引擎下载器 获得响应对象后把它传递给 爬虫器 使用 爬虫器中间件 处理,(见 process_spider_input())。
  7. 爬虫器 使用 爬虫器中间件 处理响应对象然后返回 items和新的请求对象给 引擎 (见 process_spider_output())。
  8. 引擎, 然后将处理过的请求对象传递给 调度器 并获得后续要爬取的请求对象。
  9. 这个过程(从第一步)一直重复直到 调度器 中没有请求。

组件

Scrapy 引擎

引擎负责控制系统所有组件之间的数据流,当某些行为发生时触发事件。见 数据流 了解更多细节。

调度器

调度器从引擎中接收请求并给它们排序,以便于稍后引擎请求它们时将它们传给引擎。

下载器

下载器负责获取web页面并将它们传递给引擎,而引擎又将它们传递给爬虫器。

爬虫器

爬虫器是用户编写的爬虫类,用于解析响应并提取items或后续其他的请求,更多细节详见 爬虫器

Item 管道

Item管道负责处理爬虫器提取的items,典型的任务包括清理,验证和持久化(比如把item保存到数据库)。 更多细节详见 Item 管道

下载器中间件

下载器中间件是位于引擎和下载器之间的钩子,它处理从引擎到下载器的请求和响应。

如果你要做以下的事情,请用下载器中间件:

  • 在请求到下载器之前处理它; (如: 请求发送到网站之前);
  • 在响应传递到爬虫器之前改变它;
  • 发送一个新的请求,而不是将接收到的响应传递给爬虫器;
  • 在不获取网页的情况下将响应传递给爬虫器;
  • 默默地减少一些请求。

更多细节详见 下载器中间件.

爬虫器中间件

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

如果你要做以下的事情,请用爬虫器中间件:

  • post-process output of spider callbacks - change/add/remove requests or items;
  • post-process start_requests;
  • handle spider exceptions;
  • call errback instead of callback for some of the requests based on response content.

更多细节详见 爬虫器中间件.

事件驱动网络

Scrapy 是用 Twisted 写的, Twisted 是一个著名的Python事件驱动网络框架。因此, 它用非阻塞(即异步)方式实现并发。

更多关于异步编程和Twisted的信息请参考以下链接: