Сообщить об ошибке.

HTTP-прокси или SOCKS-прокси с модулем requests в Python

Запросы к сайтам через HTTP-прокси или SOCKS-прокси

Содержание:


Запросы через HTTP-прокси.

Если необходимо использовать прокси-сервер для запросов к серверу, то для любого метода запроса можно передавать аргумент 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')

Запросы через SOCKS-прокси.

Новое в версии 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 в качестве схемы.