Близко к ответу Жоэля, но я хочу уточнить немного больше, чем это возможно в комментариях.Если вы посмотрите на исходный код Crawler , вы увидите, что класс CrawlerProcess
имеет функцию start
, а также функцию stop
.Эта функция stop
заботится о том, чтобы очистить внутреннюю часть сканирования, чтобы система оказалась в состоянии, из которого она может начать снова.
Итак, если вы хотите возобновить сканирование, не выходя из процессаПозвоните crawler.stop()
в соответствующее время.Позже, просто позвоните crawler.start()
снова, чтобы возобновить операции.
Edit: в ретроспективе, это невозможно (из-за закрученного реактора, как упомянуто в другом ответе);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