Verteilte Crawler in Scrapy und Methoden zur Verbesserung der Effizienz des Daten-Crawlings

WBOY
Freigeben: 2023-06-22 21:25:49
Original
1374 Leute haben es durchsucht

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

SCHEDULER _PERSIST= True

Legen Sie die Verbindungsparameter von Redis fest

REDIS_HOST='localhost'

REDIS_PORT=6379

3. Schreiben Sie den Crawler-Code

Im Scrapy-Crawler-Programm müssen Sie die Art und Weise des Anfangs ändern Anfrage, verwenden Sie den Start von scrapy-redis Methode:

encoding:utf-8

import scrapy,re,json

from ..items import DouyuItem

from scrapy_redis.spiders import RedisSpider

class DouyuSpider(RedisSpider):

# 爬虫名字
name = 'douyu'
# redis-key,从redis中pop数据进行爬取
redis_key = 'douyu:start_urls'

def parse(self, response):
    # scrapy爬虫代码
Nach dem Login kopieren

4. Starten Sie den Redis-Dienst. Führen Sie den folgenden Befehl im Terminal aus, um den Redis-Server zu starten:

redis-server. 5. Starten Sie Distributed Scrapy. Geben Sie den folgenden Befehl im Terminal ein, um den DSC-Knoten zu starten

scrapy crawl douyu -s JOBDIR=job1

Unter diesen kann job1 ein benutzerdefinierter Name für DSC sein, um den Crawler-Status aufzuzeichnen.

3. Scrapy-Crawler optimieren

Scrapy bietet viele Methoden zur Optimierung der Crawler-Effizienz. Bei Verwendung mit verteilten Crawlern kann die Effizienz des Daten-Crawlings weiter verbessert werden.

1. Die Verwendung von CrawlerRunner

CrawlerRunner erfordert eine Twisted-Klasse, um die Anwendung zu erweitern. Im Vergleich zum einfachen Ausführen einer Python-Datei können Sie damit mehrere Crawler gleichzeitig im selben Prozess ausführen, ohne mehrere Prozesse oder mehrere Maschinen zu verwenden. Dies kann die Aufgabenverwaltung erleichtern.

Die Verwendung von CrawlerRunner ist wie folgt:

aus Twisted.internet Import Reactor,Defer

aus Scrapy.Crawler Import CrawlerRunner

aus Scrapy.utils.project Import get_project_settings

aus my_spider.spiders.my_spider Import MySpider

runner = CrawlerRunner(get_project_settings ())

@defer.inlineCallbacks

def crawl():

yield runner.crawl(MySpider)
reactor.stop()
Nach dem Login kopieren

crawl()

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,

}

3. Passen Sie CONCURRENT_REQUESTS und an DOWNLOAD_DELAY-Parameter


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.

4. Zusammenfassung

Der verteilte Crawler von Scrapy kann uns dabei helfen, große Datenmengen schnell zu verarbeiten und die Crawler-Effizienz zu verbessern. Gleichzeitig kann die Crawler-Effizienz weiter verbessert werden, indem die Priorität der Download-Middleware gesenkt, die Anzahl der Coroutinen angepasst und die Anforderungsverzögerung erhöht wird. Der verteilte Crawler ist eine der wichtigen Funktionen von Scrapy. Durch das Lernen können wir verschiedene Crawler-Aufgaben problemlos bewältigen.

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!