From 6d13de4366636be7af1bc74aa8925d5e81ed8022 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 14 Nov 2011 20:03:43 -0200 Subject: [PATCH] fixed "No free spider slots" bug when calling fetch() from scrapy shell --- scrapy/shell.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/scrapy/shell.py b/scrapy/shell.py index 258c03ba6..3def28290 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -29,6 +29,7 @@ class Shell(object): self.crawler = crawler self.update_vars = update_vars or (lambda x: None) self.item_class = load_object(crawler.settings['DEFAULT_ITEM_CLASS']) + self.spider = None self.inthread = inthread self.code = code self.vars = {} @@ -57,15 +58,22 @@ class Shell(object): start_python_console(self.vars) def _schedule(self, request, spider): + spider = self._open_spider(request, spider) + d = request_deferred(request) + d.addCallback(lambda x: (x, spider)) + self.crawler.engine.crawl(request, spider) + return d + + def _open_spider(self, request, spider): + if self.spider: + return self.spider if spider is None: spider = create_spider_for_request(self.crawler.spiders, request, \ BaseSpider('default'), log_multiple=True) spider.set_crawler(self.crawler) self.crawler.engine.open_spider(spider, close_if_idle=False) - d = request_deferred(request) - d.addCallback(lambda x: (x, spider)) - self.crawler.engine.crawl(request, spider) - return d + self.spider = spider + return spider def fetch(self, request_or_url, spider=None): if isinstance(request_or_url, Request):