架构概览¶
本文档介绍了Scrapy架构及其组件之间的交互。
概述¶
接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示)。 下面对每个组件都做了简单介绍,并给出了详细内容的链接。 数据流如下所描述。
数据流(Data flow)¶
Scrapy中的数据流由执行引擎控制,其过程如下:
- Engine从 Spider获取要爬取的初始Requests 。
- Engine调度在Scheduler中的Requests,并请求下一批要爬取的Requests。
- Scheduler返回下一批Requests给Engine。
- Engine发送Requests给Downloader,并透过Downloader Middleware(Requests方向)。
- 一旦在页面完成下载, Downloader生成Response(该网页),并将其发送到Engine,并透过 Downloader Middleware(Response方向)。
- Engine从Downloader收到Response,将它发送给Spider处理,其中透过Spider Middleware(输入方向)。
- Spider处理Response并返回爬取的Item和新的Request给Engine,其中透过Spider Middleware(输出方向)。
- Engine发送处理过的Item给Item Pipelines,然后发送处理过的Request给Scheduler并请求下批将要爬取的Requests。
- 这个过程不停重复(从第1步),直到Scheduler没有更多的Request 。
组件¶
调度器(Scheduler)¶
调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
下载器(Downloader)¶
下载器负责获取页面数据并提供给引擎,而后提供给spider。
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) 。