Para unha pequena diagnose de proxy con urllib3, usa ProxyManager cos reintentos desactivados. Así informa do primeiro intento en vez de gastar máis tempo repetindo unha entrada que deixou de funcionar. Nun proxecto xestionado con uv:

uv add urllib3

Substitúe o punto de documentación por un proxy HTTP do teu servizo ou da lista de proxys HTTP e realiza a petición por ese xestor:

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()

Le primeiro response.status e despois inspecciona response.data. Son campos de urllib3; status_code e text ao estilo de Requests non os substitúen. Un rexeitamento do sitio pode chegar por un proxy funcional. Unha excepción antes da resposta indica, en cambio, que non se puido completar a petición.

retries=False é unha elección diagnóstica, non unha política de reintentos de produción. Os axustes de conexión de 5 segundos e lectura de 10 segundos limitan as súas fases; non suman un prazo total garantido de 15 segundos. O DNS e o progreso da resposta poden afectar a espera total.

O exemplo precarga o corpo e baleira os grupos de conexións do xestor ao final. Para peticións repetidas polo mesmo punto, conserva o xestor ata rematar o traballo para reutilizar as conexións. Cambiar a preload_content=False modifica ese ciclo de vida: quen chama debe ler e liberar a resposta en fluxo.

Escolle o xestor que corresponda ao servizo que escoita. Un PoolManager normal non empeza a usar proxy porque se garde un URL noutro lugar; SOCKS usa urllib3.contrib.socks.SOCKSProxyManager e as súas dependencias opcionais. O código anterior segue a vía HTTP de ProxyManager.

Artigos relacionados