2010-12-15 6 views
25

gibt es eine Chance, Crawlen zu stoppen, wenn spezifisch, wenn Bedingung wahr ist (wie scrap_item_id == predefine_value). Mein Problem ist ähnlich wie Scrapy - how to identify already scraped urls, aber ich möchte meine Scrapy Spinne "zwingen", mit dem Crawlen aufzuhören, nachdem Sie das letzte Objekt gefunden haben.Zwingen Sie meine Scrapy Spinne zu stoppen Crawlen

+2

Ok habe es. .. Ich bin mir ziemlich sicher, es gibt eine bessere Lösung, aber von scrapy.project Import-Crawler crawler.engine.close_spider (Spinne, 'clenspider_blee') funktioniert – no1

+0

Diese Lösung scheint in Ordnung zu sein. Es wird auch in der Scrapy-Quelle verwendet (z. B. contrib/clenspider.py) –

Antwort

7

Diese Frage wurde vor 8 Monaten gestellt, aber ich habe mich gleich gefragt und eine andere (nicht großartige) Lösung gefunden. Hoffentlich kann dies den zukünftigen Lesern helfen.

Ich verbinde mich mit einer Datenbank in meiner Pipeline-Datei, wenn die Datenbankverbindung nicht erfolgreich ist, wollte ich den Spider aufhören zu kriechen (kein Punkt in der Datenerfassung, wenn es nirgendwo zu senden). Was ich am Ende war dabei mit:

from scrapy.project import crawler 
crawler._signal_shutdown(9,0) #Run this if the cnxn fails. 

Dieser Spider bewirkt folgendes zu tun:

[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown. 

ich nur irgendwie pieced diese zusammen nach dem Lesen Ihre Kommentare und Blick durch das „/ usr/local/lib/python2.7/dist-Pakete/Scrapy-0.12.0.2543-py2.7.egg/scrapy/crawler.py "Datei. Ich bin mir nicht ganz sicher, was es tut, die erste Zahl, die an die Funktion geliefert wird, ist das Zeichen (zum Beispiel mit 3,0 anstelle von 9,0 Fehler [scrapy] INFO: Received SIGKILL...

scheint aber gut genug funktionieren. Happy Scraping.

EDIT: ich auch an, dass Sie nur Ihr Programm zwingen könnte, wie mit etwas herunterzufahren:

import sys 
sys.exit("SHUT DOWN EVERYTHING!") 

EDIT2. Sieht aus wie jemand eine Erweiterung geschaffen hat, um die Spinne zu stoppen Dies könnte nützlich sein, an jemanden: http://dev.scrapy.org/browser/scrapy/contrib/closespider.py

+2

Vielen Dank für die Erwähnung der Erweiterung - im Moment ist es wirklich ein langer Weg. Hier sind Dokumente: http://readthedocs.org/docs/scrapy/en/0.12/topics/extensions.html#module-scrapy.contrib.closespider –

+0

Was ich an der Close Spider-Erweiterung nicht mag ist, dass es nur sein kann initiiert von vier Bedingungen (Timeout, Itempassed, pagecount, errorcount; soweit ich weiß). Was wäre schön, wenn Sie Ihre eigenen Bedingungen schaffen könnten, um die Spinne zu schließen, so dass sie geschlossen ist, wenn es ein bestimmtes Ereignis gibt (zB ein bestimmtes Wort wird abgekratzt). – alukach

+3

der Link zu der Erweiterung ist – pinkvoid

27

In der neuesten Version von Scrapy, die auf GitHub verfügbar ist, können Sie eine CloseSpider-Ausnahme auslösen, um eine Spinne manuell zu schließen.

Im 0.14 release note doc wird erwähnt: "Added CloseSpider Ausnahme manuell schließen Spinnen (r2691)"

Beispiel gemäß der Dokumentation:

def parse_page(self, response): 
    if 'Bandwidth exceeded' in response.body: 
    raise CloseSpider('bandwidth_exceeded') 

Siehe auch: http://readthedocs.org/docs/scrapy/en/latest/topics/exceptions.html?highlight=closeSpider

+1

Es gelingt, zu zwingen, zu stoppen, aber nicht schnell genug. Es lässt immer noch einige Requests laufen. Ich hoffe, dass Scrapy in Zukunft eine bessere Lösung bietet. –

+0

Aus meinen Beobachtungen, es beendet die Anfragen, die bereits gefeuert wurden, nicht? –