scrapy之源码解析
Posted lujiacheng-python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy之源码解析相关的知识,希望对你有一定的参考价值。
""" from twisted.internet import reactor #事件循环(终止条件。所有的socket都已经以移除) from twisted.internet import defer #defer.Deferred特殊的socket对象(不会发请求,手动移除) from twisted.web.client import getPage #socket对象(自动从事件循环移除) """ from scrapy.crawler import CrawlerProcess #scrapy源码分析 """ 1.爬虫运行的开始,自定义命令 2.spider_list包含爬虫的名字列表 spider_list = self.crawler_process.spiders.list() 3.from scrapy.crawler import CrawlerProcess 调用CrawlerProcess父类的CrawlerRunner的crawl方法, 返回一个Crawler类的对象 crawler = self.create_crawler(crawler_or_spidercls) return Crawler(spidercls, self.settings) 4.返回之后,调用_crawl,将对象Crawler放到_active集合, 在defer.DeferredList(self._active)里会转为列表 return self._crawl(crawler, *args, **kwargs) d = crawler.crawl(*args, **kwargs) self._active.add(d) 5.此时创建了Crawler.crawl方法,有@defer.inlineCallbacks装饰器 这个crawl就是添加事件循环,此时不会调用里面的yield, 在Crawler类 self.spider = self._create_spider(*args, **kwargs) self.engine = self._create_engine() start_requests = iter(self.spider.start_requests()) yield self.engine.open_spider(self.spider, start_requests) yield defer.maybeDeferred(self.engine.start) 6.在CrawlerProcess类中调用self.crawler_process.start() 先将_active中的Crawler对象加到defer.DeferredList(self._active) defer.DeferredList()这个函数监听事件循环是否完成,即爬虫 是否完成,完成后会调用dd.addBoth(done),在scrapy中用 _close=defer.Deferred() yield _close _close.callback(None) 来结束事件循环 然后会调用reactor.run()开始事件循环 7.回到5,此时会调用yield 即yield self.engine.open_spider(self.spider, start_requests) 然后加载爬虫的中间件 start_requests = yield self.scraper.spidermw.process_start_requests(start_requests, spider) 将爬虫放到调度器 yield scheduler.open(spider) 加载items yield self.scraper.open_spider(spider) 取得scheduler中的请求,进入下一个事件循环 slot.nextcall.schedule() 在调用yield defer.maybeDeferred(self.engine.start) 将defer.Deferred()加到事件循环中 自定义setting 1.SCHEDULER 2.DOWNLOADER """
由于本人知识有限,只看懂到这里,后续再更新。。。。。
以上是关于scrapy之源码解析的主要内容,如果未能解决你的问题,请参考以下文章