scrapy源码分析(一)架构(译)

来源:https://docs.scrapy.org/en/latest/topics/architecture.html#topics-architecture

架构概览

综述

下图展示了scrapy 架构的概要,包含其组件和系统中数据流的展示(红色箭头)。

数据流(data flow)

scrapy源码分析(一)架构(译)_第1张图片

scrapy中的数据流被其执行引擎execution engine)控制,运行原理如下:

  1. engineSpider处获取最初的请求(requests)给爬虫;
  2. engineScheduler调度器)中 安排请求,并向调度器询问下一个请求;
  3. Scheduler 返回下一个请求到 engine
  4. engine 发送请求到 Downloader下载器),中间会经过 Downloader Middlewares下载中间件),在这里可以对请求进行预处理;
  5. 一旦页面完成了下载,Downloader会生成该页面的一个响应(Response),同时会将Response传给engine,中途会经过Downloader Middlewares ,在这里我们可以对Response进行自定义的处理;
  6. engine接收到Response后,将它传给Spider进行处理,中途会经过Spider Middlewares ,同样,在这里我们可以加入自定义处理;
  7. Spider 处理了Response,并返回Items(放置从Response中获取的数据)和新的Requestsengine,中途会经过Spider Middlewares
  8. engine 发送处理过的ItemsItem Pipelines ,同时发送处理过的Requests 到 **Scheduler ** ,并向调度器询问下一个请求
  9. 整个过程循环,直到调度器中没有请求为止

组件(Components)

Scrapy Engine (爬取引擎)

引擎负责控制在所有组件中流动的数据流(data flow),而且当某些操作发生后会触发相应的事件,具体可以看上面的数据流图。

Scheduler (调度器)

调度器从引擎中接受请求,并将它们入队以供后面的输送(也输送到引擎)。

Downloader (下载器)

下载器负责获取网页,并将它们输送到引擎,引擎再交给spider。

Spiders (解析器)

解析部分由用户自定义,解析返回的响应(Response)以及从响应中抽取/组合Items,或者追加额外的请求链接用以继续采集。

Item Pipeline (数据管道)

一旦Item被spiders抽取了,就交由数据管道处理。在数据管道中,典型的任务包括:清洗,校验,数据持久化(例如存储在数据库)。

Downloader middlewares (下载器中间件)

下载器中间件是引擎和下载器之间特殊的钩子,当请求(requests)通过引擎到下载器之间时,处理请求;当响应(response)通过下载器到引擎之间时,处理响应。

若你希望做以下的事情,则应当使用下载器:

  1. 请求被送到下载器之前处理它;
  2. 响应被送往解析器前,处理它;
  3. 发送一个新的请求给解析器,而不是发送一个响应;
  4. 直接发送一个响应给解析器,而不用去获取页面
  5. 静默删除请求

Spider middlewares (解析器中间件)

解析器中间件是引擎和下载器之间特殊的钩子,可以处理解析器的输入(response)和输出(items/requests)

下列情况适宜使用:

  1. 后处理解析器回调的输出:改变/添加/删除 请求或者items;
  2. 后处理起始请求(start_requests);
  3. 处理解析器异常;
  4. 为一些基于响应内容的请求调用错误回调函数(errback)而不是回调函数

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

scrapy基于Twisted,它是一个python的事件驱动网络框架,为并发使用了非阻塞(异步)的代码。

你可能感兴趣的:(网络爬虫/搜索引擎)