Scrapy框架结构和流程设计遵循网络爬虫的基本原理。通过组件封装不同的功能模块;通过请求和响应类封装数据流;通过引擎指挥整个系统协调运行。
理解了HTTP和爬虫的基本原理,就不难理解Scrapy的框架结构了。如图3-2所示为Scrapy的框架结构,包含了不同功能的组件、系统中发生的数据流及执行流程。
1.组件
下面简单介绍一下Scrapy框架结构中包含的组件。
·引擎(Engine)
引擎犹如总指挥,是整个系统的“大脑”,指挥其他组件协同工作。
·调度器(Scheduler)
调度器接收引擎发过来的请求,按照先后顺序,压入队列中,同时去除重复的请求。
·下载器(Downloader)
下载器用于下载网页内容,并将网页内容返回给爬虫(Scrapy下载器是建立在twisted这个高效的异步模型上的)。
·爬虫(Spiders)
爬虫作为最核心的组件,用于从特定的网页中提取需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
图3-2 Scrapy框架结构
·项目管道(Item Pipelines)
项目管道负责处理爬虫从网页中抽取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息等。
·下载器中间件(Downloader Middlewares)
下载器中间件介于引擎和下载器之间,主要处理Scrapy引擎与下载器之间的请求及响应。
·爬虫中间件(Spider Middlewares)
爬虫中间件介于引擎和爬虫之间,主要工作是处理爬虫的响应输入和请求输出。
2.数据流
Scrapy框架结构中传递和处理的数据主要有以下3种:
·向网站服务器发送的请求数据(请求的内容见2.1.3节);
·网站服务器返回的响应数据(响应的内容见2.1.4节);
·解析后的结构数据(类似于字典)。
Scrapy中定义的Request和Response类,用于保存请求和响应数据;Item类保存解析后的结构数据。它们分别对应于图3-2中标识的Requests、Response和Items。
下面从数据流的角度介绍Scrapy框架的执行流程。
图3-2中第①、②、③、④步,执行的是HTTP请求,传递和处理的是向网站服务器发送的请求数据。
第①步:爬虫(Spider)使用URL(要爬取页面的网址)构造一个请求(Request)对象,提交给引擎(Engine)。如果请求要伪装成浏览器,或者设置代理IP,可以先在爬虫中间件中设置,再发送给引擎。
第②步:引擎将请求安排给调度器,调度器根据请求的优先级确定执行顺序。
第③步:引擎从调度器获取即将要执行的请求。
第④步:引擎通过下载器中间件,将请求发送给下载器下载页面。
图3-2中第⑤、⑥、⑦、⑧步,执行的是HTTP响应,传递和处理的是网站服务器返回的响应数据。
第⑤步:页面完成下载后,下载器会生成一个响应(Response)对象并将其发送给引擎。下载后的数据会保存于响应对象中。
第⑥步:引擎接收来自下载器的响应对象后,通过爬虫中间件,将其发送给爬虫(Spider)进行处理。
第⑦步:爬虫将抽取到的一条数据实体(Item)和新的请求(如下一页的链接)发送给引擎。
第⑧步:引擎将从爬虫获取到的Item发送给项目管道(Item Pipelines),项目管道实现数据持久化等功能。同时将新的请求发送给调度器,再从第②步开始重复执行,直到调度器中没有更多的请求,引擎关闭该网站。