Wie man Java-Skript mit Scrapy ausführt

Mihai Maxim am 30. Januar 2023

blog-image

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.

blog-image

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

Vorschaubild
Wissenschaft des Web ScrapingScrapy vs. Selenium: Ein umfassender Leitfaden zur Auswahl des besten Web-Scraping-Tools

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.

WebscrapingAPI
Autorenavatar
WebscrapingAPI
14 Minuten lesen
Vorschaubild
LeitfädenScrapy Splash Tutorial: Die Kunst des Scrapings von JavaScript-gerenderten Websites mit Scrapy und Splash beherrschen

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.

Ștefan Răcila
Autorenavatar
Ștefan Răcila
6 Minuten lesen
Vorschaubild
LeitfädenScrapy vs. Beautiful Soup: Ein umfassender Vergleichsleitfaden für Web-Scraping-Tools

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.

WebscrapingAPI
Autorenavatar
WebscrapingAPI
10 Minuten lesen