2010-12-15 44 views
25

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

+2

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

+0

Cette solution semble bien. Il est également utilisé dans la source scrapy (par exemple contrib/closespider.py) –

Répondre

7

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

+2

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 –

+0

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

+3

le lien vers l'extension est en baisse – pinkvoid

27

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

+1

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

+0

De mes observations, il finit les demandes qui ont déjà été virées, non? –