Selenium ist das am weitesten verbreitete Browser-Automatisierungswerkzeug überhaupt, und zum Scrapen eines JavaScript-lastigen Ziels erledigt es die Aufgabe. Aber es hat eine langjährige Lücke, die fast jeden beim ersten Hinzufügen eines Residential Proxys stolpern lässt: den Proxy-Host zu setzen ist trivial, einen Benutzernamen und ein Passwort zu liefern nicht, denn Selenium hat keinen eingebauten Weg dafür. Richte Chrome auf einen authentifizierten Proxy und es öffnet einen nativen 407-Login-Dialog, den Selenium nicht ausfüllen kann, und dein Skript hängt. So kommst du daran vorbei, auf drei Wegen.
Das steht neben den anderen Browser-Leitfäden, Residential Proxies mit Playwright und mit Puppeteer, die beide Proxy-Auth nativ handhaben. Brauchst du keinen vollen Browser, ist Proxies in Python mit einem schlichten HTTP-Client noch einfacher.
Alles unten nutzt Shifters Residential Gateway: ein Endpunkt, p.shifter.io:443, mit dem gesamten Targeting im Benutzernamen kodiert. Tausche Host und Zugangsdaten für einen anderen Anbieter aus; die Form bleibt gleich.
Das Gateway-Modell in einem Absatz
Der Proxy-Benutzername trägt deine Authentifizierung und dein Targeting. Du wechselst nicht den Endpunkt, um Land oder Session zu ändern, du änderst die Benutzernamen-Zeichenkette:
customer-USERNAME-country-us-sid-abc123-ttl-600country-us zielt auf die USA, sid fixiert eine Sticky Session, ttl hält diese IP für N Sekunden. Lässt du sid/ttl weg, rotiert jede neue Verbindung. Das Passwort bleibt konstant. Das ganze Problem in Selenium ist, diesen Benutzernamen und dieses Passwort zum Proxy zu bringen.
Das Kernproblem
Den Host zu setzen ist die leichte Hälfte. Du übergibst --proxy-server in den Chrome-Optionen genau wie überall sonst:
from selenium import webdriver
options = webdriver.ChromeOptions()options.add_argument('--proxy-server=http://p.shifter.io:443') # nur Hostdriver = webdriver.Chrome(options=options)Das funktioniert für einen IP-Whitelist-Proxy ohne Zugangsdaten. Aber das Gateway ist mit Benutzername und Passwort authentifiziert, und Chromium liest die Zugangsdaten nicht aus diesem Flag, also stockt die erste Navigation an einem 407-Auth-Prompt, den Selenium nicht abweisen kann. Du brauchst einen von drei Wegen, diese Challenge zu beantworten.
Ansatz 1: Selenium Wire (der einfache)
Selenium Wire erweitert Selenium und akzeptiert Proxy-Zugangsdaten direkt, wobei es die Auth für dich erledigt. Es ist die reibungsärmste Option und das, wonach die meisten Python-Scraper greifen.
from seleniumwire import webdriver # pip install selenium-wireimport os
user = os.environ['SHIFTER_USER'] + '-country-us' # Targeting im Benutzernamenpw = os.environ['SHIFTER_PASS']
seleniumwire_options = { 'proxy': { 'http': f'http://{user}:{pw}@p.shifter.io:443', 'https': f'http://{user}:{pw}@p.shifter.io:443', 'no_proxy': 'localhost,127.0.0.1', }}
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)driver.get('https://api.ipify.org')print(driver.page_source) # eine US-Residential-IPdriver.quit()Die Zugangsdaten, inklusive der Targeting-Flags im Benutzernamen, gehen in die proxy-Config, und Selenium Wire kümmert sich transparent um den 407. Es lässt dich den Proxy auch zur Laufzeit ändern, indem du driver.proxy neu zuweist, was praktisch für Rotation ohne Chrome-Neustart ist.
Ansatz 2: eine Zugangsdaten-Extension (schlichtes Selenium, keine Extra-Bibliothek)
Willst du bei schlichtem Selenium bleiben, ist die klassische Technik, eine winzige Chrome-Extension zu laden, die die Auth-Challenge mit deinen Zugangsdaten beantwortet. Du baust sie zur Laufzeit und übergibst sie mit add_extension.
# manifest.json deklariert Proxy- + Auth-Berechtigungen; background.js liefert die Creds.background_js = """chrome.webRequest.onAuthRequired.addListener( () => ({ authCredentials: { username: USER, password: PASS } }), { urls: ['<all_urls>'] }, ['blocking']);""".replace('USER', repr(user)).replace('PASS', repr(pw))# manifest.json + background.js zippen, dann:options.add_extension('proxy_auth.zip')Das hält dich abhängigkeitsfrei und funktioniert in jedem Selenium-Sprach-Binding, da die Extension die Arbeit macht. Der Vorbehalt: das blockierende onAuthRequired-Muster oben ist eine Manifest-V2-Technik, und Chrome phast MV2 zugunsten von MV3 aus, also ist dieser Ansatz auf aktuellem Chrome fragiler als früher. Fängst du frisch an, bevorzuge Selenium Wire oder die CDP-Route unten.
Ansatz 3: CDP in Selenium 4
Selenium 4 legt das Chrome DevTools Protocol offen, und du kannst die Proxy-Auth über die Fetch-Domäne beantworten, indem du Fetch.authRequired behandelst und die Anfrage mit Zugangsdaten fortsetzt. Es ist nativ für modernes Selenium und braucht kein Extra-Paket, aber es ist fummelig, es von Hand zu verdrahten, im Wesentlichen eine Neuimplementierung dessen, was Selenium Wire bereits umschließt. Greife danach, wenn du null Drittanbieter-Abhängigkeiten willst und mit CDP vertraut bist; sonst erspart dir Selenium Wire die Mühe.
Geo und Sessions rotieren
Da das Targeting im Benutzernamen lebt, ist eine andere Identität ein anderer Benutzername, und in Selenium wird der Proxy auf Browser-Ebene gesetzt. Das heißt, Rotation geschieht pro Driver, nicht pro Tab. Zwei praktische Muster: mit Selenium Wire weise driver.proxy zur Laufzeit neu zu, um den Benutzernamen zwischen Arbeitseinheiten zu tauschen; mit dem Extension- oder CDP-Ansatz fahre einen Driver pro Identität und poole sie. So oder so, gib jeder logischen Arbeitseinheit ihre eigene sid und rotiere zwischen Einheiten, nicht mitten in der Session (Sticky vs. rotierend behandelt die Unterscheidung), und ordne Arbeit Identitäten so zu, wie es der Beitrag zum Lastausgleich beschreibt.
Verwende den Driver wieder, und begrenze die Nebenläufigkeit
Chrome zu starten ist teuer, ein frischer Driver pro Anfrage zahlt jedes Mal echte Startzeit und Speicher, den Overhead, den der Latenz-Leitfaden beseitigen soll. Starte einen Driver (oder einen kleinen Pool davon) und verwende ihn über Anfragen hinweg wieder. Und da jeder Driver ein voller Browser ist, der echten Speicher hält, kannst du nicht Tausende fahren, halte einen begrenzten Pool und begrenze die Arbeit in Flug pro Ziel-Host, damit eine fragile Seite nicht malträtiert wird, während eine großzügige verhungert. Mehr Parallelität jenseits der Toleranz eines Ziels kauft Blockaden und Out-of-Memory-Abstürze, keinen Durchsatz (wie man Blockaden vermeidet).
Der Browser ist nur die Hälfte davon, nicht geblockt zu werden
Eine Residential-IP erledigt die Netzwerk-Hälfte davon, menschlich auszusehen, aber Selenium steuert immer noch einen automatisierten Browser, und Seiten fingerprinten auch das, navigator.webdriver, Automatisierungs-Flags, und Headless-Eigenheiten. Eine saubere IP mit guter Reputation hält dich aus vielen Challenges heraus, aber sie verschleiert keinen offensichtlich automatisierten Browser. Halte User-Agent und Viewport realistisch, steuere die Seite in menschlichem Tempo, und denk daran, dass die Fehler, die Erkennung auslösen, für die Browser-Schicht ebenso gelten wie für die IP-Schicht. Die beiden müssen zusammenpassen.
Prüfe, dass du wirklich über den Proxy läufst
Bevor du irgendetwas anderes benchmarkst oder debuggst, bestätige die Exit-IP von innerhalb des Browsers:
driver.get('http://ip-api.com/json')print(driver.find_element('tag name', 'body').text) # erwarte das ZiellandDeine eigene IP bedeutet, dass der Proxy nicht angewandt wird. Ein Hänger an einem Login-Dialog bedeutet, dass der Auth-Schritt (Selenium Wire, Extension, oder CDP) fehlt oder fehlkonfiguriert ist. Ein allgemeiner Hänger bedeutet, dass der lokale Ausgang blockiert ist. Alle drei werden im Leitfaden zur Timeout-Diagnose behandelt.
FAQ
Warum hängt Selenium an einem Proxy-Login-Popup?
Chromium wirft einen nativen 407-Authentifizierungsdialog für einen authentifizierten Proxy, und Selenium kann nicht mit nativen Browser-Dialogen interagieren. Du musst die Challenge anders beantworten: Selenium Wire, eine Zugangsdaten-Extension, oder CDPs Fetch.authRequired. --proxy-server allein zu setzen liefert nur den Host, nicht die Zugangsdaten.
Kann ich user:pass@host in --proxy-server packen?
Nein. Chromium liest die Zugangsdaten nicht aus dem --proxy-server-Flag. Liefere den Host dort und stelle Benutzernamen und Passwort über einen der drei Ansätze oben bereit. Da das Gateway das Targeting im Benutzernamen kodiert, ist der vollständige Benutzername (mit -country-...) das, was du als Proxy-Benutzernamen übergibst.
Muss ich Selenium Wire nutzen? Nein, aber es ist der einfachste Weg in Python. Die abhängigkeitsfreien Alternativen sind eine Zugangsdaten-Extension (funktioniert in jedem Sprach-Binding, obwohl das klassische MV2-Muster ausgephast wird) oder CDP in Selenium 4 (nativ, aber mehr Verdrahtungsaufwand).
Wie rotiere ich IPs in Selenium?
Variiere den Proxy-Benutzernamen, was die Identität über dasselbe Gateway ändert. In Selenium Wire kannst du driver.proxy zur Laufzeit neu zuweisen; sonst fahre einen Driver pro Identität und poole sie. Lass die sid im Benutzernamen weg, um bei jeder neuen Verbindung zu rotieren.
Selenium, Playwright, oder Puppeteer? Playwright und Puppeteer nehmen beide die Proxy-Zugangsdaten nativ, also vermeiden sie diesen ganzen Tanz; Selenium braucht einen der Umwege hier. Selenium ist immer noch eine gute Wahl, wenn es das ist, was dein Stack bereits nutzt; fängst du frisch an und willst schmerzlose Proxy-Auth, sind die anderen beiden geschmeidiger.
Das Fazit
Selenium plus Residential Proxies funktioniert gut, sobald du die eine Lücke löst, die es hat: es nimmt den Proxy-Host in --proxy-server, aber es braucht Hilfe, um Zugangsdaten für einen authentifizierten Proxy zu liefern. Nutze Selenium Wire für die geringste Reibung, eine Zugangsdaten-Extension, wenn du abhängigkeitsfrei bleiben willst, oder CDP in Selenium 4 für eine native Route. Dann rotiere Geo und Sessions durch Variieren des Benutzernamens, verwende einen langlebigen Driver wieder, begrenze deine Nebenläufigkeit, weil jeder ein echter Browser ist, und halte den Browser-Fingerabdruck so menschlich wie die IP.
Mach das richtig, und Selenium bewältigt die interaktiven, JavaScript-lastigen Ziele, die schlichte HTTP-Clients nicht können. Richte es auf das Residential Gateway, und denk daran, dass die Pool-Qualität entscheidet, wie oft du überhaupt herausgefordert wirst (IP-Reputation). Die Preisseite hat die Pro-GB-Tarife, um es gegen deine eigenen Ziele zu testen.