2015-03-04 23 views
6

Kann mir jemand erklären, wie die Pause/Fortsetzen-Funktion in Scrapy funktioniert?Wie funktioniert Scrapy pausieren/fortsetzen?

Die Version von scrapy, die ich verwende ist 0.24.5

Die documentation nicht viel Detail bietet.

Ich habe die folgende einfache Spinne:

class SampleSpider(Spider): 
name = 'sample' 

def start_requests(self): 
     yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1053') 
     yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1054') 
     yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1055') 

def parse(self, response): 
    with open('responses.txt', 'a') as f: 
     f.write(response.url + '\n') 

Ich laufe es mit:

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy import log, signals 


from scrapyproject.spiders.sample_spider import SampleSpider 
spider = SampleSpider() 
settings = get_project_settings() 
settings.set('JOBDIR', '/some/path/scrapy_cache') 
settings.set('DOWNLOAD_DELAY', 10) 
crawler = Crawler(settings) 
crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start() 
reactor.run() 

Wie Sie sehen können, aktivierte ich die Option JOBDIR so, dass ich den Zustand speichern kann mein Kriechen.

Ich setze DOWNLOAD_DELAY auf 10 seconds, damit ich die Spinne stoppen kann, bevor die Anfragen verarbeitet werden. Ich hätte erwartet, dass beim nächsten Mal, wenn ich die Spinne laufen lasse, die Anfragen nicht neu generiert werden. Das ist nicht der Fall.

Ich sehe in meinem scrapy_cache-Ordner einen Ordner namens requests.queue. Das ist jedoch immer leer.

Es sieht so aus, als ob die requests.seen Datei die ausgegebenen Anfragen speichert (unter Verwendung von SHA1 Hashes), was großartig ist. Wenn ich das Spider das nächste Mal ausführe, werden die Anforderungen neu generiert und die (doppelten) Hashes SHA1 werden der Datei hinzugefügt. Ich habe dieses Problem im Code Scrapy verfolgt und es sieht so aus, als ob die Datei RFPDupeFilter die Datei requests.seen mit einem 'a +' Flag öffnet. Es wird also immer die vorherigen Werte in der Datei verwerfen (zumindest ist das Verhalten auf meinem Mac OS X).

Schließlich, in Bezug auf Spider-Status, kann ich aus dem Scrapy Code sehen, dass der Spider-Zustand gespeichert wird, wenn die Spinne geschlossen ist und wird gelesen, wenn es geöffnet ist. Dies ist jedoch nicht sehr hilfreich, wenn eine Ausnahme auftritt (z. B. die Maschine wird heruntergefahren). Muss ich regelmäßig sparen?

Die Hauptfrage, die ich hier habe, ist: Was ist die gängige Praxis, Scrapy zu verwenden, während erwartet wird, dass der Crawl mehrere Male stoppen/fortsetzen wird (z. B. beim Crawlen einer sehr großen Website)?

+0

Es sieht aus wie Sie scrapy in einem Python-Skript ausgeführt werden. Können Sie den Reaktor/Scrapy regelmäßig stoppen? Nach meiner Erfahrung blockiert 'reactor.run()' immer das Skript, daher konnte ich 'reactor.stop()' nicht aufrufen. Ich dachte daran, Scrapy in einem anderen Thread auszuführen und ein Terminierungssignal an diesen Thread zu senden, aber ich habe es nicht versucht. – Hieu

Antwort

1

Re: Die Hauptfrage, die ich hier habe, ist: Was ist die übliche Praxis, Scrapy zu verwenden, während erwartet wird, dass der Crawl mehrere Male stoppt/fortsetzt (z. B. beim Crawlen einer sehr großen Website)?

Wenn Sie Scrapys Pause/Fortsetzen nicht verwenden möchten, können Sie Ihre Anfragen immer serialisieren. Ich gebe ein Beispiel unten:

Wenn Sie zuerst 10000 URLs crawlen und dann diese 10.000 URLs in einem neuen Crawler durch sequentielles Anfordern abkratzen, können Sie diese URLs basierend auf einigen Regeln einfach serialisieren und CSV in den Spider importieren:

file = open('your10000_urls.csv', 'r') 
data = csv.reader(file) 
urls = list(data) 
url = [''] 
for i in urls: 
    url.append(i[0]) 
start_urls = url[1:] 
file.close() 

Und dann können Sie diese Anfragen verfolgen, indem Sie die Anfragen löschen, die bereits angefordert wurden. Darüber hinaus möchten Sie möglicherweise Daten in einer Datenbank speichern, es macht das Leben viel einfacher.

Ich hoffe, es hilft.

4

für die Möglichkeit zu pausieren und die scrapy Suche wieder aufnehmen, können Sie diesen Befehl ausführen, um die Suche nach Start:

scrapy crawl somespider --set JOBDIR=crawl1 

für die Suche stoppen Sie die Kontrolle-C laufen sollte, aber man muss es einfach laufen Einmal und warten Sie, bis Scrapy stoppt. Wenn Sie control-C zweimal ausführen, funktioniert es nicht richtig.

dann können Sie Ihre Suche wieder aufnehmen, indem Sie diesen Befehl ausführen wieder:

scrapy crawl somespider --set JOBDIR=crawl1 
1

Die Version von scrapy, die ich benutze ist 1.1.0

Sie die richtige JOBDIR einstellen müssen settings.py

JOBDIR = 'PROJECT_DIR' 

nach Spinne stoping von control+c, können Sie die s laufen pider, um den Rest wieder zu kratzen.

Es sollte nach dieser Arbeit