ProxyWing

Как использовать прокси с Python Requests

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

Опубликовано: 6 июня 2026 г.
Время чтения: 10 мин
Обновлено: 26 октября 2026 г.
Что требуется перед началом работы

Прокси меняет маршрут запроса и выходной 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.

Маршрут HTTPS через HTTP CONNECT и разрешение DNS при SOCKS5h в Requests
Ключ https применяется к URL со схемой https. Схема значения задаёт протокол подключения к прокси. При socks5h имя разрешает прокси.

Окружение и отключение прокси

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 и поведение сессии на своей цели. Подключайте ротацию и повторы только после этой проверки.

Статью написал:

Alexandre Parfonov

Фулстек 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 не гарантирует отсутствие блокировок.