Předejte ProxyHandler prázdné mapování, má-li se jeden urllib opener připojovat přímo:

from urllib.request import ProxyHandler, build_opener

direct = build_opener(ProxyHandler({}))

with direct.open("https://example.com/", timeout=10) as response:
    print(response.status)

Prázdný slovník neposkytuje žádné trasy přes proxy. Vynecháte-li mapování, handler místo toho zjistí proxy z prostředí a nastavení platformy. Tyto dva způsoby vytvoření vyjadřují odlišné politiky.

Příklad používá standardní knihovnu Pythonu a zachovává běžné ověřování HTTPS. Blok with zavře odpověď, a to i při opuštění bloku kvůli výjimce.

Přímé požadavky a požadavky přes proxy v jedné aplikaci

Dva openery mohou nést obě politiky bez změn proměnných prostředí mezi voláními:

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)

Nahraďte adresu zpětné smyčky svou HTTP proxy nebo pro porovnání přes proxy vyberte kandidáta ze seznamu HTTP proxy. Pokud to služba dovolí, může přenášet spojení k HTTPS cíli pomocí CONNECT. Protokol a podpora autentizace naslouchající služby musí odpovídat handleru.

Výchozí opener neměňte

Volejte direct.open nebo proxied.open přes objekt odpovědný za danou trasu. install_opener mění výchozí opener pro celý proces, který používají pomocné funkce urllib; knihovna s takovým voláním proto může ovlivnit nesouvisející kód. Pro izolovaný opener výše není potřeba.

Argument timeout nastavuje operaci, nikoli úplnou lhůtu skutečně uplynulého času pro každý přenos. Čtěte jen potřebná data a použijte lhůtu na vyšší úrovni, má-li úloha přísný celkový časový rozpočet.

Tyto objekty opener nemění klienta jiné knihovny, existující proces ani nastavení proxy v prohlížeči.

Související články