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