Eine Proxy-IP mit urllib3 verwenden
Wähle ProxyManager für einen HTTP-Proxy, prüfe die Antwortfelder von urllib3 und berücksichtige Wiederholungen sowie den separaten SOCKS-Manager.
Verwende für eine kleine urllib3-Proxy-Diagnose ProxyManager mit deaktivierten Wiederholungen. So wird der erste Versuch gemeldet, statt länger einen nicht mehr funktionierenden Eintrag erneut zu versuchen. In einem mit uv verwalteten Projekt:
uv add urllib3Ersetze den Dokumentationsendpunkt durch einen HTTP-Proxy deines Dienstes oder aus der HTTP-Proxy-Liste und führe die Anfrage über diesen Manager aus:
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()
Lies zuerst response.status und prüfe dann response.data. Das sind die Felder von urllib3; die Requests-Felder status_code und text sind kein Ersatz. Eine Ablehnung der Website kann über einen funktionierenden Proxy ankommen. Eine Ausnahme vor einer Antwort zeigt dagegen, dass die Anfrage nicht abgeschlossen werden konnte.
retries=False ist eine Diagnoseentscheidung, keine Wiederholungsstrategie für den Produktivbetrieb. Die 5 Sekunden für den Verbindungsaufbau und 10 Sekunden fürs Lesen begrenzen jeweils ihre Phase; sie ergeben keine garantierte Gesamtdauer von höchstens 15 Sekunden. DNS und der Fortschritt der Antwort können die gesamte Wartezeit beeinflussen.
Das Beispiel lädt den Inhalt vorab und leert am Ende die Verbindungspools des Managers. Behalte bei wiederholten Anfragen über denselben Endpunkt den Manager bis zum Ende der Arbeit, damit seine Verbindungen wiederverwendet werden können. Der Wechsel zu preload_content=False ändert diesen Lebenszyklus: Der Aufrufer muss die gestreamte Antwort lesen und freigeben.
Wähle den Manager passend zum Listener. Ein normaler PoolManager wird nicht proxyfähig, weil irgendwo anders eine URL gespeichert ist; SOCKS nutzt urllib3.contrib.socks.SOCKSProxyManager samt optionalen Abhängigkeiten. Der obige Code folgt dem HTTP-ProxyManager-Pfad.