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)?
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