2017-08-13 2 views
0

Je cours en utilisant scrapy leur API interne et tout est bien et bien jusqu'à présent. Mais j'ai remarqué que ce n'est pas complètement en utilisant la concurrence de 16 comme mentionné dans les paramètres. J'ai changé le délai à 0 et tout ce que je peux faire d'autre. Mais ensuite, en regardant les requêtes HTTP envoyées, il est clair que ce scrapy ne télécharge pas exactement 16 sites à tout moment. A un certain moment, il ne télécharge que 3 à 4 liens. Et la file d'attente n'est pas vide à ce moment-là. Quand j'ai vérifié l'utilisation de base, ce que j'ai trouvé était que sur le noyau 2, l'un est 100% et l'autre est la plupart du temps inactif.Scrapy Utiliser à la fois le CORE dans le système

C'est à ce moment-là que je me suis rendu compte que la bibliothèque tordue au-dessus de laquelle scrapy est construit est à simple filetage et c'est pourquoi elle n'utilise qu'un seul noyau.

Y at-il une solution de contournement pour convaincre scrapy d'utiliser tout le noyau?

Répondre

0

Scrapy est basé sur le cadre torsadé. Twisted est un framework basé sur une boucle d'événements, donc il fait du traitement programmé et non du multiprocessing. C'est pourquoi votre analyse scrapy fonctionne sur un seul processus. Maintenant, vous pouvez commencer techniquement deux araignées utilisant le code ci-dessous

import scrapy 
from scrapy.crawler import CrawlerProcess 

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 

Et il n'y a rien qui vous empêche d'avoir la même classe pour les deux araignées. La méthode prend *args et **kwargs pour passer à votre araignée. Vous pouvez donc paramétrer vos araignées en utilisant cette approche. Disons que votre araignée est supposé ramper 100 pages, vous pouvez ajouter un paramètre start et end à votre classe de crawler et faire quelque chose comme ci-dessous

process.crawl(YourSpider, start=0, end=50) 
process.crawl(YourSpider, start=51, end=100) 

Notez que les deux robots d'exploration auront leurs propres paramètres, donc si vous Dans la plupart des cas, le raclage est moins sur le processeur et plus sur l'accès au réseau, qui est en fait non-bloquant en cas de torsion, donc je ne suis pas sûr que les 16 requêtes soient réglées pour votre araignée, alors les deux combinées auront effectivement 32. 321 cela vous donnerait un avantage énorme contre le réglage du CONCURRENT_REQUEST à 32 dans une seule araignée.

PS: Pensez à lire cette page pour comprendre plus https://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-process

0

Une autre option consiste à exécuter vos araignées en utilisant Scrapyd, ce qui vous permet d'exécuter plusieurs processus simultanément. Voir les options max_proc et max_proc_per_cpu dans le documentation. Si vous ne voulez pas résoudre votre problème par programme, cela pourrait être le chemin à parcourir.