Python urllib: vypnite proxy pre jediný opener
Pomocou ProxyHandler({}) vytvorte urllib opener s priamym pripojením bez zmien ostatných klientov a prostredia procesu.
Odovzdajte ProxyHandler prázdne mapovanie, ak sa má jeden urllib opener pripájať priamo:
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ázdny slovník neposkytuje žiadne trasy cez proxy. Vynechanie mapovania naopak umožní handleru zistiť proxy z prostredia a nastavení platformy. Tieto dva spôsoby vytvorenia vyjadrujú odlišné politiky.
Príklad používa štandardnú knižnicu Pythonu a zachováva bežné overovanie HTTPS. Blok with zatvorí odpoveď aj pri opustení bloku pre výnimku.
Priame požiadavky a požiadavky cez proxy v jednej aplikácii
Dva openery môžu niesť obe politiky bez zmien premenných prostredia medzi volaniami:
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 spätnej slučky svojím HTTP proxy alebo na porovnanie cez proxy vyberte kandidáta zo zoznamu HTTP proxy. Ak to služba dovolí, môže prenášať spojenie k HTTPS cieľu pomocou CONNECT. Protokol a podpora autentifikácie počúvajúcej služby musia zodpovedať handleru.
Predvolený opener nemeňte
Volajte direct.open alebo proxied.open cez objekt zodpovedný za trasu. install_opener mení predvolený objekt pre celý proces, ktorý používajú pomocné funkcie urllib; knižnica s takým volaním preto môže ovplyvniť nesúvisiaci kód. Pre izolovaný opener vyššie nie je potrebný.
Argument timeout nastavuje operáciu, nie úplnú lehotu skutočne uplynutého času každého prenosu. Čítajte len potrebné údaje a použite lehotu na vyššej úrovni, ak má úloha prísny celkový časový rozpočet.
Tieto objekty opener nemenia klienta inej knižnice, existujúci proces ani nastavenia proxy v prehliadači.