Scrapy - Réacteur pas de Redémarrage
avec:
from twisted.internet import reactor
from scrapy.crawler import CrawlerProcess
J'ai toujours couru ce processus avec succès:
process = CrawlerProcess(get_project_settings())
process.crawl(*args)
# the script will block here until the crawling is finished
process.start()
mais depuis que j'ai déplacé ce code dans un web_crawler(self)
fonction, comme suit:
def web_crawler(self):
# set up a crawler
process = CrawlerProcess(get_project_settings())
process.crawl(*args)
# the script will block here until the crawling is finished
process.start()
# (...)
return (result1, result2)
et a commencé à l'appel de la méthode à l'aide de l'instanciation de classe, comme:
def __call__(self):
results1 = test.web_crawler()[1]
results2 = test.web_crawler()[0]
et en cours d'exécution:
test()
J'obtiens l'erreur suivante:
Traceback (most recent call last):
File "test.py", line 573, in <module>
print (test())
File "test.py", line 530, in __call__
artists = test.web_crawler()
File "test.py", line 438, in web_crawler
process.start()
File "/Library/Python/2.7/site-packages/scrapy/crawler.py", line 280, in start
reactor.run(installSignalHandlers=False) # blocking call
File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1194, in run
self.startRunning(installSignalHandlers=installSignalHandlers)
File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1174, in startRunning
ReactorBase.startRunning(self)
File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 684, in startRunning
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
quel est le problème?
- Êtes-vous en cours d'exécution "web_crawler()" plus d'une fois par script? Vous ne pouvez pas démarrer tordue d'un réacteur plus d'une fois.
- non pas que je suis au courant de. ce que je suis en train de faire est de définir le robot d'exploration de la fonction en une fonction de classe, et l'exécution du processus avec un appel méthode. comme:
results
= test.web_crawler(). - J'ai édité la question, merci
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas redémarrer le réacteur, mais vous devriez être capable de l'exécuter plusieurs fois par bifurquer d'un processus distinct:
L'exécuter deux fois:
Résultat:
def parse(self, response):
etdef after_login(self, response):
AttributeError: 'PyDB' object has no attribute 'has_plugin_line_breaks
et unException ignored in: '_pydevd_frame_eval.pydevd_frame_evaluator_darwin_37_64.get_bytecode_while_frame_eval
mais il fonctionne encoreC'est ce qui a aidé pour moi de gagner la bataille contre ReactorNotRestartable erreur: dernière réponse de l'auteur de la question
0)
pip install crochet
1)
import from crochet import setup
2)
setup()
- en haut du fichier3) retirez les 2 lignes:
a)
d.addBoth(lambda _: reactor.stop())
b)
reactor.run()
J'ai eu le même problème avec cette erreur, et de passer plus de 4 heures pour résoudre ce problème, lisez toutes les questions à ce sujet. Enfin constaté que l'un - et de les partager. Voilà comment j'ai résolu ce problème. Le sens des lignes de Scrapy docs gauche sont les 2 dernières lignes dans mon code:
Ce code me permet de sélectionner ce que l'araignée à faire fonctionner juste avec son nom transmis à
run_spider
fonction et après la démolition de finitions - sélectionnez une autre araignée, et de l'exécuter à nouveau.Espérons que cela aidera quelqu'un, car il a pour moi 🙂
NameError: name 'import_module' is not defined
from importlib import import_module
module_name
variable?reactor.run()
méthode?reactor.run
. Essayez de mettre une impression à la fin de cette fonction - u voir?Que par la Scrapy documentation, le
start()
méthode de laCrawlerProcess
classe est le suivant:L'erreur que vous recevez est en train d'être levée par
Twisted
, car Tordue d'un réacteur ne peut pas être redémarré. Il utilise une tonne de variables globales, et même si vous n'jimmy-plate-forme une sorte de code de le redémarrer (je l'ai vu faire), il n'y a aucune garantie que cela va fonctionner.Honnêtement, si vous pensez que vous avez besoin de redémarrer le réacteur, vous êtes susceptible de faire quelque chose de mal.
En fonction de ce que vous voulez faire, je voudrais également en revue les L'exécution de Scrapy à partir d'un Script partie de la documentation, trop.
L'erreur dans ce code:
web_crawler()
retourne deux résultats, et à cette fin, il essaie de démarrer le processus deux fois, le redémarrage du Réacteur, comme indiqué par @Rejeté.l'obtention de résultats à l'exécution d'une procédure unique, et de stocker à la fois les résultats dans un tuple, est la voie à suivre ici:
Cela a résolu mon problème,mettre code ci-dessous après
reactor.run()
ouprocess.start()
:Que quelques personnes ont souligné déjà: Vous ne devriez pas avoir besoin de redémarrer le réacteur.
Idéalement si vous voulez à la chaîne de votre processus (crawl1 puis crawl2 puis crawl3) il suffit d'ajouter des rappels.
Par exemple, j'ai été en utilisant cette boucle d'araignée qui suit ce modèle:
Et c'est à quoi il ressemble dans scrapy:
Pour expliquer le processus de la
crawl
fonction des horaires d'une analyse et apporte deux rappels qui sont appelés lors de l'analyse: le blocage du sommeil et de l'appel récursif à lui-même (prévoir une autre analyse).