下面给大家讲讲scrapy的架构以及他是如何进行工作的。
下图展示了scrapy的框架以及发生在系统里的数据流概述(以及用红色箭头标记)
- Scrapy数据流通过Engine控制,然后由下列顺序运行。
- Engine得到初始化的Requests请求并从Spider部件中爬取它
- Engine 在Scheduler中调度这些requests并请求爬取下一条Requests
- 这个Scheduler返回下一个Requests给Engine
- Engine把Requests发送给Downloader,通过Downloader Middlewares解析
- 一旦页面完成下载,Downloader生成一个Response并把这个Response发送到Engine,通过Spider Middlewares。
- Spider部件处理Response并且返回爬取下来的item和新的Requests给Engine,通过Spider Middleware解析。
- Engine发送处理过的item给Item Pipeline,然后发送处理过的Requests给Scheduler并且请求爬取可能的下一条Requests
- 整个流程从步骤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你需要满足下面的其中一个情况:
- 处理一个需要在Downloader之前需要处理的request
- 在Spider解析以前修改它的Response
- 发送一个新的请求而不是传递一个收到的Response给Spider
- 传递一个Response给Spider部件当没有取得一个网页的时候
- 丢弃掉一些requests
Spider middleware
Spider middleware 是一个设立在Engine和Spider之间的特殊部件,可以用来处理Spider部件的输入和输出。
使用Spider middleware部件,你需要做下面这些内容:
- 处理Spider部件回调的输入——修改,增加,移除request或者items
- 处理Spider部件后的start_request
- 处理Spider部件的异常
- 当一些requests是基于response的内容时候,调用errback而不是回调
事件驱动的网络
Scrapy是通过Twisted编写,Twisted是一个流行的python事情驱动网络框架。因此,它也实现了使用异步代码处理并发。