Wie man einen Headless Browser mit Python für Web Scraping ausführt: Tipps und Tricks
Mihnea-Octavian Manolache am 03. Februar 2023

Die Verwendung eines Python-Browsers ohne Kopfhörer mit Selenium ist beim Web Scraping fast schon die Norm. Aber was ist eigentlich ein Headless-Browser? Und welcher ist der beste Headless-Browser für Selenium? Und warum sollte man überhaupt einen Headless-Browser in Python verwenden, wenn man `Requests` hat? Nun, es gibt eine Menge Fragen zu diesem Thema. Das bedeutet, dass wir gemeinsam eine Menge Antworten finden müssen. Aber bevor wir tiefer einsteigen, wollen wir ein paar Lernziele verfolgen. Am Ende dieses Artikels sollten Sie in der Lage sein,:
- Verstehen, was ein "Headless Browser" ist und welche Anwendungsfälle es gibt
- Wissen, wie man einen Headless-Browser in Python öffnet
- Erstellen eines Web Scrapers mit Python und Selenium
Und schließlich werden wir auch über Alternativen zu Python-Headless-Browsern sprechen. Auch wenn der Schwerpunkt auf Python liegt, ist es mein Ziel, die beste Scraping-Lösung zu finden. Und zwar unter Berücksichtigung der Antwortzeit, der verwendeten Ressourcen usw. Fangen wir also ohne Umschweife mit dem Thema an!
Was bedeutet Python headless browser?
Auf einer hohen Ebene ist ein Browser ein Computerprogramm, das es den Benutzern ermöglicht, auf einer Webseite zu navigieren und mit ihr zu interagieren. Ein Headless-Browser ist genau das, allerdings ohne grafische Benutzeroberfläche. Das bedeutet, dass ein Python-Browser ohne Kopfzeile ein Programm ist, das:
- Navigieren zu einer beliebigen Website im Internet
- Rendering von JavaScript-Dateien, die von der Website bereitgestellt werden
- Interaktion mit den Komponenten der Webseite
Die Tatsache, dass es keine grafische Benutzeroberfläche gibt, wirft einige Fragen zur Interaktion auf. Doch die Antwort ist ganz einfach. Da es keine grafische Benutzeroberfläche gibt, können Menschen nicht direkt mit der Seite interagieren. Und genau hier kommen die Webtreiber ins Spiel. Ein Webtreiber ist eine Schnittstelle, die Introspektion und Kontrolle ermöglicht. Einfach ausgedrückt, sind Webtreiber Frameworks, die es uns ermöglichen, verschiedene Webbrowser programmatisch zu steuern.
Es gibt eine Reihe von Frameworks, die eine Browser-Automatisierung in Python ermöglichen. Aber das wichtigste ist Selenium. Selenium ist eine Reihe von Tools, die in erster Linie für automatisierte Tests entwickelt wurden. In der Praxis wird es aber auch häufig für Web Scraping verwendet.
Warum einen Headless Browser in Python verwenden?
Laut der Kopfzeile der Selenium-Startseite:
"Selenium automatisiert Browser. That's it! Was Sie mit dieser Leistung machen, liegt ganz bei Ihnen."
Dies führt zu der Annahme, dass automatisierte Browser verschiedene Anwendungsfälle haben. Aber warum sollten sie im Headless-Modus laufen? Nun, die Antwort ist wieder einmal einfach. Ein Python-Browser ohne Kopfzeile verbraucht weniger Ressourcen (CPU und Speicher) als ein Browser mit Kopfzeile. Und das liegt vor allem daran, dass keine grafischen Elemente gezeichnet werden müssen.
Doch auch hier ist weniger immer noch mehr, wenn man es mit einem einfachen HTTP-Client wie z.B. Pythons `requests` vergleicht. Das liegt daran, dass der Headless-Browser immer noch viele Prozesse öffnet, um mit der Seite zu interagieren und JavaScript-Dateien darzustellen. Wie Sie wissen, ist `requests` nicht in der Lage, JavaScript zu rendern. Sie können damit nur rohes HTML abrufen. Und das reicht heutzutage für Web Scraping nicht einmal annähernd aus. Die meisten modernen Webplattformen verlassen sich stark auf JavaScript, um das DOM aufzufüllen. Wenn Sie z. B. versuchen, eine React-Anwendung zu scrapen, erhalten Sie eine leere Webseite, die Sie auffordert, JavaScript zu aktivieren:
<!doctype html>
<html lang="en">
<head>
...
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
</body>
</html>
Mit "Anfragen" geht das zwar nicht, aber mit einem Headless-Browser schon. Und damit ist eine unserer ersten Fragen beantwortet. Moderne Web-Scraper verwenden Headless-Browser anstelle von Anfragen, weil die Antwort sonst nicht schlüssig wäre.
Was sind die Nachteile eines Headless-Browsers?
Der größte Nachteil eines Python-Browsers ohne Kopfhörer (und fast aller automatisierten Browser) ist sein Fingerabdruck. Wenn Sie meine Artikel verfolgen, wissen Sie, dass ich manchmal von Stealthiness spreche. Das ist die Fähigkeit eines automatisierten Browsers, unentdeckt zu bleiben.
Und in Python sind Headless-Browser leicht zu erkennen. Durch die Überprüfung einer einfachen Browsereigenschaft wie `navigator.webdriver` lässt sich sofort feststellen, ob ein Browser von einem Webtreiber gesteuert wird. Beim Web-Scraping besteht eine der größten Herausforderungen darin, Wege zu finden, die Entdeckung zu vermeiden. Wir nennen diese Umgehungsmethoden oder -techniken. Mehr darüber können Sie hier lesen.
Bei Web Scraping API zum Beispiel arbeitet ein engagiertes Team ständig an unserem Stealth-Modus. Damit soll sichergestellt werden, dass der Fingerabdruck unseres Browsers bei jeder Anfrage einzigartig und unauffindbar ist.
Headless-Browser mit Python Selenium verfügbar
Zunächst einmal sollten Sie wissen, dass Selenium sehr leistungsfähig ist. Und es ist nicht einmal auf Python beschränkt. Es gibt Selenium-Clients und Web-Treiber für C#, Ruby, Java, Python und sogar JavaScript. Und die Unterstützung des Selenium-Web-Treibers ist noch beeindruckender. Er unterstützt alle wichtigen Browser:
In der Welt des Web Scraping sind die meistgenutzten Python-Browser ohne Kopfhörer Chrome und Firefox. Ich denke, das liegt vor allem daran, dass diese beiden Browser sowohl leistungsfähig als auch plattformübergreifend sind. Sie können Ihr Web-Scraping-Projekt zum Beispiel in einer MacOS-Umgebung entwickeln und es dann problemlos unter Linux einsetzen.
Wie man einen Headless-Browser in Python öffnet
Nachdem wir nun einige theoretische Konzepte behandelt haben, ist es sicher, dass wir uns dem praktischen Teil zuwenden können. In diesem Abschnitt zeige ich Ihnen, wie Sie einen Web Scraper mit Selenium erstellen können. Stellen Sie für dieses Projekt sicher, dass Ihr Rechner mit Python und Chrome ausgestattet ist.
#1: Einrichten der Umgebung
Wie üblich sollten wir in Python alles in einer virtuellen Umgebung kapseln. Wenn Sie mit virtuellen Umgebungen nicht vertraut sind, lesen Sie dies zuerst. Öffnen wir nun ein neues Terminalfenster und beginnen wir:
- Einen neuen Ordner erstellen
- Navigieren Sie zu dem Ordner
- Erstellen Sie eine neue virtuelle Umgebung
- Aktivieren der virtuellen Umgebung
~ mkdir headless_scraper
~ cd headless_scraper
~ python3 -m venv env
~ source env/bin/activate
#2: Abhängigkeiten installieren
Es ist ziemlich klar, dass wir Selenium und einen Web-Treiber für unser Projekt benötigen. Glücklicherweise können wir beides mit Pyhtons Paketmanager `pip` installieren. Geben Sie im gleichen Terminalfenster den folgenden Befehl ein:
~ pip install selenium webdriver-manager
Jetzt sind Sie für den Erfolg gerüstet! Wir können mit der eigentlichen Codierung beginnen. Kurzer Hinweis: Dieser Artikel konzentriert sich auf die Interaktion mit einem Headless-Browser. Eine vollständige Web-Scraping-Lösung erfordert viel mehr Aufwand. Aber ich bin sicher, wenn Sie unseren Blogbeiträgen folgen, können Sie das in kürzester Zeit schaffen.
#Nr. 3: Öffnen Sie einen automatischen Browser
Bis jetzt haben wir das Projekt, aber es gibt keine Datei, die wir ausführen können. Erstellen wir eine neue `.py`-Datei und öffnen sie in unserer IDE:
~ touch headles_scraper.py
~ code .
Sie sollten sich nun in Visual Studio Code oder Ihrer IDE befinden. Sie können damit beginnen, die notwendigen Pakete in "handle_scraper.py" zu importieren:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
Letzteres ist ein Paket, mit dem Sie Web-Treiber für die verschiedenen von Selenium unterstützten Browser einfach verwalten können. Sie können hier mehr darüber lesen. Als nächstes wollen wir einen neuen Browser mit Selenium erstellen und eine Website öffnen:
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://webscrapingapi.com')
Führen Sie diese Datei jetzt aus und Sie werden sehen, dass sie funktioniert. Aber statt eines Python-Browsers ohne Kopfzeile wird ein Chrome-Fenster mit Kopfzeile geöffnet:

#Nr. 4: Kopflos einrichten
Wir haben uns vorgenommen, einen ressourcenschonenden Web Scraper zu bauen. Idealerweise wollen wir also einen Headless-Browser mit Selenium öffnen. Glücklicherweise gibt es eine einfache Methode, mit der wir Selenium von Headful auf Headless umstellen können. Wir müssen nur die Optionen des Chrome-Web-Treibers verwenden. Importieren wir also `Options` und fügen wir zwei weitere Codezeilen hinzu:
...
from selenium.webdriver.chrome.options import Options
...
options = Options()
options.headless = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://webscrapingapi.com')
Führen Sie Ihr Skript erneut aus. Wie Sie sehen können, erscheint diesmal kein Fenster. Aber arbeitet es wirklich im Hintergrund? Eine schnelle Möglichkeit, dies zu überprüfen, besteht darin, mit Selenium einen Screenshot zu erstellen. Fügen Sie einfach diese Zeile am Ende Ihres Skripts ein:
driver.get_screenshot_as_file('headless.png')
Wenn alles gut gegangen ist, sollten Sie das gleiche Bild wie ich haben:

#5: Scraping-Funktionen hinzufügen
Was ist ein Web Scraper? Nun, im Grunde ist ein Web Scraper ein Programm, das einen Endpunkt auf einem Server aufruft und Daten von diesem sammelt. Bei Websites bestehen diese Daten normalerweise aus HTML-Dateien. Bestimmte Server bieten heutzutage aber auch JSON-Objekte an. Bleiben wir also bei diesem Begriff: Daten. Für den folgenden Abschnitt wollen wir unsere Ziele höher stecken. Lassen Sie uns etwas objektorientierte Programmierung anwenden! Unsere Ziele sind:
- Eine Scraper-Klasse erstellen
- Hinzufügen einer Methode zum Extrahieren von Rohdaten
- Hinzufügen einer Methode zum Extrahieren von Daten aus einem einzelnen Element
- Hinzufügen einer Methode zur Extraktion von Daten aus Elementen der gleichen Klasse
Wir haben also drei grundlegende Methoden, die wir aufbauen wollen. Doch zu Lernzwecken eröffnen diese drei Methoden nicht nur einen Weg zum Web Scraping, sondern auch zu OOP mit Python. Und das finde ich ziemlich cool! Entfernen wir nun alles, was wir kodiert haben, und fangen wir von vorne an:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
class Scraper:
def __init__(self, headless: bool = True) -> None:
self.headless = headless
pass
def setup_scraper(self) -> None:
self.options = Options()
self.options.headless = self.headless
self.driver = webdriver.Chrome(options=self.options)
def navigate(self, target) -> None:
self.driver.get(target) if target else print('[!] No target given. Please specify a URL.')
def extract_raw_data(self) -> str:
return self.driver.page_source
def extract_single_element(self, selector: str, selector_type: By = By.CSS_SELECTOR) -> WebElement:
return self.driver.find_element(selector_type, selector)
def extract_all_elements(self, selector: str, selector_type: By = By.CSS_SELECTOR) -> list[WebElement]:
return self.driver.find_elements(selector_type, selector)
Ich habe Typ-Anmerkungen hinzugefügt, um das Verständnis und nicht die Leistung zu verbessern. Auf diese Weise können Sie die Anwendung tatsächlich aus einer E/A-Perspektive visualisieren. Die Methoden sind im Grunde selbsterklärend. Wir führen keine Aktion mit den Daten durch, wir geben sie nur zurück. Wenn Sie möchten, kann dies ein Ausgangspunkt sein, um einen komplexen Scraper mit einem Python Headless Browser zu erstellen.
Bis jetzt hat das Ausführen der Datei nichts bewirkt. Das liegt daran, dass wir nur unseren Scraper und seine Methoden deklariert haben. Jetzt müssen wir sie auch benutzen. Fügen wir also die folgenden Codestücke hinzu:
# Einen neuen Scraper initialisieren und zu einem Ziel navigieren
scraper = Scraper()
scraper.setup_scraper()
scraper.navigate('https://httpbin.org')
# Das gesamte HTML-Dokument extrahieren und ausdrucken
raw_data = scraper.extract_raw_data()
print(raw_data)
# Ein Element nach seinem Klassennamen extrahieren und ausdrucken
single_element = scraper.extract_single_element('title', By.CLASS_NAME)
print(single_element.text)
# Extrahiert und druckt alle Elemente, die zu einem Tag-Typ gehören
all_elements = scraper.extract_all_elements('a', By.TAG_NAME)
print([el.get_attribute('href') for el in all_elements])
Und das war's. Wenn Sie Ihr Skript jetzt ausführen, können Sie sehen, dass etwas passiert. Auch hier handelt es sich lediglich um einen Prototyp, der Ihnen den Einstieg erleichtern soll. Wenn Sie mehr darüber erfahren möchten, wie ein Python-Browser ohne Kopfhörer für Web-Scraping verwendet werden kann, fordere ich Sie dazu auf:
- Lesen Sie die Selenium-Dokumentation
- Erweiterung des heute erstellten Skripts um weitere Funktionen
Auf diese Weise können Sie nicht nur Wissen erwerben, sondern auch ein Projekt in Ihr Portfolio aufnehmen.
Was sind die besten Alternativen zu Python Headless Browsern?
Python ist eine der beliebtesten Programmiersprachen zur Erstellung von Web-Scrapern. Aber es ist nicht die einzige Lösung. Es ist auch nicht die beste! In diesem Abschnitt werden wir Alternativen zu einem Python-Headless-Browser diskutieren. Wir beginnen mit der Frage, warum wir uns mit alternativen Lösungen befassen, und wir werden uns auch konkrete Beispiele ansehen.
Der Hauptgrund, warum Sie sich für eine Alternative zum Selbstbau eines Python-Web-Scrapers entscheiden sollten, sind die Ressourcen. Für eine vollständige Web-Scraping-Lösung müssen Sie ein IP-Rotationssystem implementieren, einige Umgehungstechniken anwenden und die Leistung berücksichtigen, um nur einige Beispiele zu nennen. Die Entwicklung eines Web Scrapers ist also nicht nur teuer, sondern auch zeitaufwändig. Ganz zu schweigen davon, dass die Wartung der Infrastruktur noch mehr Kosten verursacht.
Der zweite Nachteil des Python-Browsers ohne Kopfhörer hat mit der Leistung zu tun. Python ist zwar eine großartige und sehr benutzerfreundliche Sprache, aber sie ist nicht gerade für ihre Geschwindigkeit bekannt. Im Gegensatz zu Java zum Beispiel (für das es auch ein Selenium-Paket gibt) ist Python sowohl dynamisch typisiert als auch interpretiert. Diese beiden Merkmale machen Python im Vergleich zu anderen Sprachen sehr viel langsamer. Nachdem wir nun ein allgemeines Verständnis haben, lassen Sie uns konkret werden. Hier sind die 5 besten Alternativen zu Selenium und dem Python Headless Browser:
#1: Web Scraping API
Wenn Sie den ersten von uns genannten Nachteil beheben möchten, müssen Sie sich mit Drittanbietern für Scraping befassen. Und Web Scraping API bietet eine komplette Scraping-Suite. Außerdem ist unser Service vollgepackt mit Funktionen wie:
- IP-Rotationssystem für Rechenzentrums- und Privatkunden-Proxys
- Stealth-Modus
- Captcha-Löser
Diese drei Faktoren allein machen es für ein Ziel nahezu unmöglich, unseren Scraper einzuholen und zu blockieren. Und dann sind da noch die Scraping-Funktionen. Mit der Web Scraping API können Sie Daten anhand von Selektoren extrahieren, zwischen Gerätetypen wechseln, Screenshots erstellen und vieles mehr. Eine vollständige Liste der Funktionen finden Sie hier.
#2: Puppenspieler
Puppeteer ist das Äquivalent von Selenium für JavaScript. Es ist eine der am häufigsten verwendeten Bibliotheken für die Web-Automatisierung. Im Gegensatz zu Selenium ist der Standardstatus von Puppeteer headless. Sie müssen also nicht wirklich zusätzlichen Code hinzufügen, um es headless zu machen. Noch interessanter ist, dass es auch eine Implementierung der Puppeteer-API für Python gibt. In diesem Blog gehe ich ausführlich auf die Erstellung eines Web Scrapers mit Pyppeteer ein.
#3: Dramatiker
Playwright ist ein weiteres Web-Automatisierungstool, das von Microsoft-Mitarbeitern entwickelt wurde. Es ist vor allem deshalb so beliebt, weil es Unterstützung für verschiedene Sprachen und Plattformen bietet. Ihr Motto lautet eigentlich "Jeder Browser, jede Plattform". Auf ihre API kann auf jedem Betriebssystem und mit jeder der folgenden Sprachen zugegriffen werden:
Dies sind die wichtigsten Alternativen zu einem Python-Browser ohne Kopfhörer. Aber es gibt auch andere Tools. ZombieJS oder HtmlUnit sind nur zwei weitere aus einer Liste von vielen. Ich denke, die Wahl einer Technologie ist sowohl eine Frage der Leistung als auch der persönlichen Vorliebe. Ich ermutige Sie also, sie alle zu testen und Ihren Favoriten zu wählen.
Schlussfolgerungen
Die Verwendung eines Python-Browsers ohne Kopfhörer hat seine Vor- und Nachteile. Einerseits können Sie eine benutzerdefinierte Lösung erstellen, der Sie jederzeit weitere Funktionen hinzufügen können. Andererseits können Entwicklung und Wartung recht teuer sein. Und dann ist da noch das Problem der Unauffälligkeit. Wenn Sie eine professionelle Lösung benötigen, sollten Sie sich an einen Drittanbieter wenden. Andernfalls möchte ich Sie zu Lernzwecken immer dazu ermutigen, mit der Technologie herumzuspielen.
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

Sammeln Sie mühelos Echtzeitdaten von Suchmaschinen mit der SERP Scraping API. Verbessern Sie Marktanalysen, SEO und Themenforschung mit Leichtigkeit. Legen Sie noch heute los!


Entdecken Sie die Komplexität des Scrapens von Amazon-Produktdaten mit unserem ausführlichen Leitfaden. Von Best Practices und Tools wie der Amazon Scraper API bis hin zu rechtlichen Aspekten erfahren Sie, wie Sie Herausforderungen meistern, CAPTCHAs umgehen und effizient wertvolle Erkenntnisse gewinnen.


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.
