Если необходимо использовать прокси-сервер для запросов к серверу, то для любого метода запроса можно передавать аргумент proxies
, в который необходимо указать список прокси-серверов:
import requests # список прокси-серверов proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } requests.get('http://example.org', proxies=proxies)
В качестве альтернативы можно настроить список прокси один раз для всего сеанса/сессии:
import requests proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'https://10.10.1.10:1080', } session = requests.Session() session.proxies.update(proxies) session.get('http://example.org')
Когда конфигурация прокси-серверов не переопределяется в Python, как показано выше, то по умолчанию библиотека requests
полагаются на конфигурацию прокси-сервера, определенную стандартными переменными среды http_proxy
, https_proxy
, no_proxy
и curl_ca_bundle
. Также поддерживаются варианты этих переменных в верхнем регистре. Следовательно можно настроить их для использования в запросах (только те, которые соответствуют вашим потребностям):
$ export HTTP_PROXY="http://10.10.1.10:3128" $ export HTTPS_PROXY="https://10.10.1.10:1080" $ python3 >>> import requests >>> requests.get('http://example.org')
Чтобы использовать HTTP Basic Auth с прокси, необходимо использовать синтаксис http://user:password@host/
в любой из приведенных выше записей конфигурации:
# через переменные среды $ export HTTPS_PROXY="http://user:pass@10.10.1.10:1080" # в коде Python >>> proxies = {'http': 'http://user:pass@10.10.1.10:3128/'}
Предупреждение. Хранение конфиденциальной информации в открытом виде об имени пользователя и пароле в переменных средах или файле с кодом представляет собой угрозу безопасности и настоятельно не рекомендуется.
Чтобы предоставить прокси-сервер для конкретной схемы и хоста, используйте форму scheme://hostname
для ключа. Это будет соответствовать для любого запроса заданной схеме и точному имени хоста.
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
Обратите внимание, что URL-адреса прокси должны включать схему.
Наконец, обратите внимание, что использование прокси-сервера для HTTPS-соединений обычно требует, чтобы локальный компьютер доверял корневому сертификату прокси. По умолчанию список сертификатов, которым доверяют запросы, можно найти с помощью:
from requests.utils import DEFAULT_CA_BUNDLE_PATH print(DEFAULT_CA_BUNDLE_PATH)
Можно переопределить этот набор сертификатов по умолчанию, установив для стандартной переменной среды curl_ca_bundle
другой путь к файлу:
# переопределяем набор сертификатов через переменные среды $ export curl_ca_bundle="/usr/local/myproxy_info/cacert.pem" $ export https_proxy="http://10.10.1.10:1080" # запускаем Python $ python3 >>> import requests # делаем запрос >>> requests.get('https://example.org')
Новое в версии 2.10.0.
Помимо основных HTTP-прокси, библиотека requests
также поддерживает прокси, использующие протокол SOCKS. Это дополнительная функция, для которой перед использованием необходимо установить дополнительные сторонние библиотеки.
Можно получить зависимости для этой функции из pip
:
$ python -m pip install requests[socks]
После того как установили эти зависимости, использовать SOCKS-прокси так же просто, как и HTTP-прокси:
# просто аргументу proxies необходимо # передать список SOCKS-прокси proxies = { 'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port' }
Использование схемы socks5
приводит к тому, что разрешение DNS происходит на клиенте, а не на прокси-сервере. Это соответствует утилите linux терминала curl
, которая использует схему, чтобы решить, следует ли выполнять разрешение DNS на клиенте или прокси-сервере. Если необходимо разрешение DNS на прокси-сервере, то используйте socks5h
в качестве схемы.