Erweiterter Crawler - Verwendung der Scrapy_splash-Komponente für automatisches JS-Rendering

Erweiterter Crawler - Verwendung der Scrapy_splash-Komponente für automatisches JS-Rendering

1. Was ist scrapy_splash?

scrapy_splash ist eine Komponente von scrapy

  • Das Laden von JS-Daten durch Scrapy-Splash basiert auf Splash.
  • Splash ist ein Javascript-Rendering-Dienst. Es handelt sich um einen leichtgewichtigen Browser, der die HTTP-API implementiert. Splash ist in Python und Lua implementiert und basiert auf Modulen wie Twisted und QT.
  • Die durch die Verwendung von Scrapy-Splash erhaltene Antwort entspricht dem Quellcode der Webseite, nachdem der Browser das Rendern abgeschlossen hat.

Offizielle Splash-Dokumentation https://splash.readthedocs.io/en/stable/

2. Die Rolle von scrapy_splash

Scrapy-Splash kann den Browser simulieren, um JS zu laden und die Daten zurückzugeben, nachdem JS ausgeführt wurde

3. Umgebungsinstallation von scrapy_splash

3.1 Verwenden des Splash-Docker-Image

Docker-Datei von Splash https://github.com/scrapinghub/splash/blob/master/Dockerfile

Es wird beobachtet, dass die Splash-Abhängigkeitsumgebung etwas komplizierter ist, sodass wir das Splash-Docker-Image direkt verwenden können

Wenn Sie das Docker-Image nicht verwenden, lesen Sie bitte die offizielle Splash-Dokumentation, um die entsprechende Abhängigkeitsumgebung zu installieren

3.1.1 Installieren und Starten des Docker-Dienstes

Installationsreferenz https://www.jb51.net/article/213611.htm

3.1.2 Splash-Image abrufen

Ziehen Sie das Splash-Image basierend auf der korrekten Installation von Docker

sudo docker pull scrapinghub/splash

3.1.3 Überprüfen Sie, ob die Installation erfolgreich war

Führen Sie den Splash-Docker-Dienst aus und greifen Sie über den Browser auf Port 8050 zu, um zu überprüfen, ob die Installation erfolgreich war

  • Im Frontend ausführen: sudo docker run -p 8050:8050 scrapinghub/splash
  • Im Hintergrund ausführen sudo docker run -d -p 8050:8050 scrapinghub/splash

Besuchen Sie http://127.0.0.1:8050 und sehen Sie sich den folgenden Screenshot an, der Erfolg bedeutet

Bildbeschreibung hier einfügen

3.1.4 Lösen Sie das Problem des Zeitlimits für die Bilderfassung: Ändern Sie die Docker-Bildquelle

Nehmen wir Ubuntu 18.04 als Beispiel

1. Erstellen und bearbeiten Sie die Docker-Konfigurationsdatei

sudo vi /etc/docker/daemon.json

2. Schreiben Sie die Spiegeladressenkonfiguration von inländischem Docker-cn.com, speichern und beenden Sie

{ 
"Registrierungsspiegel": ["https://registry.docker-cn.com"] 
}

3. Starten Sie den Computer oder den Docker-Dienst neu und beziehen Sie das Splash-Image erneut

4. Wenn es immer noch langsam ist, verwenden Sie bitte Ihren mobilen Hotspot (Daten orz)

3.1.5 Splash-Dienst deaktivieren

Sie müssen den Container zuerst schließen und dann löschen.

sudo docker ps -a
sudo docker stop CONTAINER_ID
sudo docker rm CONTAINER_ID

3.2 Installieren Sie das Scrapy-Splash-Paket in der virtuellen Python-Umgebung

pip installieren scrapy-splash

4. Splash in Scrapy verwenden

Nehmen wir Baidu als Beispiel

4.1 Projekt anlegen und Crawler erstellen

scrapy startprojekt test_splash
cd test_splash
Scrapy Genspider No_Splash Baidu.com
Scrapy Genspider mit_Splash Baidu.com

4.2 Verbessern Sie die Konfigurationsdatei settings.py

Fügen Sie der Datei settings.py eine Splash -Konfiguration hinzu und ändern Sie das Robots -Protokoll.

# Rendering-Dienst-URL
SPLASH_URL = "http://127.0.0.1:8050"
# Downloader-Middleware DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    „scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware“: 810,
}
# Deduplizierungsfilter DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
#Splashs HTTP-Cache verwenden HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

# Befolgen Sie die Robots.txt-Regeln
ROBOTSTXT_OBEY = Falsch

4.3 Kein Spritzen

Verbesserung in spiders/no_splash.py

Scrapy importieren

Klasse NoSplashSpider(scrapy.Spider):
    Name = "kein_Splash"
    erlaubte_Domänen = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=13161933309']

    def parse(selbst, Antwort):
        mit open('no_splash.html', 'w') als f:
            f.schreiben(Antwort.Body.decode())

4.4 Verwenden von Splash

Scrapy importieren
from scrapy_splash import SplashRequest # Verwenden Sie das Anforderungsobjekt, das vom Scrapy_splash-Paket bereitgestellt wird. Klasse WithSplashSpider(scrapy.Spider):
    Name = "mit_Splash"
    erlaubte_Domänen = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=13161933309']

    def start_requests(selbst):
        Ergebnis SplashRequest(self.start_urls[0],
                            Rückruf=self.parse_splash,
                            args={'wait': 10}, # Maximales Timeout, Einheit: Sekunden endpoint='render.html') # Feste Parameter des Splash-Dienstes verwenden def parse_splash(self, response):
        mit open('with_splash.html', 'w') als f:
            f.schreiben(Antwort.Body.decode())

4.5 Führen Sie zwei Crawler separat aus und beobachten Sie das Phänomen

4.5.1 Zwei Crawler separat ausführen

Scrapy Crawlen, kein Splash
Scrapy Crawl mit_Splash

4.5.2 Betrachten Sie die beiden erhaltenen HTML-Dateien

Kein Spritzen

Bildbeschreibung hier einfügen

Verwenden von Splash

Bildbeschreibung hier einfügen

4.6 Fazit

  • Splash ähnelt Selenium und kann wie ein Browser auf die URL-Adresse im Anforderungsobjekt zugreifen
  • Kann Anfragen entsprechend dem Antwortinhalt der entsprechenden URL der Reihe nach senden
  • Und rendern Sie den Inhalt mehrerer Antworten entsprechend mehreren Anfragen
  • Schließlich wird das gerenderte Antwortobjekt zurückgegeben.

5. Mehr erfahren

Über Splash https://www.jb51.net/article/219166.htm

Über Scrapy_splash (Screenshot, Get_Cookies usw.) https://www.e-learn.cn/content/qita/800748

6. Zusammenfassung

1. Die Rolle der Scrapy_Splash-Komponente

  • Splash ähnelt Selenium und kann wie ein Browser auf die URL-Adresse im Anforderungsobjekt zugreifen
  • Kann Anfragen entsprechend dem Antwortinhalt der entsprechenden URL der Reihe nach senden
  • Und rendern Sie den Inhalt mehrerer Antworten entsprechend mehreren Anfragen
  • Schließlich wird das gerenderte Antwortobjekt zurückgegeben.

2. Verwendung der Scrapy_Splash-Komponente

  • Erfordert Splash-Service als Unterstützung
  • Das erstellte Anforderungsobjekt wird zu splash.SplashRequest
  • Verwendung als Download-Middleware
  • Erfordert eine scrapy_splash-spezifische Konfiguration

3. Spezifische Konfiguration von Scrapy_Splash

SPLASH_URL = "http://127.0.0.1:8050"
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    „scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware“: 810,
}
DUPEFILTER_CLASS = "scrapy_splash.SplashAwareDupeFilter"
HTTPCACHE_STORAGE = "scrapy_splash.SplashAwareFSCacheStorage"

Dies ist das Ende dieses Artikels über erweiterte Crawler – die Verwendung der Scrapy_splash-Komponente für automatisches JS-Rendering. Weitere relevante Inhalte zur Verwendung der JS Scrapy_splash-Komponente finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der einfachen Verwendung von Scrapy-Splash

<<:  Tutorial zur Installation der komprimierten MySQL8-Paketversion unter Win10

>>:  Zwei Möglichkeiten zur Installation des Linux-Subsystems in Windows 10 (mit Bildern und Text)

Artikel empfehlen

Einführung in die Cloud-native-Technologie Kubernetes (K8S)

Inhaltsverzeichnis 01 Was ist Kubernetes? 02 Der ...

Implementierungsbeispiel für die Nginx-Zugriffskontrolle

Über Nginx, eine leistungsstarke, leichte Webserv...

Embed-Codes für mehrere ältere Player

Die Player, die wir auf Webseiten sehen, sind nic...

Beispiel für die Migration einer MySQL-Online-Protokollbibliothek

Ich möchte Ihnen von einem aktuellen Fall erzähle...

So ändern Sie den Benutzer und die Gruppe einer Datei in Linux

Wenn unter Linux eine Datei erstellt wird, ist de...

So fügen Sie Emoji-Ausdrücke in MySQL ein

Vorwort Als ich heute ein Feedback-Formular für e...

Docker-Installations- und Konfigurationsschritte für das Redis-Image

Inhaltsverzeichnis Vorwort Umfeld Installieren Er...

So importieren und exportieren Sie Docker-Images

Dieser Artikel stellt den Import und Export von D...

Implementierungscode für die nahtlose Verbindung des Div-Bildlaufbands

Code kopieren Der Code lautet wie folgt: <html...

Erläuterung synthetischer React-Ereignisse

Inhaltsverzeichnis Klicken Sie zunächst auf das E...

Beispielcode zum Erstellen von Desktop-Anwendungen mit Vue + Electron

1.vue-Verpackung Hier verwenden wir den Befehl „v...

MySQL-Lernnotizen zum Umgang mit doppelten Daten

MySQL verarbeitet doppelte Daten Einige MySQL-Tab...