Zendriver Proxy mit Authentifizierung: Einrichtung und Workarounds
Zendriver ist der von der Community gepflegte Fork von nodriver – schneller zu beheben, aber mit derselben Lücke bei der Proxy-Authentifizierung. Hier ist die vollständige Proxy-Einrichtung, was tatsächlich anders ist, und die Workarounds, die user:pass zum Laufen bringen.
Ein zendriver proxy wird genau wie ein nodriver eingerichtet – was sowohl die gute Nachricht als auch der Haken ist. zendriver (das cdpdriver/zendriver Projekt) ist der von der Community gepflegte Fork von nodriver: ein asynchrones, unentdecktes Browser-Automatisierungs-Framework, das Chrome direkt über das DevTools-Protokoll steuert, ohne WebDriver in Sicht. Es existiert, weil der einzige Maintainer von nodriver selten externe Fixes zusammenführte, sodass die Community einen Fork erstellte, um Bugfixes zu akzeptieren, Funktionen hinzuzufügen und Probleme auf GitHub zu behandeln. Was es nicht behoben hat, sind authentifizierte Proxys. Dieser Leitfaden behandelt die vollständige Proxy-Einrichtung, was sich wirklich von nodriver unterscheidet, und die Workarounds, die user:pass zum Laufen bringen.
Installation und grundlegende Proxy-Einrichtung
Die Installation ist eine Zeile — pip install zendriver — und die API spiegelt nodriver fast symbolgetreu wider, sodass import zendriver as zd oft die einzige Änderung beim Portieren eines Skripts ist. Ein nicht authentifizierter Proxy läuft über browser_args, und die Anfrage verlässt die Proxy-IP:
import zendriver as zd
async def main():
browser = await zd.start(
browser_args=["--proxy-server=gate.quantumproxies.io:PORT"],
)
page = await browser.get("https://httpbin.org/ip")
print(await page.get_content()) # shows the proxy exit IP
await browser.stop()
zd.loop().run_until_complete(main())
Das funktioniert, weil es nur ein Chrome-Flag ist. Fügen Sie Anmeldedaten hinzu — --proxy-server=http://USER:PASS@host:port — und Chromium verwirft stillschweigend den USER:PASS@-Teil, der Proxy antwortet mit 407, und ein nativer Anmeldedialog erscheint, den zendriver nicht ausfüllen kann. Dies ist eine Chrome-Einschränkung, kein zendriver-Fehler, daher wird kein Versionssprung das Flag dazu bringen, ein Passwort zu akzeptieren.
Die Lücke bei der zendriver Proxy-Authentifizierung
Die Lücke wird offen in den zendriver-Issues verfolgt – ein Feature-Request-Thread (#10) und ein dediziertes "Proxy mit Auth"-Issue (#208) – was selbst ein Unterschied ist, der beachtet werden sollte: bei nodriver ist dieselbe Frage in einer Diskussion vergraben, die der Maintainer einmal beantwortete und dann weiterzog. Ein Benutzer im Issue #10 fasst den Stand der Dinge unverblümt zusammen: Die Proxy-Server-Option hat keine Möglichkeit zur Authentifizierung, also verwenden sie stattdessen eine Proxy-Erweiterung und es funktioniert einwandfrei. Das ist der praxiserprobte Konsens, und er weist direkt auf dieselben drei Lösungen hin, auf die sich nodriver-Benutzer verlassen.
Lösung 1: IP-Whitelisting (die einfachste)
Wenn Ihr Job von einer Maschine mit einer stabilen öffentlichen IP ausgeführt wird, überspringen Sie die Anmeldedaten vollständig. Registrieren Sie die Ausgangs-IP in Ihrem Anbieter-Dashboard und das Gateway authentifiziert Sie anhand der Quelladresse — der zendriver-Code bleibt das einfache --proxy-server-Snippet oben, ohne Auth-Logik. Jeder QuantumProxies-Plan unterstützt IP-Whitelisting neben user:pass, was es zur Standardempfehlung macht, wann immer Ihre IP fest ist. Die einzige Einschränkung ist, dass es eine Maschine authentifiziert, nicht ein Skript, sodass flüchtige Runner und Container hinter NAT eine der nächsten beiden Methoden benötigen.

Lösung 2: die Herausforderung über CDP beantworten
Da zendriver das DevTools-Protokoll auf dieselbe Weise wie nodriver offenlegt, können Sie die Authentifizierungsherausforderung im Prozess abfangen: Registrieren Sie RequestPaused und AuthRequired-Handler, aktivieren Sie dann die Fetch-Domäne mit handle_auth_requests=True und antworten Sie mit continue_with_auth. Die beiden nicht offensichtlichen Regeln sind identisch mit nodriver — fügen Sie die Handler vor dem Aktivieren der Domäne hinzu und feuern Sie Antworten mit asyncio.create_task ab, damit das Warten darauf die Schleife nicht blockiert:
import asyncio
import zendriver as zd
async def main():
browser = await zd.start(browser_args=["--proxy-server=gate.quantumproxies.io:PORT"])
tab = await browser.get("draft:,") # blank tab first
async def on_auth(event):
asyncio.create_task(tab.send(zd.cdp.fetch.continue_with_auth(
request_id=event.request_id,
auth_challenge_response=zd.cdp.fetch.AuthChallengeResponse(
response="ProvideCredentials", username="USER", password="PASS",
),
)))
async def on_request(event):
asyncio.create_task(tab.send(
zd.cdp.fetch.continue_request(request_id=event.request_id)))
# handlers FIRST, then enable the domain
tab.add_handler(zd.cdp.fetch.RequestPaused, on_request)
tab.add_handler(zd.cdp.fetch.AuthRequired, on_auth)
await tab.send(zd.cdp.fetch.enable(handle_auth_requests=True))
page = await browser.get("https://httpbin.org/ip")
await asyncio.sleep(3)
print(await page.get_content())
await browser.stop()
zd.loop().run_until_complete(main())
Der vollständige Leitfaden, warum die Reihenfolge der Handler wichtig ist und was passiert, wenn Sie es falsch machen, befindet sich in unserem nodriver Proxy-Authentifizierungsleitfaden — die Mechanik ist geteilt, daher gibt es keinen Grund, sie zweimal zu reproduzieren.
Lösung 3: eine Proxy-Auth-Erweiterung und SOCKS5
Der Weg, den Issue #10 befürwortet, ist eine generierte Chrome-Erweiterung: ein Manifest V3 manifest plus ein Worker, der den Proxy setzt und chrome.webRequest.onAuthRequired beantwortet, geladen mit --load-extension unter --headless=new. Es behandelt jeden Proxy-Typ, einschließlich SOCKS5, was wichtig ist, da authentifiziertes SOCKS5 nie über das Flag funktioniert — Chromium hat keine Benutzername/Passwort-Unterstützung für SOCKS5 (Chromium-Bug 40829748). Die Alternative für SOCKS5 ist ein lokales Relay, das die Anmeldedaten hält und einen nicht authentifizierten Endpunkt auf 127.0.0.1 bietet, behandelt im Proxy-Relay-Leitfaden. Jeder QuantumProxies-Plan liefert sowohl HTTP- als auch SOCKS5-Endpunkte, sodass Sie oft das gesamte Problem umgehen können, indem Sie HTTP verwenden, das Basic-Auth sauber handhabt.
Was sich tatsächlich von nodriver unterscheidet
Der Fork ist nicht kosmetisch. In öffentlichen Benchmarks, die nodriver, zendriver, Selenium und Playwright gegen moderne Anti-Bot-Systeme antreten ließen, war die nodriver/zendriver-Familie die stärkste beim Durchkommen, wobei zendriver dank nicht zusammengeführter Upstream-Fixes, die es trägt, die Nase vorn hatte. Praktisch sind die Unterschiede, die die Proxy-Arbeit beeinflussen: ein aktiver Issue-Tracker, in dem Probleme triagiert werden, ein stabilerer Veröffentlichungsrhythmus, isolierte Browser-Kontexte, die Sie pro Sitzung aufspinnen können, und mitgelieferte Annehmlichkeiten, die von nodriver beibehalten werden. Keines davon schließt die Authentifizierungslücke — aber es bedeutet, dass Fixes schneller landen, wenn sie es tun, und es macht zendriver zum einfacheren Fork, um viele parallele Sitzungen auszuführen. Für das Rotieren und Poolen von Ausgängen über diese gleichzeitigen Kontexte gelten unsere Notizen zur Proxy-Pool-Management unverändert für zendriver, egal ob Sie durch rotierende Proxys routen oder Sticky-Sessions für eingeloggte Flows festlegen.
Eine Klarstellung: Ein separates Rust-Crate mit dem Namen zendriver existiert auf docs.rs. Es ist nicht mit dem hier besprochenen Python-Fork verwandt — wenn Sie in Python scrapen, ist pip install zendriver das, was Sie wollen.

Häufig gestellte Fragen
Wie verwende ich einen Proxy mit zendriver?
Geben Sie die Adresse über browser_args an, wenn Sie zendriver.start() aufrufen: browser_args=["--proxy-server=host:port"]. Das leitet den gesamten Verkehr durch den Proxy für einen nicht authentifizierten Endpunkt. Für einen authentifizierten Proxy können Sie user:pass nicht im Flag angeben — setzen Sie Ihre IP auf die Whitelist, verwenden Sie einen CDP Fetch.AuthRequired-Handler oder laden Sie eine Proxy-Auth-Erweiterung.
Unterstützt zendriver authentifizierte Proxys?
Nicht über einen eingebauten Parameter — die Lücke wird in den Issues #10 und #208 verfolgt. Chromium ignoriert Anmeldedaten im Proxy-Flag, daher authentifizieren Sie sich auf andere Weise: IP-Whitelisting beim Anbieter, ein CDP-Handler, der die Herausforderung im Prozess beantwortet, eine generierte Chrome-Erweiterung oder ein lokales Relay, das die Anmeldedaten für Sie hält.
Was ist der Unterschied zwischen nodriver und zendriver?
zendriver ist ein von der Community gepflegter Fork von nodriver mit derselben CDP-Architektur, Tarnzielen und API. Der Unterschied liegt in der Pflege: zendriver nimmt Issues und Pull-Requests auf GitHub an, liefert nicht zusammengeführte Upstream-Bugfixes und veröffentlicht regelmäßiger. Die Proxy-Authentifizierung verhält sich in beiden identisch — die Fixes in diesem Leitfaden funktionieren für beide.
Kann zendriver einen authentifizierten SOCKS5-Proxy verwenden?
Nicht über das Flag, da Chromium nie eine SOCKS5-Benutzername/Passwort-Authentifizierung implementiert hat (Chromium-Bug 40829748), und zendriver erbt das. Verwenden Sie eine Proxy-Auth-Erweiterung, führen Sie ein lokales Relay aus, das die Anmeldedaten hinzufügt, oder richten Sie zendriver auf den HTTP-Endpunkt Ihres Anbieters — HTTP-Basic-Proxy-Auth funktioniert zuverlässig, wo SOCKS5-Auth nicht funktioniert.
zendriver ist heute der schärfere der beiden Forks, auf dem man aufbauen kann, aber es bringt Ihnen dasselbe Problem mit authentifizierten Proxys wie nodriver. Whitelist, wenn Ihre IP fest ist, beantworten Sie die CDP-Herausforderung, wenn sie es nicht ist, und behalten Sie die Erweiterung und das Relay als Fallbacks. Egal, welche Sie wählen, die Ausgangs-IP leistet die Hauptarbeit — ein gepflegter Fork auf einer verbrannten Rechenzentrumsadresse wird immer noch blockiert.