Per una piccola diagnosi proxy con urllib3, usa ProxyManager con i tentativi ripetuti disabilitati. Così ottieni il primo tentativo invece di attendere ulteriori prove di una voce che ha smesso di funzionare. In un progetto gestito da uv:

uv add urllib3

Sostituisci l’endpoint di documentazione con un proxy HTTP del tuo servizio o della lista dei proxy HTTP ed esegui la richiesta tramite quel gestore:

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

Leggi prima response.status, poi esamina response.data. Sono i campi di urllib3; status_code e text in stile Requests non sono sostituti. Un rifiuto del sito può arrivare attraverso un proxy funzionante. Un’eccezione prima di una risposta indica invece l’impossibilità di completare la richiesta.

retries=False è una scelta diagnostica, non una politica di tentativi per la produzione. Le impostazioni di connessione di 5 secondi e lettura di 10 secondi limitano le rispettive fasi; non equivalgono a una scadenza complessiva garantita di 15 secondi. DNS e avanzamento della risposta possono influire sull’attesa totale.

L’esempio precarica il corpo e svuota alla fine i pool del gestore. Per richieste ripetute allo stesso endpoint, conserva quel gestore fino al termine del lavoro per riutilizzare le connessioni. Passare a preload_content=False cambia il ciclo di vita: il chiamante deve leggere e rilasciare la risposta in streaming.

Scegli il gestore in base al servizio in ascolto. Un normale PoolManager non diventa consapevole del proxy perché un URL è memorizzato altrove; SOCKS usa urllib3.contrib.socks.SOCKSProxyManager e le sue dipendenze opzionali. Il codice sopra segue il percorso HTTP di ProxyManager.

Articoli correlati