接近Joël的答案,但我想在评论中详细说明.如果你查看Crawler源代码,你会发现CrawlerProcess
该类有一个start
,但也有一个stop
函数.此stop
功能负责清理爬行的内部,以便系统最终处于可以再次启动的状态.
因此,如果您想在不离开流程的情况下重新启动抓取,请crawler.stop()
在适当的时候致电.稍后,只需crawler.start()
再次呼叫即可恢复运营.
编辑:回想起来,这是不可能的(由于扭曲的反应堆,如不同答案中所述); 在stop
只需要一个干净终止的照顾.回顾我的代码,我碰巧有一个Crawler进程的包装器.下面你可以找到一些(编辑过的)代码,使它可以使用Python的多处理模块.通过这种方式,您可以更轻松地重新启动爬虫.(注意:我上个月在网上找到了代码,但是我没有包含源代码......所以如果有人知道它来自哪里,我会更新源代码的信用.)
from scrapy import project, signals from scrapy.conf import settings from scrapy.crawler import CrawlerProcess from scrapy.xlib.pydispatch import dispatcher from multiprocessing.queues import Queue from multiprocessing import Process class CrawlerWorker(Process): def __init__(self, spider, results): Process.__init__(self) self.results = results self.crawler = CrawlerProcess(settings) if not hasattr(project, 'crawler'): self.crawler.install() self.crawler.configure() self.items = [] self.spider = spider dispatcher.connect(self._item_passed, signals.item_passed) def _item_passed(self, item): self.items.append(item) def run(self): self.crawler.crawl(self.spider) self.crawler.start() self.crawler.stop() self.results.put(self.items) # The part below can be called as often as you want results = Queue() crawler = CrawlerWorker(MySpider(myArgs), results) crawler.start() for item in results.get(): pass # Do something with item