Python urllib: wyłącz proxy dla jednego opener
Utwórz opener urllib łączący się bezpośrednio za pomocą ProxyHandler({}), bez zmiany innych klientów i środowiska procesu.
Przekaż puste mapowanie do ProxyHandler, gdy jeden opener urllib ma łączyć się bezpośrednio:
from urllib.request import ProxyHandler, build_opener
direct = build_opener(ProxyHandler({}))
with direct.open("https://example.com/", timeout=10) as response:
print(response.status)
Pusty słownik nie określa tras przez proxy. Pominięcie mapowania pozwala natomiast handlerowi wykryć proxy na podstawie środowiska i ustawień platformy. Te dwa sposoby tworzenia wyrażają różne polityki.
Przykład używa standardowej biblioteki Pythona i zachowuje zwykłą weryfikację HTTPS. Blok with zamyka odpowiedź, również gdy wyjątek powoduje wyjście z bloku.
Żądania bezpośrednie i przez proxy w jednej aplikacji
Dwa obiekty opener mogą realizować dwie polityki bez zmieniania zmiennych środowiskowych między wywołaniami:
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)
Zastąp adres pętli zwrotnej swoim proxy HTTP albo wybierz kandydata z listy proxy HTTP do porównania przez proxy. Może ono przenosić połączenie do celu HTTPS przez CONNECT, jeśli usługa na to pozwala. Protokół i obsługa uwierzytelniania nasłuchującej usługi muszą pasować do handlera.
Nie zmieniaj domyślnego opener
Wywołuj direct.open lub proxied.open przez obiekt odpowiedzialny za trasę. install_opener zmienia domyślny obiekt dla całego procesu, którego używają funkcje pomocnicze urllib; korzystająca z niego biblioteka może więc wpłynąć na niepowiązany kod. Dla powyższego odizolowanego opener nie jest potrzebny.
Argument timeout jest ustawieniem operacji, a nie pełnym limitem rzeczywistego czasu każdego transferu. Odczytuj tylko potrzebne dane i użyj terminu na wyższym poziomie, jeśli zadanie ma ścisły całkowity budżet czasu.
Te obiekty opener nie zmieniają klienta innej biblioteki, istniejącego procesu ani ustawień proxy przeglądarki.