CrawlerProcess主进程

它控制了twisted的reactor,也就是整个事件循环。它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor。
另外还控制了一些信号操作,使用户可以手动终止爬取任务。

此类在scrapy/crawler.py中定义,此模块有三个类:Crawler、CrawlerRunner和CrawlerProcess。
Crawler代表了一种爬取任务,里面使用一种spider,CrawlerProcess可以控制多个Crawler同时进行多种爬取任务。
CrawlerRunner是CrawlerProcess的父类,CrawlerProcess通过实现start方法来启动一个Twisted的reactor(另有shutdown信号处理、顶层logging功能)。

CrawlerProcess初始化

首先在命令行启动调用crawl()和start()运行之前,就已经建立了CrawlerProcess对象。

scrapy/crawler.py#CrawlerProcess:

class CrawlerProcess(CrawlerRunner):
    def __init__(self, settings=None, install_root_handler=True):
        super(CrawlerProcess, self).__init__(settings)
        install_shutdown_handlers(self._signal_shutdown)
        configure_logging(self.settings, install_root_handler)
        log_scrapy_info(self.settings)

初始化动作有:
1.使用settings初始化父类CrawlerRunner,只是定义了一些空变量。
2.注册shutdown信号。
3.配置顶层logging。

CrawlerProcess.crawl()创建Crawler对象

在运行前调用了crawl()方法。

scrapy/crawler.py#CrawlerRunner:

    def crawl(self, crawler_or_spidercls, *args, **kwargs):
        crawler = self.create_crawler(crawler_or_spidercls)
        return self._crawl(crawler, *args, **kwargs)

    def _crawl(self, crawler, *args, **kwargs):
        self.crawlers.add(crawler)
        d = crawler.crawl(*args, **kwargs)
        self._active.add(d)
        def _done(result):
            self.crawlers.discard(crawler)
            self._active.discard(d)
            return result
        return d.addBoth(_done)

    def create_crawler(self, crawler_or_spidercls):
        if isinstance(crawler_or_spidercls, Crawler):
            return crawler_or_spidercls
        return self._create_crawler(crawler_or_spidercls)

    def _create_crawler(self, spidercls):
        if isinstance(spidercls, six.string_types):
            spidercls = self.spider_loader.load(spidercls)
        return Crawler(spidercls, self.settings)
View Code

相关文章:

  • 2022-12-23
  • 2021-11-12
  • 2022-01-04
  • 2021-09-28
  • 2021-12-14
  • 2022-02-11
  • 2021-10-04
  • 2021-04-12
猜你喜欢
  • 2019-11-15
  • 2022-12-23
  • 2021-09-28
  • 2021-10-15
  • 2021-04-19
  • 2021-07-19
相关资源
相似解决方案