架构概览

本文档介绍了Scrapy架构及其组件之间的交互。

概述

接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示)。 下面对每个组件都做了简单介绍,并给出了详细内容的链接。 数据流如下所描述。

数据流(Data flow)

Scrapy architecture

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

  1. EngineSpider获取要爬取的初始Requests 。
  2. Engine调度在Scheduler中的Requests,并请求下一批要爬取的Requests。
  3. Scheduler返回下一批Requests给Engine
  4. Engine发送Requests给Downloader,并透过Downloader Middleware(Requests方向)。
  5. 一旦在页面完成下载, Downloader生成Response(该网页),并将其发送到Engine,并透过 Downloader Middleware(Response方向)。
  6. EngineDownloader收到Response,将它发送给Spider处理,其中透过Spider Middleware(输入方向)。
  7. Spider处理Response并返回爬取的Item和新的Request给Engine,其中透过Spider Middleware(输出方向)。
  8. Engine发送处理过的Item给Item Pipelines,然后发送处理过的Request给Scheduler并请求下批将要爬取的Requests。
  9. 这个过程不停重复(从第1步),直到Scheduler没有更多的Request 。

组件

Scrapy Engine

引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的Data Flow部分。

调度器(Scheduler)

调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。

下载器(Downloader)

下载器负责获取页面数据并提供给引擎,而后提供给spider。

Spiders

Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 更多内容请看 Spiders

Item Pipeline

Item Pipeline负责处理被spider提取出来的item。 典型的处理有清理、 验证及持久化(例如存取到数据库中)。 更多内容查看Item Pipeline

下载器中间件(Downloader middlewares)

下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。

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

  • process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
  • change received response before passing it to a spider;
  • send a new Request instead of passing received response to a spider;
  • pass response to a spider without fetching a web page;
  • silently drop some requests.

更多内容请看 下载器中间件(Downloader Middleware)

Spider中间件

Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。

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

  • 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.

更多内容请看 Spider中间件(Middleware)

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

Scrapy is written with Twisted, a popular event-driven networking framework for Python. 因此,Scrapy基于并发性考虑由非阻塞(即异步)的实现。

关于异步编程及Twisted更多的内容请查看下列链接: