est là une chance d'arrêter l'exploration si spécifique si la condition est vraie (comme scrap_item_id == predefine_value). Mon problème est similaire à Scrapy - how to identify already scraped urls mais je veux 'forcer' mon araignée scrapy pour arrêter d'explorer après avoir découvert le dernier objet gratté.Force mon araignée scrapy pour arrêter l'exploration
Répondre
Cette question a été posée il y a 8 mois mais je me demandais la même chose et j'ai trouvé une autre solution (pas géniale). Espérons que cela peut aider les futurs lecteurs. Je me connecte à une base de données dans mon fichier Pipeline, si la connexion à la base de données est infructueuse, je voulais que le Spider arrête d'explorer (il est inutile de collecter des données s'il n'y a aucun endroit où l'envoyer). Ce que je fini par faire utilisait:
from scrapy.project import crawler
crawler._signal_shutdown(9,0) #Run this if the cnxn fails.
Cela provoque l'araignée à faire ce qui suit:
[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown.
Je viens de genre de Pieced cela ensemble après avoir lu votre commentaire et en regardant à travers le «/usr/local/lib/python2.7/dist-packages/Scrapy-0.12.0.2543-py2.7.egg/scrapy/crawler.py "fichier. Je ne suis pas tout à fait sûr de ce qu'il fait, le premier nombre livré à la fonction est le nom (par exemple, en utilisant 3,0 au lieu de 9,0 renvoie l'erreur [scrapy] INFO: Received SIGKILL...
semble assez bien fonctionner.
EDIT: Je suppose aussi que vous pouvez simplement forcer votre programme à fermer avec quelque chose comme:
import sys
sys.exit("SHUT DOWN EVERYTHING!")
EDIT2. on dirait que quelqu'un a créé une extension pour arrêter l'araignée Cela peut être utile à quelqu'un: http://dev.scrapy.org/browser/scrapy/contrib/closespider.py
Merci d'avoir mentionné l'extension - en ce moment, c'est vraiment une bonne idée. Voici les docs: http://readthedocs.org/docs/scrapy/fr/0.12/topics/extensions.html#module-scrapy.contrib.closespider –
La chose que je n'aime pas à propos de l'extension Close Spider est qu'elle ne peut être que initié par quatre conditions (timeout, itempassed, pagecount, errorcount, autant que je sache). Ce qui serait bien si vous pouviez faire vos propres conditions pour fermer l'araignée, de sorte qu'il est fermé quand il y a une occurrence spécifique (par exemple, un certain mot est gratté). – alukach
le lien vers l'extension est en baisse – pinkvoid
Dans la dernière version de Scrapy, disponible sur GitHub, vous pouvez déclencher une exception CloseSpider pour fermer manuellement une araignée.
Dans le 0.14 release note doc est mentionné: "Ajouté CloseSpider exception à la main des araignées à proximité (de r2691)"
Exemple selon les docs:
def parse_page(self, response):
if 'Bandwidth exceeded' in response.body:
raise CloseSpider('bandwidth_exceeded')
Voir aussi: http://readthedocs.org/docs/scrapy/en/latest/topics/exceptions.html?highlight=closeSpider
Il réussit à forcer l'arrêt, mais pas rapide assez. Il permet toujours à certaines requêtes de s'exécuter. J'espère que Scrapy fournira une meilleure solution à l'avenir. –
De mes observations, il finit les demandes qui ont déjà été virées, non? –
Ok got it. .. Je suis assez sûr qu'il y a une meilleure solution, mais de scrapy.project importer crawler crawler.engine.close_spider (spider, 'closespider_blee') fonctionne – no1
Cette solution semble bien. Il est également utilisé dans la source scrapy (par exemple contrib/closespider.py) –