scrapy作为一个流行的爬虫框架,其内嵌了twisted框架,导致很多习惯了同步编程的同学,很难了解其背后的整个设计意图和思想。因为twisted天生就是为异步而生,在scrapy和twisted一起出现的时候,为彻底掌握这个爬虫框架带来了极高的入门门槛。本文试图通过浅显易懂的语言,带大家一起领悟框架设计背后的思想和故事。
首先为大家呈现一个scrapy框架的全类图结构:
Scrapy.png
这个框架图最重要的类有三个,分别是:class CrawlerProcess(CrawlerRunner)/class CrawlerRunner(object)/class Crawler(object),其中CrawlerProcess是爬虫启动时候的入口类,该类持有twisted中reactor的引用,一旦reactor启动后,整个工程便开启了异步的多线程爬虫模式。重要的方法我已经标注在图中,如下图所示:
Scrapy-2.png
当reactor启动的时候,我们肯定会好奇,这个反应堆模式里面执行的到底是什么任务,这些任务是如何被添加进去的,背后的回调链是怎么样的,下面我们仔细探究这一过程。不过作为前提知识,我们要明白,reactor里面执行的一定都是defer类任务,因为需要异步执行的任务都是defer类型,如果能立即返回结果的话,我们也不需要用reactor模式来编程。
首先CrawlerProcess作为CrawlerRunner的子类,所以我们把注意力转向CrawlerRunner,在这里我们发现了一个defer对象和
网友评论