Wie man Java-Skript mit Scrapy ausführt
Mihai Maxim am 30. Januar 2023

Einführung
Willkommen in der aufregenden Welt des Dynamic Website Scraping! Wie Sie vielleicht aus unseren früheren Artikeln wissen, können diese Arten von Websites mit herkömmlichen Web-Scraping-Tools ein wenig schwierig zu navigieren sein. Aber keine Angst! Scrapy, der treue Web-Scraping-Assistent, unterstützt Sie mit einer Vielzahl von Plugins und Bibliotheken, die dynamisches Website-Scraping zu einem Kinderspiel machen.
In diesem Artikel werden wir einige der beliebtesten Optionen für das Scraping dieser JavaScript-gesteuerten Webseiten mit Scrapy vorstellen. Und um die Dinge noch einfacher zu machen, werden wir Beispiele für die Verwendung jeder einzelnen Option geben, damit Sie jede Website, die Ihnen über den Weg läuft, mit Zuversicht in Angriff nehmen können.
Wenn Sie neu in Scrapy sind, machen Sie sich keine Sorgen. In unserem Leitfaden finden Sie eine Einführung in das Webscraping mit Scrapy
Kopflose Browser?
Falls Sie mit Headless Browsern nicht vertraut sind, möchte ich Sie darüber aufklären. Im Wesentlichen handelt es sich dabei um Webbrowser, die ohne eine sichtbare Benutzeroberfläche arbeiten. Ja, ich weiß, es klingt seltsam, wenn man das Browserfenster nicht sieht, wenn man es benutzt. Aber glauben Sie mir, Headless-Browser können beim Web-Scraping eine echte Alternative sein.
Und das ist der Grund: Im Gegensatz zu normalen Browsern, die lediglich Webseiten anzeigen, können Headless-Browser JavaScript ausführen. Wenn Sie also versuchen, eine Website zu scrapen, deren Inhalt mit JavaScript generiert wird, kann ein Headless-Browser Ihnen dabei helfen, indem er das JavaScript ausführt und es Ihnen ermöglicht, den resultierenden HTML-Code zu scrapen.
Sondierung verschiedener Lösungen
Die beste Strategie für das Rendern von JavaScript mit Scrapy hängt von Ihren spezifischen Bedürfnissen und Ressourcen ab. Wenn Sie ein knappes Budget haben, sollten Sie eine Lösung wählen, die kostengünstig ist. Die Verwendung eines Headless-Browsers oder einer JavaScript-Rendering-Bibliothek könnte die kostengünstigste Option sein, aber Sie müssen immer noch mit der Möglichkeit von IP-Sperren und den Kosten für die Wartung und den Betrieb der Lösung rechnen.
Es ist immer am besten, einige verschiedene Optionen auszuprobieren und zu sehen, welche für Ihren Anwendungsfall am besten geeignet ist.
Wie man Javascript mit Scrapy unter Verwendung von Splash ausführt
Splash ist ein leichtgewichtiger, kopfloser Browser, der speziell für Web Scraping entwickelt wurde. Er basiert auf der WebKit-Engine, der gleichen Engine, die auch den Safari-Browser antreibt. Das Tolle an Splash ist, dass er einfach zu konfigurieren ist, besonders wenn Sie Docker verwenden. Außerdem ist es über die Middleware scrapy-splash mit Scrapy integriert.
Um die Middleware verwenden zu können, müssen Sie dieses Paket zunächst 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 (https://docs.docker.com/get-docker/) ausführen.
$ docker run -p 8050:8050 scrapinghub/splash
Danach sollten Sie in der Lage sein, auf die lokale Splash-Instanz unter http://localhost:8050/ zuzugreifen.

Splash verfügt über eine REST-API, die die Verwendung mit Scrapy oder einem anderen Web-Scraping-Tool erleichtert. Sie können den Server testen, indem Sie in der Scrapy-Shell eine Abrufanfrage stellen:
fetch('http://localhost:8050/render.html?url=<target_url>')
Um die Middleware zu konfigurieren, fügen Sie die folgenden Zeilen in Ihre Datei settings.py 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 Zeitspanne anzugeben, die Splash warten soll, bevor es Ihre Anfrage zurückgibt.
Ein möglicher Nachteil von Splash ist, dass es die Verwendung der Skriptsprache Lua erfordert, um Aktionen wie das Anklicken von Schaltflächen, das Ausfüllen von Formularen und das Navigieren auf Seiten durchzuführen.
Wie man Javascript mit Scrapy unter Verwendung von Selenium ausführt
Sie können Scrapy mit dem Selenium-Webdriver verwenden. Die Scrapy-Selenium-Middleware funktioniert, indem sie den Selenium-Webdriver in den Anfrageprozess injiziert, so dass das resultierende HTML an den Spider zum Parsen zurückgegeben wird.
Bevor Sie diese Lösung implementieren, ist es wichtig zu wissen, dass Sie einen Web-Treiber installieren müssen, um mit einem Browser zu interagieren. Zum Beispiel müssen Sie geckodriver installieren, um Firefox mit Selenium zu verwenden. Sobald Sie einen Webtreiber installiert haben, können Sie Selenium in den Einstellungen Ihres Scrapy-Projekts 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,
}
Dann 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 sich nicht um einen eigenständigen Headless-Browser handelt. Dies erschwert die Bereitstellung und Ausführung auf mehreren Rechnern oder in einer Cloud-Umgebung.
Wie man mit Scrapy Javascript mit WebScrapingApi ausführt
WebScrapingAPI bietet eine API, die alle schweren Aufgaben für Sie übernimmt. Sie kann JavaScript ausführen, Proxys rotieren und sogar CAPTCHAs handhaben, so dass Sie Websites mühelos scrapen können. Außerdem müssen Sie sich keine Sorgen machen, dass Ihre IP gesperrt wird, weil Sie zu viele Anfragen senden. Um Scrappy für die Arbeit mit WebScrapingAPI zu konfigurieren, werden wir eine Proxy-Middleware konfigurieren, die alle Fetch-Anfragen durch WSA tunneln wird.
Zu diesem Zweck wird Scrapy so konfiguriert, dass es sich mit dem WSA-Proxy-Server verbindet:
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 Sie die Middleware:
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.WSAProxyMiddleware': 1,
}
webscrapingapi.render_js=1 is the proxy authentication username, <API_KEY> the password.
Sie können einen kostenlosen API_KEY erhalten, indem Sie ein neues Konto auf https://www.webscrapingapi.com/ erstellen.
Durch die Angabe des Parameters render_js=1 aktivieren Sie die Fähigkeit von WebScrapingAPI, mit einem Headless-Browser auf die Zielseite 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 durchzuführen. Dies können Sie tun, indem Sie den Parameter js_instructions angeben:
js_instructions=[
{"action":"click","selector":"button#log-in-button"}
]
// this sequence could be used to click on a button
Und das war's, WSA wird nun automatisch alle Anfragen für Sie stellen.
Einpacken
Das Scraping von dynamischen Websites kann eine schwierige Aufgabe sein, aber mit den richtigen Tools wird sie viel leichter zu bewältigen. In diesem Artikel haben wir uns drei verschiedene Optionen für das Scraping dynamischer Websites mit Scrapy angesehen. Mit Headless Browsern wie Splash und Selenium können Sie JavaScript ausführen und Webseiten wie ein normaler Browser darstellen. 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 Ihnen die einfache Extraktion von Daten selbst aus den schwierigsten Websites. Egal, für welche Option Sie sich entscheiden, es ist wichtig, dass Sie Ihre spezifischen Bedürfnisse berücksichtigen und die Lösung wählen, die am besten zu Ihrem Projekt passt. Vielen Dank für die Lektüre und viel Spaß beim Scrapen!
Nachrichten und Aktualisierungen
Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Erforschen Sie den detaillierten Vergleich zwischen Scrapy und Selenium für Web Scraping. Von der Datenerfassung in großem Maßstab bis hin zum Umgang mit dynamischen Inhalten - entdecken Sie die Vor- und Nachteile sowie die einzigartigen Funktionen der beiden Frameworks. Erfahren Sie, wie Sie das beste Framework für die Anforderungen und den Umfang Ihres Projekts auswählen können.


Lernen Sie, wie Sie mit Scrapy und Splash dynamische JavaScript-gerenderte Websites scrapen können. Von der Installation über das Schreiben eines Spiders bis hin zum Umgang mit Seitenumbrüchen und der Verwaltung von Splash-Antworten bietet dieser umfassende Leitfaden Schritt-für-Schritt-Anleitungen für Anfänger und Experten gleichermaßen.


Erforschen Sie einen detaillierten Vergleich zwischen Scrapy und Beautiful Soup, zwei führenden Web-Scraping-Tools. Verstehen Sie ihre Funktionen, Vor- und Nachteile und entdecken Sie, wie sie zusammen verwendet werden können, um verschiedene Projektanforderungen zu erfüllen.
