
Как использовать прокси с Python Requests
В Python Requests прокси задаётся словарём proxies. Ключи http и https применяются к URL соответствующей схемы, значения содержат адрес прокси. Начните с одного проверочного запроса, затем добавьте авторизацию, Session и обработку ошибок.

Прокси меняет маршрут запроса и выходной IP. Смена IP зависит от настроек продукта и сессии; каждый новый запрос не обязан получать новый адрес. Прокси также не гарантирует доступ к сайту и не заменяет соблюдение его лимитов.
Главное
- Для HTTP-прокси стандартной установки Requests достаточно. SOCKS5 требует
requests[socks]. - Ключ
httpsв словаре может содержать значение сhttp://: это адрес HTTP-прокси для HTTPS-сайта. Sessionсохраняет cookies и настройки, а также переиспользует соединения.- Окружение способно переопределить
session.proxies. Для управляемой конфигурации используйтеsession.trust_env = False. - Пустой словарь
proxies={}не отключает прокси окружения. - Коды 401, 403, 407 и 429 требуют разных действий. Не повторяйте их все одним циклом.
Когда нужен прокси для Requests
Прокси пригодится для проверки региональной версии сайта, согласованного сбора публичных данных и запросов с выделенным выходным IP. Сначала соединение устанавливается с прокси, затем запрос передаётся к целевому ресурсу.
Для HTTPS через обычный HTTP-прокси применяется CONNECT. Внутри туннеля Requests устанавливает TLS-соединение с сайтом. Сам факт использования прокси не означает перехват HTTPS и не требует отключать проверку сертификата.
Прокси не исполняет JavaScript и не превращает Requests в браузер. Если данные появляются только после выполнения клиентского кода, одного изменения IP недостаточно. Основы запросов и разбора ответа разобраны в руководстве по Requests на примерах.
Подготовка: библиотека и параметры подключения
Установите пакет в окружение проекта:
python -m pip install requests
python -c "import requests; print(requests.__version__)"
Для SOCKS5 установите дополнительную зависимость:
python -m pip install "requests[socks]"
Подготовьте протокол прокси, имя хоста или IP, порт и способ авторизации. Формат URL с авторизацией: http://username:password@host:port. Используйте порт из кабинета: HTTP и SOCKS5 могут подключаться через разные порты.
Адрес 192.0.2.10:8080 в учебном примере ниже зарезервирован для документации. Он не обозначает работающий сервер ProxyWing. Подставьте свои параметры и проверьте доступ к нужному целевому сайту.
Какой прокси ProxyWing выбрать
Для отдельного выходного адреса рассмотрите индивидуальные прокси ProxyWing. Если проекту нужны резидентские IP и выбор региона, выберите резидентские прокси ProxyWing. Оцените результат на своей целевой странице, частоту ошибок и расход трафика.
Для резидентских прокси действует промокод WINGRESI10: скидка 10% на резидентские прокси ProxyWing.
Сверьте протокол и формат сессии перед подключением. Sticky-сессия сохраняет адрес по правилам продукта, ротация меняет его по заданной политике. Ни один тип IP не гарантирует прохождение антибот-проверок. Для выбора между этими вариантами пригодится сравнение резидентских и серверных прокси.
Как подключить HTTP-прокси и проверить IP
Базовый запрос
import requests
proxy_url = "http://192.0.2.10:8080"
proxies = {"http": proxy_url, "https": proxy_url}
response = requests.get(
"https://httpbin.org/ip",
proxies=proxies,
timeout=(5, 15),
)
response.raise_for_status()
print(response.json()["origin"])
Замените proxy_url своим адресом. В поле origin появится IP, который видит проверочный сервер. Для сравнения выполните прямой запрос через отдельную сессию с trust_env=False, как показано далее. Если IP совпали, проверьте proxy_url, окружение и маршрут сети. Прямое соединение уже может выходить через VPN или корпоративный шлюз.
Логин и пароль прокси вне исходного кода
Передайте параметры через хранилище секретов или переменные окружения процесса: PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORD. Не выводите их в журналы и не сохраняйте в общедоступном файле проекта.
import os
from urllib.parse import quote
import requests
user = quote(os.environ["PROXY_USER"], safe="")
password = quote(os.environ["PROXY_PASSWORD"], safe="")
host = os.environ["PROXY_HOST"]
port = os.environ["PROXY_PORT"]
proxy_url = "http://" + user + ":" + password + "@" + host + ":" + port
with requests.Session() as session:
session.trust_env = False
session.proxies.update({"http": proxy_url, "https": proxy_url})
response = session.get("https://httpbin.org/ip", timeout=(5, 15))
response.raise_for_status()
print(response.json()["origin"])
quote(..., safe="") кодирует специальные символы отдельно в логине и пароле. Готовый URL целиком кодировать не нужно. trust_env=False исключает влияние прокси окружения и .netrc; при необходимости явно настройте доверенный CA через session.verify.
SOCKS5 и DNS
После установки requests[socks] используйте адрес SOCKS-сервера:
import os
import requests
proxy_url = os.environ["SOCKS_PROXY_URL"]
with requests.Session() as session:
session.trust_env = False
response = session.get(
"https://httpbin.org/ip",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
print(response.json()["origin"])
В SOCKS_PROXY_URL передайте URL с параметрами подключения. Специальные символы в логине и пароле закодируйте через quote(..., safe=""), как в примере выше. Схема socks5:// разрешает имя целевого сайта на клиенте. Схема socks5h:// передаёт разрешение имени прокси-серверу. SOCKS5 в Requests используется для HTTP-запросов; поддержка UDP протоколом SOCKS5 не добавляет UDP API в Requests.

Окружение и отключение прокси
Requests учитывает HTTP_PROXY, HTTPS_PROXY, ALL_PROXY и NO_PROXY, а также их варианты в нижнем регистре. Они задают поведение процесса, который унаследовал переменные.
Сохраните в PROXY_URL полный URL прокси, например http://user:password@host:port, с закодированными логином и паролем. В Bash назначьте его так:
export HTTP_PROXY="$PROXY_URL"
export HTTPS_PROXY="$PROXY_URL"
export NO_PROXY="localhost,127.0.0.1"
В PowerShell:
$env:HTTP_PROXY = $env:PROXY_URL
$env:HTTPS_PROXY = $env:PROXY_URL
$env:NO_PROXY = "localhost,127.0.0.1"
После этого обычный requests.get() использует подходящую настройку. Значения из окружения могут переопределить session.proxies. Передайте proxies= непосредственно в вызов либо отключите чтение окружения через trust_env=False.
Для отдельной прямой проверки создайте новую сессию без настроенных прокси:
import requests
with requests.Session() as direct:
direct.trust_env = False
response = direct.get("https://httpbin.org/ip", timeout=(5, 15))
response.raise_for_status()
print(response.json()["origin"])
proxies={} не служит выключателем. Даже удаление ключей http и https не исключает оставшийся ALL_PROXY. Отдельная чистая сессия исключает эту неоднозначность.
Ротация адресов и сохранение сессии
Разделяйте две задачи: выбор адреса для нового независимого запроса и сохранение маршрута для одной пользовательской сессии. При авторизации или пагинации смена IP может нарушить состояние на сайте.
Для небольшого списка адресов можно последовательно выбирать их по кругу. В proxies.txt сохраните по одному полному прокси-URL на строку и ограничьте доступ к файлу.
from itertools import cycle
from pathlib import Path
import requests
pool = [line.strip() for line in Path("proxies.txt").read_text().splitlines()
if line.strip()]
if not pool:
raise ValueError("Список прокси пуст")
with requests.Session() as session:
session.trust_env = False
rotation = cycle(pool)
for number in range(3):
proxy_url = next(rotation)
session.cookies.clear()
response = session.get(
"https://httpbin.org/ip",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
print(number + 1, response.json()["origin"])
Этот пример выбирает прокси-URL по кругу и очищает cookies перед независимым запросом. Он не измеряет доступность адресов и не обещает разные выходные IP у шлюзов. Для нескольких аккаунтов создавайте отдельные сессии с собственными cookies и закреплённым прокси.
При использовании шлюза с ротацией порядок смены адресов задаёт продукт. Перебор одного адреса шлюза через cycle не управляет его выходными IP.
Почему прокси в Requests не работает
| Симптом | Проверка |
|---|---|
| Видно прежний IP | Проверьте ключ https, переменные окружения, ALL_PROXY и NO_PROXY; выполните тест в чистой сессии |
InvalidSchema для SOCKS |
Установите requests[socks] в то же Python-окружение |
ProxyError |
Проверьте имя, порт, протокол и вложенное сообщение исключения |
407 или CONNECT с 407 внутри ProxyError |
Сверьте прокси-авторизацию, разрешённый IP и кодирование специальных символов |
| 401 | Проверьте авторизацию на целевом сайте |
| 403 | Прочитайте ответ сайта или шлюза и проверьте права и разрешённые цели |
| 429 | Остановите частые запросы, учитывайте Retry-After и лимиты сервиса |
ConnectTimeout |
Проверьте путь до прокси, порт и сеть |
ReadTimeout |
Проверьте задержку прокси и целевого сервера |
SSLError |
Проверьте имя узла, время, схему прокси и доверенные сертификаты |
Сообщение Max retries exceeded само по себе не показывает число повторов в вашем коде. Читайте вложенную причину.
Не отключайте проверку TLS для устранения SSLError. При согласованном перехвате TLS в корпоративной сети получите CA у администратора и явно передайте доверенный bundle через verify. Не загружайте сертификат из сообщения неизвестного прокси.
Ограниченные повторы GET-запросов
Повтор помогает при временном сетевом сбое. Он не исправляет неверный пароль и не добавляет права доступа. Сначала настройте один слой повторов; вложенные циклы и адаптеры умножают количество попыток.
import os
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry = Retry(
total=2,
connect=2,
read=0,
status=2,
other=0,
allowed_methods={"GET", "HEAD"},
status_forcelist=[429, 502, 503, 504],
backoff_factor=0.5,
respect_retry_after_header=True,
raise_on_status=False,
)
proxy_url = os.environ["PROXY_URL"]
with requests.Session() as session:
session.trust_env = False
session.proxies.update({"http": proxy_url, "https": proxy_url})
session.mount("https://", HTTPAdapter(max_retries=retry))
session.mount("http://", HTTPAdapter(max_retries=retry))
response = session.get("https://httpbin.org/ip", timeout=(5, 15))
response.raise_for_status()
print(response.json()["origin"])
total=2 допускает до двух повторов после первоначальной попытки. Повторы чтения отключены. При backoff_factor=0.5 первый повтор обычно выполняется без паузы, следующий получает задержку; Retry-After может задать отдельное ожидание.
Большой Retry-After может надолго увеличить ожидание: сетевой timeout не ограничивает сон между попытками. Контролируйте общий бюджет задания отдельно.
Адаптер повторяет запрос с теми же настройками прокси. Он сам не выбирает новый IP. При ротационном шлюзе провайдер может выдать другой адрес на новом соединении. Для POST сначала проверьте идемпотентность операции и механизм защиты от дублей. Значения подключения и чтения подробно разобраны в гайде по timeout в Requests.
Что записывать в журнал
Сохраняйте домен цели, HTTP-статус, тип исключения, длительность и внутренний идентификатор прокси. Удаляйте из журналов пароль, токены и cookies. Оценку прокси делайте отдельно по целям: один запрещённый ресурс не доказывает неисправность сервера.
Настройте лимит частоты для каждого целевого сервиса и конечный бюджет попыток. Универсального безопасного числа запросов в минуту нет. Если растут 403 или 429, снизьте нагрузку и выясните причину до расширения пула.
Проверка перед запуском
Убедитесь, что контрольный запрос проходит через выбранный прокси, учётные данные читаются без ошибок, а окружение не меняет маршрут. Затем проверьте cookies и поведение сессии на своей цели. Подключайте ротацию и повторы только после этой проверки.
Статью написал:
Фулстек AI-инженер
Александр привносит в инженерную команду Proxywing глубокую фулстек-экспертизу — от архитектуры бэкенда и оптимизации производительности до AI-ориентированных процессов разработки. Его практический опыт охватывает Node.js, React, облачную инфраструктуру и RAG-пайплайны, что позволяет одинаково уверенно работать как с внутренней логикой прокси-платформы, так и с пользовательской частью продукта. В Proxywing Александр сосредоточен на проектировании отказоустойчивых систем, устранении узких мест производительности и внедрении современных AI-инструментов в процесс разработки. Вне кода он увлечён исследованием передовых подходов в AI-инженерии и созданием сайд-проектов, расширяющих технические горизонты.
Все статьи автора (58)Ответы на часто задаваемые вопросы
Да. Ключи http и https применяются к URL соответствующей схемы. Схема значения задаёт подключение к прокси. Для HTTPS-сайта через HTTP-прокси значение обычно начинается с http://. SOCKS5 требует установки requests[socks].
Передайте логин и пароль в URL прокси. Закодируйте каждое значение отдельно через urllib.parse.quote(..., safe=""), чтобы специальные символы не нарушили адрес. Храните секреты отдельно от исходного кода и не выводите полный URL в журнал.
Выбор зависит от целевого сайта, региона, сессии и объёма трафика. Сравните индивидуальные и резидентские прокси ProxyWing на одинаковых разрешённых запросах. Оцените корректность ответов и стоимость. Тип IP не гарантирует отсутствие блокировок.


