Socks5Proxy

Selenium-Proxy-Einstellung: SOCKS5- und HTTP-Proxies in Chrome und Firefox

Diese Anleitung erklärt für Selenium 4 die Verbindung von Socks5Proxy-HTTP- und SOCKS5-Proxys mit Chrome und Firefox sowie die Nutzung von IP-Autorisierung, da Chrome-Optionen keine Proxy-Passwörter unterstützen.

Warum ist Proxy-Authentifizierung in Selenium schwierig?

Chrome akzeptiert Proxy-Adressen über das --proxy-server-Argument, aber keine Benutzernamen und Passwörter innerhalb der Adresse. Wenn Sie sich mit einem Proxy verbinden, der eine Authentifizierung erfordert, öffnet der Browser ein Authentifizierungsfenster, das mit Selenium schwer zu füllen ist.

Am elegantesten: IP-Autorisierung. Tragen Sie die IPv4 Ihrer Selenium-Server im Dashboard ein - dann benötigen Sie keine Authentifizierung. Chrome benötigt nur ip:port. Bis zu 10 IPs möglich.

Beispiel mit IP 198.51.100.23, HTTP-Port 8000, SOCKS5-Port 1080.

pip install selenium

Wie verbinde ich einen HTTP-Proxy mit Chrome?

Nach der Registrierung der IP-Autorisierung fügen Sie die Adresse als --proxy-server-Argument in ChromeOptions ein. Ab Selenium 4.6 lädt Selenium Manager den passenden chromedriver automatisch herunter, sodass keine separate Installation erforderlich ist.

Funktioniert auch im Headless-Modus mit denselben Parametern. Überprüfen Sie die Verbindung, indem Sie die IP-Anzeigeseite öffnen und die Proxy-IP prüfen.

from selenium import webdriver
from selenium.webdriver.common.by import By

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

Wie verwende ich einen SOCKS5-Proxy in Chrome?

Geben Sie die socks5:// Adresse in --proxy-server ein. Chrome führt die Domain-Namensauflösung über den Proxy durch, aber in einigen Umgebungen kann die interne DNS-Auflösung bestehen bleiben. Daher wird häufig das Argument --host-resolver-rules verwendet, um die lokale Namensauflösung zu blockieren.

SOCKS5 verwendet ebenfalls IP-Autorisierung, da Chrome keine Benutzername/Passwort-Authentifizierung für SOCKS-Proxies unterstützt.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Wie verbinde ich mich mit Firefox?

Firefox verwendet Konfigurationswerte für Proxys. Setzen Sie network.proxy.type auf 1 (manuell) und geben Sie die HTTP- oder SOCKS-Adresse und den Port ein. Für SOCKS5 setzen Sie network.proxy.socks_version auf 5 und network.proxy.socks_remote_dns auf True, damit der Proxy die Namensauflösung übernimmt.

Firefox bietet auch keine Möglichkeit, Proxy-Passwörter über Startoptionen einzugeben, daher ist die IP-Autorisierung die einfachste Lösung.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Wie kann ich mehrere Browser mit verschiedenen IPs gleichzeitig öffnen?

Starten Sie Browser mit unterschiedlichen Proxy-Adressen. Dieses Beispiel ruft via API eine ip:port-Liste ab und startet 3 Browser mit verschiedenen IPs. Passen Sie die Anzahl an Ihre Serverkapazität an.

Für langlaufende Browseraufgaben empfiehlt es sich, eine feste IP pro Browser zu verwenden und diese bis zum Abschluss der Aufgabe beizubehalten.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

Was tun, wenn Benutzername/Passwort zwingend erforderlich ist?

Wenn Sie die IP-Autorisierung in einer Umgebung nicht verwenden können, in der sich die ausgehende IP ständig ändert, gibt es zwei Möglichkeiten. Erstens können Sie eine Zwischenproxy-Bibliothek wie selenium-wire verwenden, um die Authentifizierungsinformationen einzufügen, und zweitens können Sie einen lokalen Relay-Proxy ohne Authentifizierung auf demselben Server starten, sodass Chrome sich über die lokale Adresse und der lokale Relay sich über Benutzername und Passwort mit Socks5Proxy verbindet.

Beide Methoden fügen eine zusätzliche Komponente hinzu, was die Verwaltung aufwendiger macht. Wenn möglich, ist die IP-Autorisierung von einem festen Server aus die einfachste und schnellste Lösung.

Wie passe ich Browser an Länder an?

Passen Sie das --lang-Argument und die Accept-Language-Einstellung von Chrome an das IP-Land an, damit die Seite in der Sprache dieses Landes geöffnet wird. Wenn die Zeitzone für die Website wichtig ist, können Sie sie mit dem CDP-Befehl Emulation.setTimezoneOverride anpassen.

Die Fenstergröße wird mit dem Argument --window-size festgelegt, und für Mobilgeräte können Sie die Mobilgeräteemulation verwenden. Wenn Sie diese Werte in landesspezifischen Einstellungsgruppen speichern, können Sie denselben Test in mehreren Ländern konsistent durchführen.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

Gelten diese Einstellungen auch für Selenium Grid oder Remote-Browser?

Ja. ChromeOptions und FirefoxOptions funktionieren auch bei Remote-Ausführung. Wenn Sie dieselben Optionen in webdriver.Remote einfügen, verwendet der Browser im Grid-Knoten diesen Proxy. Die für die IP-Autorisierung registrierte IP ist dabei nicht die des ausführenden PCs, sondern die ausgehende IP des Grid-Knotens, auf dem der Browser tatsächlich läuft.

Wenn Sie mehrere Knoten haben, registrieren Sie alle IPs jedes Knotens. Sie können bis zu 10 IPs registrieren. In Umgebungen mit häufig wechselnden Cloud-Knoten ist es einfacher zu verwalten, wenn Sie den Knoten eine feste IP zuweisen.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Was sollte man überprüfen, wenn die Verbindung nicht hergestellt wird?

ERR_PROXY_CONNECTION_FAILED tritt oft auf, wenn die Adresse oder der Port falsch ist. Stellen Sie sicher, dass Sie keinen SOCKS5-Port in eine HTTP-Adresse eingeben. Wenn ERR_TUNNEL_CONNECTION_FAILED auftritt oder ein Authentifizierungsfenster erscheint, stimmt die registrierte IP nicht mit der tatsächlichen ausgehenden IP überein. Überprüfen Sie die ausgehende IP mit cURL auf api.ipify.org ohne Proxy und registrieren Sie diesen Wert.

Cloud-Server können bei einem Neustart eine andere ausgehende IP erhalten. Verwenden Sie eine feste IP oder aktualisieren Sie die Registrierungsliste im Dashboard, wenn sich die IP ändert.

Selenium-Proxy-Einstellung: Chrome & Firefox verbinden | Socks5Proxy