web-dev-qa-db-fra.com

CrawlerProcess vs CrawlerRunner

documentation Scrapy 1.x explique qu'il y a deux façons d'exécuter une araignée Scrapy à partir d'un script :

Quelle est la différence entre les deux? Quand dois-je utiliser "processus" et quand "coureur"?

25
alecxe

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.)

36
Rafael Almeida

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.

2
Adam Taylor