Selenium-User-Agent-Leitfaden: Einstellung und Änderung

Erfahren Sie, wie Sie den User-Agent-Header in Selenium einstellen und rotieren, um Ihre Web-Scraping-Funktionen zu verbessern und Anti-Bot-Maßnahmen zu umgehen.
11 min read
Selenium User Agent Guide Setting and Changing

In diesem Tutorial lernen Sie Folgendes:

  • Warum der User-Agent-Header so wichtig ist
  • Der Standard-Selenium-User-Agent-Wert in Headed- und Headless-Browsern
  • Wie Sie den User-Agent in Selenium ändern
  • Wie Sie die User-Agent-Rotation in Selenium implementieren

Legen wir los!  

Warum ist der User-Agent-Header wichtig?

Der User-Agent-Header ist ein String, der die Client-Software identifiziert, die die HTTP-Request ausführt. Er enthält in der Regel Informationen über den Browser- oder Anwendungstyp, das Betriebssystem und die Architektur, von der die Request stammt. Dies wird im Allgemeinen von Browsern, HTTP-Clients oder anderen Anwendungen festgelegt, die Web-Requests ausführen.

Unten finden Sie zum Beispiel den User-Agent, der von Chrome zum Zeitpunkt dieses Schreibens festgelegt wurde:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

Die Bestandteile dieses User-Agent-Strings sind:

  • Mozilla/5.0: Wurde in der Vergangenheit verwendet, um die Kompatibilität mit Mozilla-Browsern anzuzeigen. Es steht jetzt für ein Präfix, das aus Kompatibilitätsgründen hinzugefügt wurde.
  • Windows NT 10.0; Win64; x64: Betriebssystem (Windows NT 10.0), Plattform (Win64) und Architektur (x64).
  • AppleWebKit/537.36: Browser-Engine, auf die Chrome angewiesen ist.
  • KHTML, wie Gecko: Kompatibilität mit der von Mozilla verwendeten KHTML-Engine und der Gecko-Layout-Engine.
  • Chrome/125.0.0.0: Name und Version des Browsers.
  • Safari/537.36: Kompatibilität mit Safari.

Einfach ausgedrückt, der User-Agent identifiziert, ob die Request von einem bekannten Browser oder einer anderen Art von Software stammt.

Scraping-Bots und Browserautomatisierungsskripte verwenden in der Regel standardmäßige oder inkonsistente User-Agent-Strings. Diese zeigen ihren automatisierten Charakter in den Augen von Anti-Scraping-Lösungen, die Webseitendaten schützen, indem sie eingehende Requests überwachen. Anhand des User-Agent-Headers können sie feststellen, ob der aktuelle Benutzer legitim oder ein Bot ist.

Weitere Details finden Sie in unserem Leitfaden zu User-Agents für Web Scraping.

Was ist der Standard-Selenium-User-Agent?

Der User-Agent-Header, der von Selenium bei der HTTP-GET-Request zum Abrufen einer Webseite gesetzt wird, hängt vom kontrollierten Browser ab und davon, ob er sich im Header- oder Headless-Modus befindet. 

Hinweis: In diesem Artikel werden wir Selenium in Python verwenden und es so konfigurieren, dass es in Chrome funktioniert. Sie können das, was Sie hier lernen, jedoch problemlos auf verschiedene Programmiersprachen und Browser erweitern.

Um den Selenium-User-Agent-String zu sehen, erstellen Sie ein einfaches Browser-Automatisierungsskript, das die Seite httpbin.io /user-agent besucht. Dies ist nichts weiter als eine API, die den User-Agent-Header der eingehenden Request zurückgibt.

Importieren Sie Selenium, initialisieren Sie eine Chrome-Instanz, besuchen Sie die gewünschte Seite und drucken Sie ihren Inhalt aus:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

# enable headless mode in Selenium

options = Options()

# options.add_argument('--headless')

# initialize a Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

Starten Sie das obige Python-Skript und es meldet sich im Terminal etwa so an:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

Der Wert entspricht dem User-Agent-Header, der von Chrome zum Zeitpunkt des Schreibens festgelegt wurde. Das sollte Sie nicht überraschen, da Selenium in einem echten Browser-Fenster arbeitet.

Gleichzeitig ist Selenium normalerweise so konfiguriert, dass es Headless-Browser-Instanzen steuert. Der Grund dafür ist, dass das Laden der Benutzeroberfläche eines Browsers viele Ressourcen in Anspruch nimmt und in der Produktion keinen Vorteil bringt. Entkommentieren Sie also die Option --headless, um das Skript im Headless-Modus auszuführen. Dieses Mal wird das Ergebnis wie folgt sein:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/125.0.6422.142 Safari/537.36"

}

Wie Sie sehen können, wurde Chrome/125.0.0.0 durch HeadlessChrome/125.0.6422.142 ersetzt. Dieser Wert identifiziert eindeutig, dass die Request von einem Browser-Automatisierungstool stammt, da kein menschlicher Benutzer jemals einen Headless-Browser verwenden würde. Die Folge ist, dass Anti-Bot-Systeme eine solche Request als von einem Bot stammend markieren und blockieren können. Deshalb ist es so wichtig, den Selenium-User-Agent-Wert festzulegen!

Weitere Informationen finden Sie in unserem Leitfaden zu Selenium-Web-Scraping..

So ändern Sie den User-Agent in Selenium

Selenium bietet zwei Möglichkeiten, den User-Agent-Wert festzulegen. Schauen wir uns beide an!

User-Agent global einstellen

Zu den von Chrome unterstützten Optionen gehört auch das Flag --user-agent. Damit können Sie den globalen User-Agent festlegen, den der Chrome-Prozess verwenden soll, wenn er Webseiten in seinen Registerkarten oder Fenstern besucht.

Stellen Sie einen globalen User-Agent in Selenium mit Python wie folgt ein:

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# other options...

# initialize a Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

Bringen Sie alles zusammen und überprüfen Sie, ob es mit dem folgenden Skript funktioniert:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

Starten Sie nun das Skript und es wird Folgendes drucken:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

Dies entspricht dem in dem String custom_user_agent angegebenen User-Agent. Insbesondere der über Selenium gesteuerte Browser zeigt jetzt den User-Agent-Wert eines Headless-Browsers an, auch wenn er sich im Headless-Modus befindet. Dieser Trick sollte ausreichen, um weniger komplexe Anti-Bot-Lösungen auszutricksen.

Der Hauptnachteil dieses Ansatzes besteht darin, dass Sie das Flag --user-agent nur einmal setzen können, während der Einrichtung der Browser-Instanz. Einmal festgelegt, wird der benutzerdefinierte User-Agent während der gesamten Browser-Sitzung verwendet. Es besteht keine Möglichkeit, ihn vor einem get()-Aufruf im Handumdrehen zu ändern.

User-Agent lokal einstellen

Mit den Befehlen des Chrome Devtools Protocol  (CDP) können Sie mit einem laufenden Chrome-Browser kommunizieren. Insbesondere bieten sie Ihnen die Möglichkeit, vom Browser festgelegte Standardwerte und Konfigurationen dynamisch zu ändern.

Sie können einen CDP-Befehl in Selenium ausführen, indem Sie die execute_cdp_cmd()-Methode verwenden, die vom driver-Objekt verfügbar gemacht wird. Insbesondere überschreibt der CDP-Befehl Network.setUserAgentOverride den User-Agent mit dem angegebenen String. Verwenden Sie ihn, um den User-Agent in Selenium wie folgt lokal zu ändern:

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

Stellen Sie sicher, dass Sie mit diesem Ansatz den User-Agent innerhalb derselben Browser-Sitzung mehrmals mit der folgenden Logik aktualisieren können:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# configure a custom user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# set another user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# reload the page

driver.refresh()

# print the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

Starten Sie das obige Skript und es wird Folgendes erzeugen:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

}

Fantastisch! Zwei verschiedene Selenium-User-Agent-Strings innerhalb derselben Browser-Sitzung.

Implementieren Sie die User-Agent-Rotation in Selenium

Einen Nicht-Headless-User-Agent-Header einzustellen, reicht möglicherweise nicht aus, um Anti-Bots zu überwinden. Das Problem ist, dass zu viele Requests, die von derselben IP-Adresse und mit denselben Headern kommen, wahrscheinlich die automatisierte Natur Ihres Selenium-Skripts enthüllen. 

Der Schlüssel zur Vermeidung der Bot-Erkennung besteht darin, Ihre Requests nach dem Zufallsprinzip zu sortieren, z. B. indem Sie die User-Agent-Rotation implementieren. Die Idee hinter diesem Ansatz besteht darin, einen User-Agent nach dem Zufallsprinzip auszuwählen, bevor Sie zu einer Seite in Selenium navigieren. Auf diese Weise werden Ihre automatisierten Requests so aussehen, als kämen sie von verschiedenen Browsern, was das Risiko verringert, dass Blockierungen und Sperren ausgelöst werden.

Folgen Sie nun den folgenden Schritten und erfahren Sie, wie Sie die User-Agent-Rotation in Selenium implementieren!

Schritt Nr. 1: Rufen Sie eine Liste von User-Agents ab.

Holen Sie sich einige geeignete User-Agents von einem Portal wie User Agent String.com und speichern Sie sie wie folgt in einem Python-Array:

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

    # other user agents...

]

Schritt Nr. 2: Extrahieren Sie einen Random-User-Agent.

Definieren Sie eine benutzerdefinierte Funktion, um den Random-User-Agent für das Selenium-Webtreiberobjekt festzulegen:

def set_user_agent(driver):

    # set the user agent...

Importieren Sie das Paket random aus der Python-Standard-Bibliothek, um sich darauf vorzubereiten, zufällig einen User-Agent aus der user_agents-Liste auszuwählen:

import random

Verwenden Sie die Funktion random.choice(), um zufällig einen User-Agent-String aus dem Array zu extrahieren:

random_user_agent = random.choice(user_agents)

Weisen Sie ihn dann dem Chrome-Fenster mit der Funktion execute_cdp_cmd() zu:

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Ihre Funktion set_user_agent() enthält jetzt:

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Schritt Nr. 3: Stellen Sie den Random-User-Agent ein.

Bevor Sie mit get() zu einer Seite navigieren, rufen Sie die Funktion set_user_agent() auf, um den Selenium-User-Agent zu ändern:

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

Step Nr. 4: Bringen Sie alles zusammen. 

So wird Ihr Python-Selenium-User-Agent-Rotationsskript aussehen:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

import random

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

]

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

Führen Sie dieses Script ein paar Mal aus und beachten Sie, dass es verschiedene User-Agent-Strings ausgibt.

Und voilà! Sie sind jetzt ein Meister darin, den User-Agent in Selenium zu ändern.

Fazit

Mithilfe dieses Leitfadens haben Sie gelernt, wie wichtig der User-Agent-Header ist und wie Sie ihn in Selenium überschreiben können. Mit dieser Technik können Sie grundlegende Anti-Bot-Systeme dazu bringen, zu glauben, dass Ihre Requests von einem legitimen Nicht-Headless-Browser stammen. Fortschrittliche Lösungen können Sie jedoch möglicherweise immer noch erkennen und blockieren. Um IP-Sperren zu vermeiden, könnten Sie einen Proxy in Selenium integrieren, aber selbst das reicht möglicherweise nicht aus!

Vermeiden Sie diese Probleme mit Scraping Browser, einem Browser der nächsten Generation, der sich in Selenium und jedes andere Browser-Automatisierungstool integrieren lässt. Scraping Browser kann mühelos Anti-Bot-Technologien für Sie umgehen und gleichzeitig Browser-Fingerprinting vermeiden. Unter der Haube basiert es auf Funktionen wie User-Agent-Rotation, IP-Rotation und CAPTCHA-Auflösung. Browser-Automatisierung war noch nie so einfach!

Keine Kreditkarte erforderlich