Zurück zum Blog
Anleitungen
Mihai MaximLast updated on Mar 31, 20265 min read

So führen Sie JavaScript mit Scrapy aus

So führen Sie JavaScript mit Scrapy aus

Einleitung

Willkommen in der spannenden Welt des Scrapings dynamischer Websites! Wie Sie vielleicht aus unseren früheren Artikeln wissen, kann die Navigation auf solchen Websites mit herkömmlichen Web-Scraping-Tools etwas knifflig sein. Aber keine Sorge! Scrapy, der zuverlässige Web-Scraping-Assistent, steht Ihnen mit einer Vielzahl von Plugins und Bibliotheken zur Seite, die das Scraping dynamischer Websites zum Kinderspiel machen.

In diesem Artikel tauchen wir in einige der beliebtesten Optionen ein, um diese JavaScript-basierten Websites mit Scrapy zu scrapen. Und um die Sache noch einfacher zu machen, zeigen wir dir Beispiele für die Verwendung der einzelnen Optionen, damit du jede Website, die dir begegnet, souverän bewältigen kannst.

Wenn du neu bei Scrapy bist, mach dir keine Sorgen. In unserem Leitfaden findest du eine Einführung in das Webscraping mit Scrapy

Headless-Browser?

Falls du mit Headless-Browsern nicht vertraut bist, lass mich dich aufklären. Im Wesentlichen handelt es sich dabei um Webbrowser, die ohne sichtbare Benutzeroberfläche arbeiten. Ja, ich weiß, es klingt seltsam, das Browserfenster nicht sehen zu können, während man es benutzt. Aber glaub mir, Headless-Browser können beim Web-Scraping ein echter Game-Changer sein.

Und zwar aus folgendem Grund: Im Gegensatz zu normalen Browsern, die lediglich Webseiten anzeigen, können Headless-Browser JavaScript ausführen. Das bedeutet: Wenn du versuchst, eine Website zu scrapen, die zur Generierung ihrer Inhalte auf JavaScript angewiesen ist, kann dir ein Headless-Browser helfen, indem er das JavaScript ausführt und es dir ermöglicht, den resultierenden HTML-Code zu scrapen.

Verschiedene Lösungen erkunden

Die beste Strategie für das Rendern von JavaScript mit Scrapy hängt von Ihren spezifischen Anforderungen und Ressourcen ab. Wenn Sie ein knappes Budget haben, sollten Sie eine kostengünstige Lösung wählen. Die Verwendung eines Headless-Browsers oder einer JavaScript-Rendering-Bibliothek ist vielleicht die günstigste Option, aber Sie müssen dennoch mit der Möglichkeit von IP-Sperren sowie den Kosten für die Wartung und den Betrieb der Lösung rechnen.

Es ist immer am besten, verschiedene Optionen auszuprobieren und zu prüfen, welche für Ihren Anwendungsfall am besten geeignet ist.

So führen Sie JavaScript mit Scrapy unter Verwendung von Splash aus

Splash ist ein schlanker, headless Browser, der speziell für das Web-Scraping entwickelt wurde. Er basiert auf der WebKit-Engine, derselben Engine, die auch den Safari-Browser antreibt. Das Tolle an Splash ist, dass es einfach zu konfigurieren ist, besonders wenn du Docker verwendest. Es ist zudem über die scrapy-splash-Middleware in Scrapy integriert.

Um die Middleware zu nutzen, müssen Sie zunächst dieses Paket mit pip installieren:

$ pip install scrapy-splash

Die Einrichtung von Splash mit Docker ist einfach. Sie müssen lediglich eine Instanz von Splash auf Ihrem lokalen Rechner mit Docker ausführen (https://docs.docker.com/get-docker/).

$ docker run -p 8050:8050 scrapinghub/splash

Danach sollten Sie auf die lokale Splash-Instanz unter http://localhost:8050/ zugreifen können

Splash verfügt über eine REST-API, die die Verwendung mit Scrapy oder jedem anderen Web-Scraping-Tool vereinfacht. Sie können den Server testen, indem Sie eine Fetch-Anfrage innerhalb der Scrapy-Shell stellen:

fetch('http://localhost:8050/render.html?url=<target_url>')

Um die Middleware zu konfigurieren, fügen Sie die folgenden Zeilen in Ihre settings.py-Datei ein.

SPLASH_URL = 'http://localhost:8050'

DOWNLOADER_MIDDLEWARES = {

    'scrapy_splash.SplashCookiesMiddleware': 723,

    'scrapy_splash.SplashMiddleware': 725,

    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,

}

SPIDER_MIDDLEWARES = {

    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,

}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

Besuchen Sie https://github.com/scrapy-plugins/scrapy-splash, um mehr über die einzelnen Einstellungen zu erfahren.

Der einfachste Weg, Anfragen mit Splash zu rendern, ist die Verwendung von `scrapy_splash.SplashRequest` in Ihrem Spider:

import scrapy

from scrapy_splash import SplashRequest

class RandomSpider(scrapy.Spider):

    name = 'random_spider'

    def start_requests(self):

        start_urls = [

        '<first_url',

        '<second_url>'

       ]

        for url in start_urls:

           yield SplashRequest(url=url, callback=self.parse, args={'wait': 5})

    def parse(self, response):

       

            result = response.css("h3::text").extract()

         

            yield result

Sie können einen „wait“-Parameter hinzufügen, um die Zeit anzugeben, die Splash warten soll, bevor Ihre Anfrage zurückgegeben wird.

Ein möglicher Nachteil der Verwendung von Splash ist, dass es die Verwendung der Skriptsprache Lua erfordert, um Aktionen wie das Klicken auf Schaltflächen, das Ausfüllen von Formularen und das Navigieren zu Seiten auszuführen.

So führen Sie JavaScript mit Scrapy unter Verwendung von Selenium aus

Sie können Scrapy mit dem Selenium-Webdriver verwenden. Die scrapy-selenium-Middleware fügt den Selenium-Webdriver in den Anfrageprozess ein, sodass das resultierende HTML an den Spider zur Analyse zurückgegeben wird.

Bevor Sie diese Lösung implementieren, sollten Sie beachten, dass Sie einen Webdriver installieren müssen, um mit einem Browser interagieren zu können. Um beispielsweise Firefox mit Selenium zu verwenden, müssen Sie geckodriver installieren. Sobald Sie einen Webdriver installiert haben, können Sie Selenium in Ihren Scrapy-Projekteinstellungen konfigurieren:

SELENIUM_DRIVER_NAME = 'firefox'

SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')

SELENIUM_DRIVER_ARGUMENTS=['-headless']  # '--headless' if using chrome instead of firefox

DOWNLOADER_MIDDLEWARES = {

    'scrapy_selenium.SeleniumMiddleware': 800

}

ITEM_PIPELINES = {

    'myproject.pipelines.SanitizePipeline': 1,

}

Anschließend können Sie Ihren Spider konfigurieren:

import scrapy

from scrapy_selenium import SeleniumRequest

class RandomSpider(scrapy.Spider):

    name = 'random_spider'

    def start_requests(self):

        start_urls = [

        '<first_url',

        '<second_url>'

       ]

        for url in start_urls:

            yield SeleniumRequest(url=url, callback=self.parse)

    def parse(self, response):

            print(response.request.meta['driver'].title)

            #The request will be handled by selenium, and the request will have an additional meta key, named driver containing the selenium driver with the request processed.

       

            result = response.selector.css("#result::text").extract()

            #The selector response attribute work as usual (but contains the  html processed by the selenium driver).

         

            yield result

Weitere Informationen zu den verfügbaren Treibermethoden und -attributen finden Sie in der Selenium-Python-Dokumentation:

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webdriver

Selenium erfordert die Installation eines Webbrowsers auf dem Rechner, auf dem es ausgeführt wird, da es kein eigenständiger Headless-Browser ist. Dies erschwert die Bereitstellung und Ausführung auf mehreren Rechnern oder in einer Cloud-Umgebung.

So führen Sie JavaScript mit Scrapy unter Verwendung von WebScrapingApi aus

WebScrapingAPI bietet eine API, die Ihnen die ganze Arbeit abnimmt. Sie kann JavaScript ausführen, Proxys rotieren und sogar CAPTCHAs verarbeiten, sodass Sie Websites mühelos scrapen können. Außerdem müssen Sie sich keine Sorgen machen, dass Ihre IP-Adresse wegen zu vieler Anfragen gesperrt wird. Um Scrapy für die Zusammenarbeit mit WebScrapingAPI zu konfigurieren, richten wir eine Proxy-Middleware ein, die alle Abrufanfragen über WSA tunnelt.

Dazu konfigurieren wir Scrapy so, dass es eine Verbindung zum WSA-Proxy-Server herstellt:

import base64

# add this to your middlewares.py file

class WSAProxyMiddleware:

    def process_request(self, request, spider):

        # Set the proxy for the request

        request.meta['proxy'] = "http://proxy.webscrapingapi.com:80"

        request.meta['verify'] = False

        # Set the proxy authentication for the request

        proxy_user_pass = "webscrapingapi.render_js=1:<API_KEY>"

        encoded_user_pass = base64.b64encode(proxy_user_pass.encode()).decode()

        request.headers['Proxy-Authorization'] = f'Basic {encoded_user_pass}'

Und aktivieren die Middleware:

DOWNLOADER_MIDDLEWARES = {

    'myproject.middlewares.WSAProxyMiddleware': 1,

}

webscrapingapi.render_js=1 ist der Benutzername für die Proxy-Authentifizierung, <API_KEY> das Passwort.

Sie können einen kostenlosen API_KEY erhalten, indem Sie ein neues Konto unter https://www.webscrapingapi.com/ erstellen

Durch die Angabe des Parameters render_js=1 aktivieren Sie die Fähigkeit von WebScrapingAPI, über einen Headless-Browser auf die Ziel-Webseite zuzugreifen, wodurch JavaScript-Seitenelemente gerendert werden können, bevor das endgültige Scraping-Ergebnis an Sie zurückgegeben wird.

Sie können WSA auch anweisen, bei der Verarbeitung Ihrer URL eine bestimmte Aktion auszuführen. Dies erreichen Sie durch Angabe des Parameters js_instructions:

js_instructions=[

{"action":"click","selector":"button#log-in-button"}

]

// Diese Sequenz könnte verwendet werden, um auf eine Schaltfläche zu klicken

Und das war’s schon – WSA führt nun automatisch alle Anfragen für Sie aus.

Zusammenfassung

Das Scraping dynamischer Websites kann eine schwierige Aufgabe sein, aber mit den richtigen Tools wird es viel einfacher. In diesem Artikel haben wir uns drei verschiedene Optionen für das Scraping dynamischer Websites mit Scrapy angesehen. Headless-Browser wie Splash und Selenium ermöglichen es Ihnen, JavaScript auszuführen und Webseiten genau wie ein normaler Browser darzustellen. Wenn Sie jedoch den einfachen Weg gehen möchten, kann die Verwendung einer API wie WebScrapingApi ebenfalls eine großartige Lösung sein. Sie übernimmt alle komplexen Aufgaben für Sie und ermöglicht es Ihnen, Daten selbst aus den schwierigsten Websites mühelos zu extrahieren. Egal, für welche Option Sie sich entscheiden, es ist wichtig, Ihre spezifischen Anforderungen zu berücksichtigen und die Lösung zu wählen, die am besten zu Ihrem Projekt passt. Vielen Dank fürs Lesen und viel Spaß beim Scraping!

Über den Autor
Mihai Maxim, Full-Stack-Entwickler @ WebScrapingAPI
Mihai MaximFull-Stack-Entwickler

Mihai Maxim ist Full-Stack-Entwickler bei WebScrapingAPI, wo er in verschiedenen Bereichen des Produkts mitwirkt und an der Entwicklung zuverlässiger Tools und Funktionen für die Plattform mitarbeitet.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.