Uwierzytelnianie proxy w Selenium: 4 konfiguracje, które naprawdę działają
Chrome wyświetla okno dialogowe uwierzytelniania, którego Selenium nie może dotknąć, a sztuczka z danymi uwierzytelniającymi w URL cicho zawodzi. Oto cztery konfiguracje, które faktycznie uwierzytelniają proxy w Selenium — uszeregowane według tego, jak mało zaszkodzą.
Uwierzytelnianie proxy w Selenium to pułapka przebrana za jednolinijkę. Flaga --proxy-server Chrome chętnie akceptuje adres proxy — i cicho ignoruje wszelkie nazwy użytkowników i hasła, które w niej osadzisz. Chrome następnie wyświetla natywne okno dialogowe uwierzytelniania, którego WebDriver nie widzi, twój skrypt wisi, a najlepsza odpowiedź na Stack Overflow, którą znajdziesz (113+ głosów), rozwiązuje to za pomocą rozszerzenia Manifest V2, którego nowoczesny Chrome już nie ładuje. Ten przewodnik obejmuje cztery konfiguracje, które uwierzytelniają proxy w Selenium dzisiaj — biała lista IP, rozszerzenie Manifest V3, selenium-wire i wiedza, kiedy przekazać cały problem z przeglądarką do API.
Dlaczego podstawowe uwierzytelnianie proxy w Selenium zawodzi
Trzy fakty wyjaśniają każdą nieudaną próbę. Po pierwsze, Chromium usuwa dane uwierzytelniające z --proxy-server=http://user:pass@host:port — format flagi po prostu nie obsługuje danych uwierzytelniających. Po drugie, wyzwanie 407 Proxy Authentication Required proxy pojawia się jako natywne okno dialogowe, poza DOM, gdzie send_keys nie może dotrzeć. Po trzecie, stara trasa DesiredCapabilities (socksUsername / socksPassword) dotyczyła tylko proxy SOCKS i nigdy nie działała dla HTTP — konfiguracja, która 'wygląda dobrze' i nic nie robi. Więc prawdziwe opcje całkowicie unikają okna dialogowego.
Metoda 1: Biała lista IP — zero kodu, zero dialogów
Jeśli twój scraper działa z maszyny z stabilnym publicznym IP, pomiń dane uwierzytelniające: zarejestruj to IP w panelu dostawcy proxy, a brama uwierzytelnia cię na podstawie adresu źródłowego. Każdy plan QuantumProxies obsługuje białą listę IP obok user:pass. Po stronie Selenium staje się to zwykłą flagą — która zawsze działała dobrze bez uwierzytelniania:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://gate.quantumproxies.io:PORT")
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
driver.get("https://httpbin.org/ip")
print(driver.find_element("tag name", "body").text) # proxy exit IP
driver.quit()
Zawsze weryfikuj wyjście przed zaufaniem uruchomieniu: załaduj punkt końcowy echo IP i potwierdź, że adres należy do proxy, ponieważ błędnie skonfigurowana flaga zawodzi cicho, a Chrome po prostu łączy się bezpośrednio. Ograniczenie białej listy jest topologiczne: uwierzytelnia maszynę, nie skrypt. Efemeryczne chmury, kontenery za NAT i maszyny CI z zmieniającymi się IP potrzebują jednej z poniższych metod.
Metoda 2: rozszerzenie Chrome Manifest V3
Klasyczne rozwiązanie generuje małe rozszerzenie Chrome, które ustawia proxy i odpowiada na wyzwanie uwierzytelniające za pomocą chrome.webRequest.onAuthRequired. Słynny fragment z 2019 roku używa Manifest V2, który Chrome teraz wycofał — nowoczesna wersja potrzebuje manifest_version: 3, pracownika serwisowego i uprawnienia webRequestAuthProvider. To buduje i ładuje jedno w czasie rzeczywistym:
import json, os, tempfile
from selenium import webdriver
HOST, PORT = "gate.quantumproxies.io", "PORT"
USER, PASS = "USER", "PASS"
manifest = {
"name": "Proxy Auth", "version": "1.0", "manifest_version": 3,
"permissions": ["proxy", "webRequest", "webRequestAuthProvider"],
"host_permissions": ["<all_urls>"],
"background": {"service_worker": "worker.js"},
}
worker = """
chrome.proxy.settings.set({
value: { mode: "fixed_servers", rules: {
singleProxy: { scheme: "http", host: "%s", port: parseInt("%s") },
bypassList: ["localhost"] } },
scope: "regular"
}, function() {});
chrome.webRequest.onAuthRequired.addListener(
function(details) {
return { authCredentials: { username: "%s", password: "%s" } };
},
{ urls: ["<all_urls>"] },
["blocking"]
);
""" % (HOST, PORT, USER, PASS)
ext_dir = tempfile.mkdtemp()
with open(os.path.join(ext_dir, "manifest.json"), "w") as f:
json.dump(manifest, f)
with open(os.path.join(ext_dir, "worker.js"), "w") as f:
f.write(worker)
options = webdriver.ChromeOptions()
options.add_argument("--load-extension=" + ext_dir)
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
driver.get("https://httpbin.org/ip")
Dwa pułapki. Rozszerzenia ładują się tylko w nowym trybie bezgłowym — zwykłe --headless zawodzi z tajemniczym błędem 'failed to wait for extension background page', więc --headless=new jest obowiązkowe. A ładowanie niepakowanego katalogu za pomocą --load-extension jest bardziej niezawodne w różnych wersjach Chrome niż pakowanie zip. Jeśli nie chcesz tego utrzymywać, pakiet selenium-authenticated-proxy na PyPI generuje rozszerzenie dla ciebie z jednego URL proxy.

Metoda 3: selenium-wire i jego kompromisy
selenium-wire opakowuje WebDriver lokalnym proxy man-in-the-middle, co sprawia, że uwierzytelnione proxy upstream — w tym SOCKS5 — to zwykły słownik opcji:
# pip install selenium-wire
from seleniumwire import webdriver
options = {
"proxy": {
"http": "http://USER:PASS@gate.quantumproxies.io:PORT",
"https": "http://USER:PASS@gate.quantumproxies.io:PORT",
"no_proxy": "localhost,127.0.0.1",
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://httpbin.org/ip")
Wiedz, co kupujesz. Projekt został zarchiwizowany przez swojego opiekuna na początku 2024 roku i nie otrzymuje aktualizacji, a ponieważ odszyfrowuje ruch lokalnie, cel widzi uścisk dłoni TLS selenium-wire zamiast Chrome — niedopasowanie, które systemy fingerprintingu JA3/JA4 flagują nawet wtedy, gdy twoje IP jest nieskazitelne. Pozostaje naprawdę przydatne do inspekcji żądań podczas rozwoju i dla Firefox, gdzie sztuczka z rozszerzeniem nie istnieje. Do produkcyjnego scrapingu na chronionych stronach, preferuj metody 1-2 lub przejdź na wyższy poziom.
Firefox i luka w uwierzytelnianiu
Firefox akceptuje nieautoryzowane proxy czysto przez preferencje profilu (network.proxy.type = 1 plus ustawienia hosta i portu), ale nie ma odpowiednika sztuczki z rozszerzeniem Chrome do odpowiadania na okno dialogowe uwierzytelniania z WebDriver. W praktyce użytkownicy Firefox wybierają białą listę IP lub selenium-wire. Jeśli jedynym powodem dla Firefox była jego obsługa proxy, ten powód już nie istnieje.
Kiedy przestać łatać Selenium i przełączyć się na API
Uwierzytelnianie to pierwszy podatek, nie ostatni. Instancja Chrome kosztuje setki MB RAM, więc kilka tuzinów równoczesnych sesji nasyca serwer; wersje ChromeDriver gonią za wydaniami Chrome; a dostawcy anty-botów wykrywają zwykłe Selenium niezależnie od IP za nim — navigator.webdriver i artefakty CDP to zdradzają. Dwie aktualizacje zmieniają ekonomię. Po pierwsze, uruchom swoje przeglądarki przez proxy rezydencjalne, aby reputacja IP przestała być powodem, dla którego jesteś blokowany — 90M+ domowych IP z rotacją na żądanie lub lepkimi sesjami dla przepływów zalogowanych. Po drugie, gdy utrzymanie przeglądarek przestaje być warte, Scraper API składa cały stos w jedno wywołanie HTTP: renderuje JavaScript na żądanie, zarządza IP i ponownymi próbami wewnętrznie, i zwraca HTML, markdown lub strukturalny JSON. Ta sama wymiana dotyczy kuzynów Selenium — zobacz nasze przewodniki po integracji proxy Playwright i ustawieniu proxy Puppeteer zanim założysz, że zmiana frameworka rozwiąże problem z wykrywaniem.

Często zadawane pytania
Jak ustawić proxy z uwierzytelnianiem w Selenium ChromeDriver?
Albo umieść IP swojej maszyny na białej liście u dostawcy proxy i przekaż zwykłą flagę --proxy-server, albo załaduj małe rozszerzenie Manifest V3, które ustawia proxy i dostarcza dane uwierzytelniające przez chrome.webRequest.onAuthRequired. Osadzanie user:pass@ we fladze nie działa — Chromium to ignoruje.
Dlaczego Chrome wyświetla okno logowania proxy z Selenium?
Proxy odpowiedziało 407 i Chrome pyta człowieka o dane uwierzytelniające. Okno dialogowe to natywny interfejs użytkownika, niewidoczny dla WebDriver, więc żaden selektor ani wywołanie send_keys nie może go wypełnić. Rozwiązaniem jest uwierzytelnienie przed pojawieniem się okna dialogowego: biała lista IP, rozszerzenie uwierzytelniające lub warstwa MITM jak selenium-wire.
Czy selenium-wire nadal działa w 2026 roku?
Nadal się instaluje i działa dla wielu zadań, ale projekt został zarchiwizowany na początku 2024 roku i nie jest utrzymywany. Jego projekt MITM również zastępuje odcisk palca TLS Chrome na Pythonowy, co nowoczesne systemy anty-botów wykrywają. Traktuj to jako narzędzie do debugowania, a nie fundament produkcyjnego scrapera.
Jak używać uwierzytelnionego proxy z Firefox w Selenium?
Preferencje profilu Firefox konfigurują adres proxy, ale nie mogą odpowiedzieć na monit o dane uwierzytelniające, i nie ma obejścia z rozszerzeniem jak w Chrome. Użyj białej listy IP, aby nie były potrzebne dane uwierzytelniające, lub skieruj Firefox przez selenium-wire, które obsługuje uwierzytelnianie upstream lokalnie.
Czy to działa tak samo w Java i C#?
Tak — mechanika leży w Chrome, a nie w powiązaniu języka. Biała lista IP plus --proxy-server jest identyczna wszędzie, a podejście z rozszerzeniem Manifest V3 działa z Java lub C# poprzez napisanie tych samych dwóch plików i dodanie --load-extension do ChromeOptions. Tylko selenium-wire jest specyficzne dla Pythona; inne języki zastępują lokalne proxy MITM, takie jak BrowserMob.
Krótka wersja: nigdy nie walcz z oknem dialogowym uwierzytelniania. Umieść na białej liście, gdy twoje IP jest stabilne, wygeneruj rozszerzenie MV3, gdy nie jest, zachowaj selenium-wire do pracy inspekcyjnej — a gdy utrzymanie przeglądarek przerasta dane, które produkuje, promuj zadanie do API i zachowaj swoje wieczory.