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.

Porównanie czterech metod uwierzytelniania proxy w Selenium: biała lista IP, rozszerzenie Manifest V3, selenium-wire i API do scrapingu
Biała lista wygrywa, gdy twój egress IP jest stały; rozszerzenie MV3 wygrywa na efemerycznych maszynach; selenium-wire wymienia wygodę na odcisk palca MITM.

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.

Drabina eskalacyjna od białej listy proxy Selenium do rozszerzenia Manifest V3 do proxy rezydencjalnych do API do scrapingu
Wspinaj się tylko tak daleko, jak zmusza cię cel: flaga, rozszerzenie, lepsze IP, a potem pozwól, aby API uruchamiało przeglądarki.

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.

Uruchom Selenium na rezydencjalnych IP