Kurze Antwort
Wie verwende ich einen Proxy mit Benutzername und Passwort in Selenium?
Starte einen kleinen lokalen Forwarder, der den Proxy-Authorization-Header ergänzt und leite Chrome mit --proxy-server=http://127.0.0.1:8899 darauf. Chrome ignoriert Zugangsdaten in diesem Flag, Selenium bietet keine portable Lösung für Proxy-Passwörter. CrawlRelay Residential-Proxys funktionieren so auf gw.crawlrelay.com:7777, von 0,50 $/GB. Mit Krypto bezahlen, ohne KYC.
Selenium-Einrichtung im Überblick
| Warum ein Forwarder | Chrome-Flag --proxy-server akzeptiert keinen Benutzernamen oder Passwort |
|---|---|
| Forwarder | Hört auf 127.0.0.1:8899, fügt Proxy-Authorization hinzu, leitet zu gw.crawlrelay.com:7777 weiter |
| Chrome-Option | --proxy-server=http://127.0.0.1:8899 |
| Rotation | Jeder neue CONNECT-Tunnel ist eine neue Verbindung, also meist ein neuer Exit; füge eine Session-ID für eine IP hinzu |
| Einfachere Alternative | Playwright übernimmt den Benutzernamen und das Passwort direkt |
Wie funktioniert der lokale Forwarder?
Er akzeptiert die Proxy-Anfrage des Browsers, fügt einen Header mit Ihren Zugangsdaten hinzu und kopiert dann die Bytes in beide Richtungen. Bei einer HTTPS-Seite sendet der Browser CONNECT host:443, das Gateway antwortet mit 200 Connection established, und TLS läuft dann von Ende zu Ende zwischen Chrome und der Website. Der Forwarder sieht den Seiteninhalt nie im Klartext.
Diese Minimalversion unterstützt HTTPS-Seiten, bei denen jede Verbindung einen einzelnen CONNECT-Tunnel trägt. Das deckt fast jede Website heute ab. Binden Sie ihn an 127.0.0.1, damit keine andere Maschine Ihre Zugangsdaten nutzen kann.
import asyncio
import base64
import os
UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())
async def pipe(reader, writer):
try:
while True:
data = await reader.read(65536)
if not data:
break
writer.write(data)
await writer.drain()
except ConnectionError:
pass
finally:
writer.close()
async def handle(client_reader, client_writer):
try:
head = await client_reader.readuntil(b"\r\n\r\n") # request line and headers from the browser
except asyncio.IncompleteReadError:
client_writer.close()
return
lines = head.split(b"\r\n")
lines.insert(1, AUTH) # add the credentials right after the request line
up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
up_writer.write(b"\r\n".join(lines))
await up_writer.drain()
await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))
async def main():
server = await asyncio.start_server(handle, "127.0.0.1", 8899)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())Wie leite ich Selenium auf den Forwarder um?
Starten Sie forwarder.py in einem Terminal und führen Sie dann Ihr Selenium-Skript mit der lokalen Proxy-Adresse aus. Selenium Manager, integriert in Selenium 4.6 und höher, lädt automatisch den passenden ChromeDriver herunter, sodass nichts weiter installiert werden muss.
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899") # the local forwarder
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.set_page_load_timeout(60)
driver.get("https://api.ipify.org")
print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
driver.quit()Wie erhalte ich pro Selenium-Session eine eigene IP oder eine neue IP pro Seite?
Der Forwarder sendet den Benutzernamen, den Sie ihm geben, sodass das Session-Verhalten davon abhängt:
- Rotation pro Verbindung: Lassen Sie den Session-Teil (
USERNAME-country-us) weg. Chrome öffnet mehrere Verbindungen pro Seite, sodass eine einzelne Seite über mehrere Exit-IP-Adressen geladen werden kann. - Eine IP pro Selenium-Session: Setzen Sie
CRAWLRELAY_USERaufUSERNAME-country-us-session-run42-ttl-30, bevor Sie den Forwarder starten. Alle Verbindungen laufen dann bis zu 30 Minuten über dieselbe IP; die IP kann jedoch auch früher wechseln. - Mehrere Sessions parallel: Starten Sie pro Session einen Forwarder auf unterschiedlichen lokalen Ports, zum Beispiel 8899 und 8900, und weisen Sie jedem WebDriver seinen eigenen Port zu.
Was ist mit selenium-wire oder Browser-Erweiterungen?
selenium-wire, ein beliebtes Paket zur Proxy-Authentifizierung durch Traffic-Intercept, wurde vom Autor im Januar 2024 archiviert und erhält keine Updates mehr. Eine Browser-Erweiterung, die auf Proxy-Authentifizierungsanfragen antwortet, funktioniert ebenfalls, muss jedoch für jedes Profil installiert und geladen werden. Der oben genannte Forwarder hat keine Abhängigkeiten und funktioniert mit jedem von Selenium gesteuerten Browser. Für neue Projekte ist Playwright noch einfacher: Es übernimmt Benutzername und Passwort direkt.
Selenium und Proxys: Fragen
Warum zeigt Chrome bei meinem Proxy in Selenium ein Login-Popup an?
Weil der Proxy nach Zugangsdaten gefragt hat und Chrome keine hatte: sein --proxy-server-Flag akzeptiert nur Host und Port. Im Headless-Modus tritt dasselbe Problem als ERR_TUNNEL_CONNECTION_FAILED auf. Nutzen Sie einen lokalen Forwarder, der die Zugangsdaten hinzufügt, oder wechseln Sie zu Playwright, das Benutzername und Passwort annimmt.
Verlangsamt der Forwarder mein Scraping?
Kaum. Er kopiert Bytes zwischen zwei lokalen und einer entfernten Socket-Verbindung, ohne etwas zu entschlüsseln. Die Ladezeit einer Seite hängt vom Residential Proxy Exit und der Zielseite ab, nicht von einem lokal laufenden Forwarder.
Kann ich Firefox statt Chrome mit Selenium verwenden?
Ja. Stellen Sie FireFox-Proxy-Einstellungen über FirefoxOptions ein: network.proxy.type auf 1, und network.proxy.http und network.proxy.ssl auf 127.0.0.1 mit Port 8899. Behalten Sie den Forwarder davor: Firefox zeigt ein Proxy-Zugangsdaten-Dialogfenster, das Selenium zuverlässig nicht ausfüllen kann.
Ist mein Passwort im Forwarder sicher?
Es verbleibt auf Ihrer Maschine, solange der Forwarder an 127.0.0.1 hört, wie im Beispiel. Lesen Sie es aus Umgebungsvariablen, speichern Sie es niemals im Code und verwenden Sie für jeden Scraper einen separaten Sub-Benutzer mit Traffic-Limit, so dass bei Passwort-Leak nicht Ihr ganzes Konto leergeräumt werden kann.
Geben Sie Selenium einen Residential Proxy Exit
1,50 $ für 1 GB zum Testen, 0,50 $/GB von 50 GB.