Das kommt der Antwort von Joël sehr nahe, aber ich möchte etwas ausführlicher werden, als es in den Kommentaren möglich ist. Wenn Sie sich die Crawler-Quellcode sehen Sie, dass die CrawlerProcess
Klasse hat eine start
sondern auch eine stop
Funktion. Diese stop
Funktion kümmert sich um die Bereinigung der Interna des Crawlings, so dass das System in einem Zustand endet, von dem aus es wieder starten kann.
Wenn Sie also das Crawling neu starten wollen, ohne Ihren Prozess zu verlassen, rufen Sie crawler.stop()
zu gegebener Zeit. Später rufen Sie einfach crawler.start()
um den Betrieb wieder aufzunehmen.
Editer : im Nachhinein ist dies nicht möglich (wegen des Twisted Reactors, wie in einer anderen Antwort erwähnt); die stop
sorgt einfach für einen sauberen Abschluss. Wenn ich auf meinen Code zurückblicke, habe ich zufällig einen Wrapper für die Crawler-Prozesse. Unten finden Sie einen (unkenntlich gemachten) Code, der das Multiprocessing-Modul von Python verwendet. Auf diese Weise können Sie Crawler leichter neu starten. (Anmerkung: Ich habe den Code letzten Monat online gefunden, aber ich habe die Quelle nicht angegeben... wenn also jemand weiß, woher er stammt, werde ich die Quellenangaben aktualisieren).
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