一、前言
阅读本文的前提是你已经对scrapy有了基本的认识,或是已经使用scrapy写过数据抓取项目。
二、框架总体结构
scrapy框架由多个组件组合而成,要采集的数据经过网络响应后返回流过各个组件,经过一些处理(如格式校验,过滤去重,异常数据抛弃),最终保存到指定的文件或数据库中。
下面是scrapy data flow 图,大家应该不陌生吧。
scrapy的数据流由执行引擎控制,各个组件的运行也是有执行引擎调度驱动运行的。
(1)第1步,确定好我们要采集的网站后,我们会在start_urls或者start_requests方法中构造最初的数据抓取链接。执行引擎ENGINE通过读取SPIDERS模块的start_urls或start_requests方法的初始链接构造成request对象(网络请求对象)。
(2)第2步,request对象被引擎加入到SCHEDULER调度器的调度队列中,等待被调度。
(3)第3步,引擎获取一个request对象,并发起网络请求,在请求到达下载器之前,会先经过download middleware(下载器中间件),常见的下载器中间件有代理中间件,重试中间件,请求头中间件。下载中间件负责修改request对象(比如换个请求头,第4步)和处理response对象(比如将请求失败的request对象重新丢到调度器中等待下次的调度,第5步)。DOWNLOADER(下载器)就是负责发起请求并获取网站的响应。
(4)第6步,引擎获取网站的响应后,交给SPIDERS模块的回调函数去解析数据。第7步,然后引擎获取解析后的数据。第8步,引擎将数据交给ITEM PIPELINES模块处理数据,常见的处理有验证数据格式是否符合要求,数据是否重复,保存数据等。
以上。
最后,我们在阅读框架源码的时候也要注意经常去回顾数据流的流向,有助于加深对scrapy的理解。