Передайте пустое отображение в 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 не меняют клиент другой библиотеки, существующий процесс или настройки прокси браузера.

Похожие статьи