Python urllib: отключение прокси для одного opener
Создайте opener urllib с прямым подключением через ProxyHandler({}), не меняя другие клиенты и окружение процесса.
Передайте пустое отображение в ProxyHandler, если один opener urllib должен подключаться напрямую:
from urllib.request import ProxyHandler, build_opener
direct = build_opener(ProxyHandler({}))
with direct.open("https://example.com/", timeout=10) as response:
print(response.status)
Пустой словарь не задаёт ни одного маршрута через прокси. Если отображение не передать, обработчик сам обнаружит прокси в окружении и настройках платформы. Эти два способа создания выражают разные политики.
Пример использует стандартную библиотеку Python и сохраняет обычную проверку HTTPS. Блок with закрывает ответ, в том числе при выходе из блока из-за исключения.
Прямые запросы и запросы через прокси в одном приложении
Два объекта opener могут нести две политики без изменения переменных окружения между вызовами:
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)
Замените адрес обратной петли своим HTTP-прокси или выберите кандидата из списка HTTP-прокси для сравнения запросов через прокси. Он может передавать соединение к HTTPS-серверу через CONNECT, если сервис это разрешает. Протокол и поддержка аутентификации слушающего сервиса должны соответствовать обработчику.
Не меняйте opener по умолчанию
Вызывайте direct.open или proxied.open через объект, отвечающий за маршрут. install_opener меняет общую для процесса настройку по умолчанию, используемую вспомогательными функциями urllib, поэтому библиотека с таким вызовом может затронуть посторонний код. Для изолированного opener выше он не нужен.
Аргумент timeout задаёт настройку операции, а не полный предел фактически прошедшего времени для каждой передачи. Читайте только нужные данные и используйте ограничение более высокого уровня, если у задачи строгий общий бюджет времени.
Эти объекты opener не меняют клиент другой библиотеки, существующий процесс или настройки прокси браузера.