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

Implementierung des gemeinsamen Grid-Layouts

Keine Lücken auf beiden Seiten, Lücken zwischen j...

Die am häufigsten verwendeten HTML-Tags zum Erstellen von Webseiten

1. Optimierung häufig verwendeter HTML-Tags HTML ...

MySql legt die angegebenen Benutzerdatenbankansichtsabfrageberechtigungen fest

1. Neuen Benutzer anlegen: 1. Führen Sie eine SQL...

Detaillierte Erklärung zur Verwendung des MySQL-Sicherungsskripts mysqldump

In diesem Artikel wird das MySQL-Sicherungsskript...

SQL-Methode zum Berechnen der Zeitstempeldifferenz

SQL-Methode zum Berechnen der Zeitstempeldifferen...

Beschreibung der Standardtransaktionsisolationsebene von MySQL und Oracle

1. Transaktionsmerkmale (ACID) (1) Atomarität. Di...

Javascript-Grundlagen zu integrierten Objekten

Inhaltsverzeichnis 1. Einführung in integrierte O...

Zusammenfassung der Formulardesigntechniken im Webdesign

„Eingaben sollten in logische Gruppen unterteilt ...

React erhält den Eingabewert und übermittelt 2 Methodenbeispiele

Methode 1: Verwenden Sie das Zielereignisattribut...

Installations-Tutorial zur komprimierten Version von MySQL 8.0.11

In diesem Artikel finden Sie das Installations-Tu...

So fragen Sie ab, ob die MySQL-Tabelle gesperrt ist

Spezifische Methode: (Empfohlenes Tutorial: Lern-...