下面给大家讲讲scrapy的架构以及他是如何进行工作的。

下图展示了scrapy的框架以及发生在系统里的数据流概述(以及用红色箭头标记)
image002.jpg

  1. Scrapy数据流通过Engine控制,然后由下列顺序运行。
  2. Engine得到初始化的Requests请求并从Spider部件中爬取它
  3. Engine 在Scheduler中调度这些requests并请求爬取下一条Requests
  4. 这个Scheduler返回下一个Requests给Engine
  5. Engine把Requests发送给Downloader,通过Downloader Middlewares解析
  6. 一旦页面完成下载,Downloader生成一个Response并把这个Response发送到Engine,通过Spider Middlewares。
  7. Spider部件处理Response并且返回爬取下来的item和新的Requests给Engine,通过Spider Middleware解析。
  8. Engine发送处理过的item给Item Pipeline,然后发送处理过的Requests给Scheduler并且请求爬取可能的下一条Requests
  9. 整个流程从步骤1开始重复,直到Scheduler没有Requests。

组件:
Scrapy Engine
这个engine的作用是控制系统中所有组件之间的数据流,然后当明确的事件发生时候出发事件。请结合上面的框架图以及数据流的描述进行详细的理解

Scheduler
Scheduler部件收到从Engine部件发来的Requests,然后把这些Requests压入队列,当Engine部件请求他们的时候把这些送到Engine。

Downloader
Downloader的职责是取得网页,并且把网页按顺序送到Engine和Spider

Spider
Spider部件是Scrapy 用户编写的自定义类用来解析Responses 和提取从Response中提取item,或者遵循其他的用户定义要求。

Item Pipeline
Item Pipeline的职责是处理items, 一旦他们被提取(extract),最典型的任务就是清洗,验证以及持久化(把他们存储在database中)

Donwloader middlewares
Donwloader middlewares是一个特殊的组件,设立在Engine和Downloader中间,用来处理在这两个部件之间的数据流,并且responses在Downloader到Engine的数据流。

使用Downloader middleware你需要满足下面的其中一个情况:

  1. 处理一个需要在Downloader之前需要处理的request
  2. 在Spider解析以前修改它的Response
  3. 发送一个新的请求而不是传递一个收到的Response给Spider
  4. 传递一个Response给Spider部件当没有取得一个网页的时候
  5. 丢弃掉一些requests

Spider middleware
Spider middleware 是一个设立在Engine和Spider之间的特殊部件,可以用来处理Spider部件的输入和输出。

使用Spider middleware部件,你需要做下面这些内容:

  1. 处理Spider部件回调的输入——修改,增加,移除request或者items
  2. 处理Spider部件后的start_request
  3. 处理Spider部件的异常
  4. 当一些requests是基于response的内容时候,调用errback而不是回调

事件驱动的网络
Scrapy是通过Twisted编写,Twisted是一个流行的python事情驱动网络框架。因此,它也实现了使用异步代码处理并发。

Last modification:April 13th, 2021 at 05:51 am