documentation Scrapy 1.x explique qu'il y a deux façons d'exécuter une araignée Scrapy à partir d'un script :
CrawlerProcess
CrawlerRunner
Quelle est la différence entre les deux? Quand dois-je utiliser "processus" et quand "coureur"?
La documentation de Scrapy fait un très mauvais travail en donnant des exemples sur les applications réelles des deux.
CrawlerProcess
suppose que la tremblante est la seule chose qui va utiliser le réacteur de twisted. Si vous utilisez des threads dans python pour exécuter un autre code, ce n'est pas toujours vrai. Prenons cela comme exemple.
from scrapy.crawler import CrawlerProcess
import scrapy
def notThreadSafe(x):
"""do something that isn't thread-safe"""
# ...
class MySpider1(scrapy.Spider):
# Your first spider definition
...
class MySpider2(scrapy.Spider):
# Your second spider definition
...
process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start() # the script will block here until all crawling jobs are finished
notThreadSafe(3) # it will get executed when the crawlers stop
Maintenant, comme vous pouvez le voir, la fonction ne sera exécutée que lorsque les robots d'exploration s'arrêteront, et si je veux que la fonction soit exécutée pendant que les robots d'exploration rampent dans le même réacteur?
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
import scrapy
def notThreadSafe(x):
"""do something that isn't thread-safe"""
# ...
class MySpider1(scrapy.Spider):
# Your first spider definition
...
class MySpider2(scrapy.Spider):
# Your second spider definition
...
runner = CrawlerRunner()
runner.crawl(MySpider1)
runner.crawl(MySpider2)
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.callFromThread(notThreadSafe, 3)
reactor.run() #it will run both crawlers and code inside the function
La classe Runner n'est pas limitée à cette fonctionnalité, vous voudrez peut-être certains paramètres personnalisés sur votre réacteur (différer, threads, getPage, rapport d'erreur personnalisé, etc.)
CrawlerRunner:
Cette classe ne devrait pas être nécessaire (puisque Scrapy est responsable de l’utiliser en conséquence) à moins d’écrire des scripts qui gèrent manuellement le processus d’exploration. Voir Exécuter Scrapy à partir d'un script pour un exemple.
CrawlerProcess:
Cet utilitaire devrait être mieux adapté que CrawlerRunner si vous n'exécutez pas un autre réacteur Twisted dans votre application.
Il semble que le CrawlerProcess soit ce que vous voulez, sauf si vous ajoutez vos robots d'exploration à une application Twisted existante.