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. Das ist alles! Was du mit dieser Möglichkeit machst, liegt ganz bei dir.“
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('[!] Kein Ziel angegeben. Bitte geben Sie eine URL an.')
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 ausgeben
raw_data = scraper.extract_raw_data()
print(raw_data)
# Ein Element anhand seines Klassennamens extrahieren und ausgeben
single_element = scraper.extract_single_element('title', By.CLASS_NAME)
print(single_element.text)
# Alle Elemente eines bestimmten Tag-Typs extrahieren und ausgeben
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.




