Szybka odpowiedź
Co oznacza 407 Proxy Authentication Required w kontekście proxy?
407 Proxy Authentication Required oznacza, że proxy odmówiło Twojego żądania, ponieważ nie otrzymało danych uwierzytelniających lub otrzymało błędne. Docelowa strona nigdy nie została skontaktowana. Przy użyciu proxy CrawlRelay residential sprawdź trzy rzeczy: czy nazwa użytkownika to ta z Twojego panelu, czy hasło się zgadza oraz czy wszystkie znaki specjalne w którymkolwiek z nich są zakodowane URL. Powtórne wysłanie tego samego żądania nigdy nie rozwiązuje 407.
407 Proxy Authentication Required w skrócie
| Błąd | 407 Proxy Authentication Required |
|---|---|
| Typ | Kod statusu HTTP (4xx, błąd klienta) |
| Wysłane przez | Brama proxy, nigdy docelowa strona internetowa |
| Zdefiniowano w | RFC 9110, section 15.5.8 (headers: Proxy-Authenticate 11.7.1, Proxy-Authorization 11.7.2) |
| Spróbować ponownie? | Nie. Te same dane logowania ponownie się nie sprawdzą; najpierw je popraw |
| Najpierw sprawdź | Uruchom poniższy test curl z samą nazwą użytkownika i bez parametrów celowania |
Co oznacza 407 Proxy Authentication Required?
Kod 407 pochodzi od proxy, nie od strony, do której chcesz dotrzeć. RFC 9110 opisuje go jako wersję 401 dla proxy: klient musi się uwierzytelnić u proxy zanim cokolwiek się zdarzy. Proxy wysyła nagłówek Proxy-Authenticate, który określa akceptowany schemat, zazwyczaj Basic. Twój klient odpowiada nagłówkiem Proxy-Authorization z danymi username:password zakodowanymi w Base64.
Dla celu HTTPS 407 pojawia się w odpowiedzi na żądanie CONNECT otwierające tunel. Dlatego wiele bibliotek zgłasza go jako błąd tunelu lub połączenia zamiast statusu HTTP: sesja TLS ze stroną nigdy nie została nawiązana.
Jak wygląda a 407 w Python, curl, Node.js i przeglądarkach?
Ten sam błąd wyświetla się inaczej w każdym narzędziu. Oto komunikaty, które warto wyszukać w logach:
- Python requests:
ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required')) - curl:
curl: (56) CONNECT tunnel failed, response 407 - Scrapy:
TunnelError: Could not open CONNECT tunnel with proxy ... [{'status': 407, 'reason': b'Proxy Authentication Required'}] - Chrome, Playwright, Puppeteer:
net::ERR_TUNNEL_CONNECTION_FAILEDlub wyskakujące okno logowania w widocznej przeglądarce - Klienci Node.js dla celu http://:
Request failed with status code 407
Co powoduje a 407?
Najczęściej na początku:
- Błędna nazwa użytkownika lub hasło. Literówka, stare hasło po resecie lub dane innego podużytkownika.
- Niezakodowane znaki specjalne. Hasło zawierające
@,:,/lub#psuje URLuser:pass@host. Zakoduj procentowo:@staje się%40,:staje się%3A. - Uszkodzony sufiks celowania. Bramki, które wyciągają celowanie z nazwy użytkownika, widzą jeden długi ciąg. Literówka w kluczu lub kodzie kraju zamienia nazwę w nieznaną proxy.
- Dane uwierzytelniające nigdy nie opuszczają Twojego kodu. Chrome ignoruje login i hasło wpisane w
--proxy-server. Puppeteer potrzebujepage.authenticate(), a Selenium lokalnego przekierowania. - Pusty stan konta. Sprawdź, czy na koncie jest jeszcze ruch zanim zaczniesz debugować kod.
Jak krok po kroku zdiagnozować a 407?
- Przetestuj dane logowania curl bez celowania (komenda poniżej). Linia
HTTP/1.1 407w szczegółowym wyjściu potwierdza problem z danymi. - Dodawaj parametry celowania pojedynczo, testując za każdym razem.
- Zaloguj URL proxy wygenerowany przez Twój program, maskując hasło, i porównaj go znak po znaku z panelem.
- Jeśli curl działa a Twój program nie, biblioteka nie wysyła danych. Zobacz naprawę dla Twojego narzędzia poniżej.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLJak naprawić a 407?
- Zakoduj dane za pomocą
urllib.parse.quote(value, safe='')w Python lubencodeURIComponent()w JavaScript przed zbudowaniem URL. - Przeglądarki: przekaż
usernameipasswordw opcjiproxyPlaywrighta, wywołajpage.authenticate()w Puppeteer i użyj lokalnego forwardera dla Selenium. Zobacz Playwright i Puppeteer poradniki. - Zmienne środowiskowe: jeśli ustawiasz
HTTPS_PROXY, całe jego wartości ujęcie w cudzysłów w shellu żeby@i$się zachowały. - Zmień hasło w panelu jeśli podejrzewasz wyciek, a następnie zaktualizuj każdy scraper z niego korzystający.
from urllib.parse import quote
import requests
user = "USERNAME-country-us"
password = "p@ss:word/1" # example containing special characters
# safe="" also encodes "/", "@" and ":" inside the credentials
proxy = "http://{}:{}@gw.crawlrelay.com:7777".format(
quote(user, safe=""), quote(password, safe="")
)
proxies = {"http": proxy, "https": proxy} # http:// for both keys
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(10, 30))
print(r.status_code, r.text)from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gw.crawlrelay.com:7777",
"username": "USERNAME-country-us",
"password": "PASSWORD",
})
page = browser.new_page()
response = page.goto("https://api.ipify.org")
print(response.status, page.inner_text("body"))
browser.close()Czy warto ponawiać próbę po a 407?
Nie powtarzaj automatycznie 407. Powtórka z tymi samymi danymi da ten sam wynik, a częste powtórki zaśmiecają logi. Traktuj 407 jako błąd konfiguracji: zatrzymaj zadanie, popraw dane i uruchom ponownie. Jeśli 407 pojawi się nagle w działającym od dawna zadaniu, prawdopodobnie zmieniono hasło lub wyłączono podużytkownika.
Jak 407 Proxy Authentication Required odnosi się do CrawlRelay?
Bramka CrawlRelay odczytuje nazwę użytkownika i hasło przy każdym nowym połączeniu. Ustawienia celowania i sesji są w nazwie użytkownika, więc prawidłowe hasło może zawieść przy uszkodzonym sufiksie. Zbuduj nazwę użytkownika w jednej funkcji pomocniczej i zaloguj ją raz przy starcie. Strona szybkiego startu pokazuje dokładny format.
Gateway: gw.crawlrelay.com, port 7777 (HTTP, HTTPS przez CONNECT) i port 7778 (SOCKS5). Format nazwy użytkownika: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Powiązane: 401 vs 407 · ERR_TUNNEL_CONNECTION_FAILED · Cannot connect to proxy.
407 Proxy Authentication Required: pytania, które zadają deweloperzy
Czy 407 wysyła strona, którą scrapuję?
Nie. 407 jest zawsze zwrócony przez proxy między Tobą a stroną. Żądanie nigdy nie dociera do strony, więc nie może liczyć ani blokować ruchu. Gdyby strona wymagała logowania, zwróciłaby 401. Popraw dane proxy, a 407 zniknie.
Dlaczego mój kod dostaje 407 gdy curl działa na tym samym proxy?
Twoja biblioteka nie wysyła danych lub robi to inaczej. Zwykle: dane wpisane do flagi przeglądarki, która je ignoruje, zmienna środowiskowa, która straciła znaki specjalne lub hasło niezakodowane URL. Wydrukuj URL proxy z Twojego kodu z zamaskowanym hasłem i porównaj go z komendą curl.
Czy 407 zużywa ruch z mojego planu?
Odpowiedź 407 ma kilkaset bajtów i żądanie nigdy nie dociera do celu, więc strona się nie pobiera. Koszt jest gdzie indziej: scraper utkwił w pętli powtarzania 407, traci czas i zalewa logi. Traktuj 407 jako twardy stop w obsłudze błędów.
Inne błędy proxy w tym odniesieniu
Kody statusu HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Błędy w przeglądarce i kliencie
Błędy połączenia i TLS
Proxy rezydencjalne z dokumentacją opisującą przypadki błędów
CrawlRelay proxy rezydencjalne od 0,50 USD/GB, ruch, który nigdy nie wygasa.