diff --git a/scrapy/crawler.py b/scrapy/crawler.py index a1937f2bd..bdcfa9d0c 100644 --- a/scrapy/crawler.py +++ b/scrapy/crawler.py @@ -148,9 +148,7 @@ class CrawlerRunner(object): :param dict kwargs: keyword arguments to initialize the spider """ - crawler = crawler_or_spidercls - if not isinstance(crawler_or_spidercls, Crawler): - crawler = self._create_crawler(crawler_or_spidercls) + crawler = self.create_crawler(crawler_or_spidercls) return self._crawl(crawler, *args, **kwargs) def _crawl(self, crawler, *args, **kwargs): @@ -165,6 +163,21 @@ class CrawlerRunner(object): return d.addBoth(_done) + def create_crawler(self, crawler_or_spidercls): + """ + Return a :class:`~scrapy.crawler.Crawler` object. + + * If `crawler_or_spidercls` is a Crawler, it is returned as-is. + * If `crawler_or_spidercls` is a Spider subclass, a new Crawler + is constructed for it. + * If `crawler_or_spidercls` is a string, this function finds + a spider with this name in a Scrapy project (using spider loader), + then creates a Crawler instance for it. + """ + 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)