Scrapy ist ein effizientes Python-Webcrawler-Framework, mit dem Crawler-Programme schnell und flexibel geschrieben werden können. Bei der Verarbeitung großer Datenmengen oder komplexer Websites kann es jedoch bei eigenständigen Crawlern zu Leistungs- und Skalierbarkeitsproblemen kommen. Derzeit müssen verteilte Crawler eingesetzt werden, um die Effizienz des Daten-Crawlings zu verbessern. In diesem Artikel werden verteilte Crawler in Scrapy und Methoden zur Verbesserung der Daten-Crawling-Effizienz vorgestellt.
1. Was ist ein verteilter Crawler?
In der traditionellen Einzelmaschinen-Crawler-Architektur laufen alle Crawler auf derselben Maschine. Bei großen Datenmengen oder anspruchsvollen Crawling-Aufgaben ist die Maschinenleistung oft eingeschränkt. Verteilte Crawler verteilen Crawler-Aufgaben zur Verarbeitung auf mehrere Maschinen. Durch verteiltes Rechnen und Speichern wird die Belastung einer einzelnen Maschine reduziert, wodurch die Effizienz und Stabilität des Crawlers verbessert wird.
Verteilte Crawler in Scrapy werden normalerweise mithilfe des Open-Source-Distributed-Scheduling-Frameworks Distributed Scrapy (kurz DSC) implementiert. DSC verteilt Scrapy-Crawler-Programme zur parallelen Verarbeitung auf mehrere Maschinen und fasst die Ergebnisse einheitlich im zentralen Planungsknoten zusammen.
2. Wie implementiert man einen verteilten Crawler?
1. Installieren Sie Distributed Scrapy. Führen Sie den folgenden Befehl aus, um DSC zu installieren: Scrapy-Projekt:
Redis-Scheduler verwenden
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
Redis-Deduplizierungsstrategie verwenden
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
Redis-Datensätze nicht löschen, Sie können pausieren/erneut sume krabbeln
Legen Sie die Verbindungsparameter von Redis fest
from ..items import DouyuItem
# 爬虫名字 name = 'douyu' # redis-key,从redis中pop数据进行爬取 redis_key = 'douyu:start_urls' def parse(self, response): # scrapy爬虫代码
scrapy crawl douyu -s JOBDIR=job1
aus Scrapy.Crawler Import CrawlerRunner
aus Scrapy.utils.project Import get_project_settingsaus my_spider.spiders.my_spider Import MySpider
runner = CrawlerRunner(get_project_settings ())
@defer.inlineCallbacks
def crawl():yield runner.crawl(MySpider) reactor.stop()
reactor.run()
2. Reduzieren Sie die Priorität der Download-Middleware
Wenn Sie eine große Anzahl verarbeiten müssen oder Für komplexe Daten können Sie CONCURRENT_REQUESTS_PER_DOMAIN verwenden, um die Priorität des Herunterladens von Middleware zu reduzieren:
CONCURRENT_REQUESTS_PER_DOMAIN = 2
DOWNLOAD_DELAY = 0.5
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyCustomDownloaderMiddleware': 543,
CONCURRENT_REQUESTS gibt die maximale Anzahl von Anforderungen an, die jeder Domänenname gleichzeitig verarbeiten kann, und kann entsprechend der Maschinenkonfiguration und den Aufgabenanforderungen angemessen angepasst werden.
DOWNLOAD_DELAY stellt die Verzögerungszeit zwischen den einzelnen Anforderungen dar. Die Crawler-Effizienz kann durch Erhöhen der Verzögerung oder asynchrone Anforderungen verbessert werden.
Das obige ist der detaillierte Inhalt vonVerteilte Crawler in Scrapy und Methoden zur Verbesserung der Effizienz des Daten-Crawlings. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!