Do niewielkiej diagnostyki proxy w urllib3 użyj ProxyManager z wyłączonymi ponowieniami. Zgłasza to wynik pierwszej próby zamiast dłużej ponawiać wpis, który przestał działać. W projekcie zarządzanym przez uv:

uv add urllib3

Zastąp dokumentacyjny punkt końcowy proxy HTTP swojej usługi lub wpisem z listy proxy HTTP i wykonaj żądanie przez ten menedżer:

import urllib3

proxy = urllib3.ProxyManager(
    "http://203.0.113.10:8080",
    timeout=urllib3.Timeout(connect=5, read=10),
    retries=False,
)

try:
    response = proxy.request("GET", "https://example.com/")
    print(response.status)
    print(response.data.decode("utf-8", errors="replace")[:200])
finally:
    proxy.clear()

Najpierw odczytaj response.status, potem sprawdź response.data. To pola urllib3; status_code i text w stylu Requests nie są zamiennikami. Odmowa strony może przyjść przez działające proxy. Wyjątek przed odpowiedzią oznacza natomiast, że żądania nie udało się ukończyć.

retries=False jest wyborem diagnostycznym, a nie produkcyjną polityką ponowień. Ustawienia 5 sekund na połączenie i 10 sekund na odczyt ograniczają własne fazy; nie dają gwarantowanego łącznego terminu 15 sekund. DNS i postęp odpowiedzi mogą wpływać na całkowite oczekiwanie.

Przykład wstępnie wczytuje treść i na końcu czyści pule menedżera. Przy powtarzanych żądaniach przez ten sam punkt zachowaj menedżer do końca pracy, aby ponownie używać połączeń. Przejście na preload_content=False zmienia cykl życia: wywołujący musi odczytać i zwolnić strumieniową odpowiedź.

Dobierz menedżer do nasłuchującej usługi. Zwykły PoolManager nie zaczyna obsługiwać proxy dlatego, że URL zapisano gdzie indziej; SOCKS używa urllib3.contrib.socks.SOCKSProxyManager i jego opcjonalnych zależności. Powyższy kod korzysta ze ścieżki HTTP ProxyManager.

Powiązane artykuły