Scrapy框架介绍
scrapy作为一种可以轻易扩展为分布式的爬虫框架,其内部框架采用类似于消息队列的方式进行任务的调度分发也就不奇怪了,消息队列使得各组件低耦合。至于这个消息队列是存在于单机内存中还是分布式集群中的一个节点,就看业务的需要了。采用生产者-消费者模式进行组织的系统实际上就是三块:任务的生产者,消费者以及消息队列。对应框架图上:
生产者:Spiders
消费者:Downloader
消息队列:Scheduler以及Engine
各部分组件由Engine进行驱动,Engine可以看做是一个main函数吧。生产者生产任务(在这里就是要爬取的url)放到消息队列,消费者从消息队列中取得任务进行实际的下载。下载结果交给生产者进行解析,解析结果的一部分是我们要提取的信息,它直接进入Pipeline进行处理,另一部分则是从下载结果中提取的新的任务(url),它将进入消息队列中。整个流程是:
- (1)一开始Scheduler的队列是空的,所以需要人工hard code一个起始的种子url列表,spider将这些url封装成Request,Engine将这些Request转给Scheduler
- (2)与此同时,一旦Scheduler队列非空,Engine将从Scheduler中抽取一个Request给Downloader进行实际下载,Downloader的产出即Response由engine转给spider
- (3)Spider抽取Response里面两类信息:第一类就是页面上我们实际要爬取的内容Item,以及这个页面包含的符合要求的url列表。Item由Engine转入Item的深层加工流水线Pipeline,进行进一步的筛选、存储等, url由Spider封装为Request经由Engine交给Scheduler。重复(2)
框架图中engine和各组件交换Request和Response的过程中可以插入各种额外的流程,称之为中间件,所以不难想象一共有两种种中间件:Downloader middlewares(对应图中4,5)和 Spider middlewares(对应图中6,7)。除此之外,Item Pipeline中可以插入处理Item的各个步骤。