Je tente de planifier Scrapy en utilisant Celery et j'ai rencontré l'erreur commune ReactorNotRestartable. Ces discussions passées ont abordé cette erreur.
ReactorNotRestartable - Twisted et scrapy Scrapy - Reactor not Restartable
La bibliothèque que j'utilise nécessite twisted.internet.asyncioreactor.AsyncioSelectorReactor au lieu de celui par défaut. Si je suis les exemples, mon code s'arrête car le réacteur demandé ne correspond pas au réacteur en cours d'exécution. J'ai essayé de le modifier pour utiliser le bon réacteur, mais j'obtiens toujours la même exception de réacteur non conforme.
from scrapy.utils.log import configure_logging
from multiprocessing import Process, Queue
def run_spider(spider, domain=None, check=None):
def f(q):
try:
configure_logging()
runner = CrawlerRunner(get_project_settings())
deferred = runner.crawl(spider, domain=domain, check=check)
deferred.addBoth(lambda _: reactor.stop())
reactor = AsyncioSelectorReactor()
reactor.run()
q.put(None)
except Exception as e:
print("EXCEPTION!")
q.put(e)
q = Queue()
p = Process(target=f, args=(q,))
p.start()
result = q.get()
p.join()
if result is not None:
raise result
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/twisted/internet/defer.py", line 1697, in _inlineCallbacks
result = context.run(gen.send, result)
File "/code/scrapy_parsing/scripts/run_spider.py", line 203, in crawl
yield runner.crawl(spider)
File "/usr/local/lib/python3.10/site-packages/scrapy/crawler.py", line 232, in crawl
crawler = self.create_crawler(crawler_or_spidercls)
File "/usr/local/lib/python3.10/site-packages/scrapy/crawler.py", line 266, in create_crawler
return self._create_crawler(crawler_or_spidercls)
File "/usr/local/lib/python3.10/site-packages/scrapy/crawler.py", line 271, in _create_crawler
return Crawler(spidercls, self.settings)
File "/usr/local/lib/python3.10/site-packages/scrapy/crawler.py", line 103, in __init__
verify_installed_reactor(reactor_class)
File "/usr/local/lib/python3.10/site-packages/scrapy/utils/reactor.py", line 138, in verify_installed_reactor
raise Exception(msg)
Exception: Le réacteur installé (twisted.internet.epollreactor.EPollReactor) ne correspond pas à celui demandé (twisted.internet.asyncioreactor.AsyncioSelectorReactor)```