Python urllib: Proxys für einen einzelnen Opener deaktivieren
Mit ProxyHandler({}) einen direkt verbindenden urllib-Opener erstellen und dabei andere Clients sowie die Prozessumgebung unverändert lassen.
Übergeben Sie ProxyHandler eine leere Zuordnung, wenn ein einzelner urllib-Opener direkt verbinden soll:
from urllib.request import ProxyHandler, build_opener
direct = build_opener(ProxyHandler({}))
with direct.open("https://example.com/", timeout=10) as response:
print(response.status)
Das leere Dictionary liefert keine Proxyrouten. Wird die Zuordnung weggelassen, ermittelt der Handler stattdessen Proxys aus seiner Umgebung und den Plattformeinstellungen. Diese beiden Konstruktionen stehen für unterschiedliche Richtlinien.
Das Beispiel verwendet die Python-Standardbibliothek und behält die normale HTTPS-Prüfung bei. Der with-Block schließt die Antwort, auch wenn er wegen einer Ausnahme verlassen wird.
Direkte und über Proxy geleitete Anfragen in derselben Anwendung
Zwei Opener können die beiden Richtlinien tragen, ohne zwischen Aufrufen Umgebungsvariablen zu ändern:
from urllib.request import ProxyHandler, build_opener
direct = build_opener(ProxyHandler({}))
proxied = build_opener(ProxyHandler({
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}))
with proxied.open("https://example.com/", timeout=10) as response:
print(response.status)
Ersetzen Sie die Loopback-Adresse durch Ihren HTTP-Proxy oder wählen Sie für den Proxyvergleich einen Kandidaten aus der HTTP-Proxy-Liste. Er kann die Verbindung zum HTTPS-Ziel über CONNECT transportieren, sofern der Dienst dies erlaubt. Protokoll und Authentifizierungsunterstützung des Listeners müssen zum Handler passen.
Den Standard-Opener unangetastet lassen
Rufen Sie direct.open oder proxied.open über das Objekt auf, das für den jeweiligen Weg zuständig ist. install_opener ändert den prozessweiten Standard für die Komfortaufrufe von urllib; eine Bibliothek kann damit unbeteiligten Code beeinflussen. Für den isolierten Opener oben ist es unnötig.
Das Argument timeout ist eine Einstellung für eine Operation, keine vollständige Echtzeitfrist für jede Übertragung. Lesen Sie nur die benötigten Daten und verwenden Sie eine übergeordnete Frist, wenn die Aufgabe ein strenges Gesamtzeitbudget hat.
Diese Opener-Objekte ändern weder den Client einer anderen Bibliothek noch einen bestehenden Prozess oder die Proxyeinstellungen eines Browsers.