web-dev-qa-db-fra.com

Erreur ReactorNotRestartable dans la boucle while avec scrapy

J'ai l'erreur twisted.internet.error.ReactorNotRestartable lorsque j'exécute le code suivant:

from time import sleep
from scrapy import signals
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.xlib.pydispatch import dispatcher

result = None

def set_result(item):
    result = item

while True:
    process = CrawlerProcess(get_project_settings())
    dispatcher.connect(set_result, signals.item_scraped)

    process.crawl('my_spider')
    process.start()

    if result:
        break
    sleep(3)

Pour la première fois, cela fonctionne, alors je reçois une erreur. Je crée une variable process à chaque fois, alors quel est le problème?

10
k_wit

Par défaut, CrawlerProcess / s .start() arrêtera le réacteur Twisted créé une fois tous les robots d'exploration terminés.

Vous devez appeler process.start(stop_after_crawl=False) si vous créez process à chaque itération.

Une autre option consiste à manipuler vous-même le réacteur Twisted et à utiliser CrawlerRunner . Les docs ont un exemple en le faisant.

3
paul trmbrth

Il suffit d'utiliser la séquence:

process.crawl(...)
process.stop()
process.start()

sinon meilleur moyen. Cela semble étrange, mais cela a fonctionné de mon côté.

0
prosti