Перейти к содержанию

Руководство · На русском

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

Подключите прокси с авторизацией, проверьте запрос из того же процесса, где работает ваша задача, и определите причину ошибки. Примеры охватывают HTTP, SOCKS5, таймауты и Session. Пароль остаётся в настройках запуска, а не в исходном коде.

Инструкции в этом разделе — на русском. Магазин, личный кабинет, документация и условия заказа пока доступны на английском.

Опубликовано:

Короткие ответы

Как передать прокси в Python Requests?

Передайте в запрос словарь proxies с ключами http и https. Значение каждого ключа — полный URL прокси. Ключ обозначает протокол сайта назначения, значение — способ подключения к шлюзу.

Почему для HTTPS указан прокси с http://?

Requests открывает туннель CONNECT через HTTP-прокси и затем устанавливает HTTPS-соединение с сайтом. Для HTTP-шлюза на порту 7000 оставьте схему http://. Проверка сертификата сайта продолжает действовать.

Как добавить пароль со специальными символами?

Считайте исходные имя пользователя и пароль из настроек запуска. Закодируйте каждый компонент один раз через urllib.parse.quote(value, safe=""). Не кодируйте URL целиком и не кодируйте повторно уже подготовленные значения.

Сохраняет ли Requests Session один IP?

Нет. Session управляет cookie и повторным использованием соединений. Ротация шлюза задаётся отдельно в имени пользователя. Sticky-сессия сохраняет устройство, пока оно доступно, но его IP может измениться.

Если ваш код использует Client или AsyncClient из HTTPX, откройте руководство по HTTPX. У этой библиотеки другие параметры настройки прокси.

Подготовьте Python и настройки подключения

Установите Requests в окружение, из которого запускается приложение. Проверьте интерпретатор контейнера, виртуального окружения или ядра Jupyter: установка пакета в другой Python не настроит рабочую задачу.

Установка и проверка версииsh
python -m pip install requests
python -c "import requests; print(requests.__version__)"
  1. Откройте настройки подключения — на английском. Выберите пул, доступную сейчас страну и протокол HTTP.
  2. Задайте PROXY_USER: полное сгенерированное имя пользователя с токенами пула, страны и ротации. Одного имени аккаунта недостаточно.
  3. Задайте PROXY_PASSWORD: пароль прокси. Пароль сайта и ключ API для этой цели не подходят.
  4. Передайте значения через настройки запуска или систему секретов вашего окружения. Не сохраняйте их в репозитории, выводе команд или общих блокнотах.

Список полей есть в справочнике подключения — на английском. Если проверка через curl уже проходит, используйте в Python те же параметры. Меняйте по одному условию, чтобы результат можно было объяснить.

Выполните один запрос через HTTP-прокси

Сохраните пример как proxy_check.py. Ему нужны две переменные с учётными данными. Необязательная PROXY_SERVER содержит только схему, хост и порт. Echo-сервис вернёт IP, с которого получил запрос; это не подтверждает доступность других сайтов через тот же прокси.

proxy_check.pypython
import os
from urllib.parse import quote

import requests

server = os.environ.get("PROXY_SERVER", "http://gw.portproof.org:7000")
if not server.startswith("http://") or "@" in server:
    raise SystemExit("Use an HTTP server address without credentials")

user = quote(os.environ["PROXY_USER"], safe="")
password = quote(os.environ["PROXY_PASSWORD"], safe="")
proxy = f"http://{user}:{password}@{server.removeprefix('http://')}"
proxies = {"http": proxy, "https": proxy}

try:
    with requests.Session() as session:
        session.trust_env = False
        session.verify = os.environ.get("REQUESTS_CA_BUNDLE") or True
        response = session.get(
            "https://api.portproof.org/v1/echo-ip",
            proxies=proxies,
            timeout=(10, 30),
        )
        response.raise_for_status()
        payload = response.json()
        if not isinstance(payload.get("ip"), str):
            raise ValueError("The endpoint did not return an IP address")
        print("HTTP", response.status_code, "exit", payload["ip"])
except requests.RequestException as error:
    raise SystemExit(f"Request failed: {type(error).__name__}") from None

Запустите python proxy_check.py. При успехе появятся HTTP-код и ваш выходной адрес. Сообщения самого скрипта оставлены на английском, как в проверенном исходном примере. URL прокси и полный текст сетевого исключения не выводятся: они могут содержать сведения, которым не место в общем журнале.

Словарь соответствует интерфейсу Requests. Для имени и пароля используется кодирование компонентов URL в Python: пустое значение safe кодирует и косую черту в пароле. Обе ссылки ведут на английскую документацию.

Проверьте настройки рабочего процесса

В примере прокси указан прямо в запросе, а trust_env выключен. Requests не подхватывает прокси и стандартную авторизацию из окружения. При этом строка session.verify явно подключает заданный файл сертификатов; без него используется обычная проверка доверия. Подробности есть в описании Session — на английском.

Если организация централизованно управляет исходящими подключениями, соблюдайте её настройки. Не копируйте переопределение без проверки. Выберите один источник конфигурации и повторите тест в развёрнутом приложении. Проверяйте наличие нужных переменных, но не печатайте всё окружение в журнал. Различия контейнера и терминала разобраны в руководстве по настройкам приложения — на английском.

Убедитесь, какой маршрут использует Requests

Значение Session.proxies не всегда определяет маршрут. 30 сентября 2026 года мы проверили два локальных прокси с авторизацией и локальный сайт: Python 3.12.14, Requests 2.34.2, urllib3 2.8.0. Запросы выполнялись с тестовыми учётными данными и выключенными перенаправлениями. Рабочие пулы Portproof в этом эксперименте не использовались.

Маршруты, зафиксированные локальным тестом
НастройкаФактический маршрут
Прокси из окружения и другой адрес в Session.proxiesПрокси из окружения
Прокси из окружения и proxies в вызове get()Прокси из параметра запроса
trust_env=False и заполненный Session.proxiesПрокси сессии
Прокси из окружения и совпадающий NO_PROXY, без явных настроекПрямое подключение к локальному сайту
Совпадающий NO_PROXY и явно заданный прокси сессии или запросаЯвно заданный прокси

В этих проверках NO_PROXY не отменил явно заданный прокси. Если часть адресов должна открываться напрямую, реализуйте выбор маршрута в приложении и проверьте оба варианта. Не считайте переменную окружения универсальным исключением. Приоритет настроек описан в документации Requests — на английском.

HTTPS-проверки подтвердили роль session.verify: при trust_env=False одной переменной REQUESTS_CA_BUNDLE оказалось недостаточно — возник SSLError. Передача того же файла в session.verify позволила подключиться с включённой проверкой TLS.

Результаты относятся к первому запросу в указанных версиях, локальным HTTP-прокси и выключенным перенаправлениям. Эксперимент не проверял перенаправления, SOCKS, TLS-соединение с самим прокси, доступность или скорость рабочего шлюза.

Разделите ожидание соединения и данных

Пара (10, 30) задаёт таймауты соединения и чтения в секундах. Это настройки примера, а не обещание скорости. Таймаут чтения ограничивает ожидание без поступления данных: он не завершает весь файл ровно через тридцать секунд. См. описание таймаутов Requests — на английском.

Для фоновой задачи задайте отдельный общий срок выполнения и ограничьте очередь. Если сервер понемногу присылает данные, загрузка может продолжаться дольше таймаута чтения. Начните с одного небольшого запроса, прежде чем добавлять параллельность, повторы и большие ответы.

Оставьте проверку TLS включённой. При ошибке сертификата проверьте имя сайта и цепочку доверия. Отключение проверки не исправляет авторизацию прокси.

Подключите SOCKS5, если он нужен приложению

Дополнительная поддержка SOCKSsh
python -m pip install "requests[socks]"

Сохраните закодированные user и password из HTTP-примера. Замените создание адреса прокси и словаря следующими строками, а проверку, разрешающую только http://, удалите. Ключи словаря по-прежнему обозначают протокол сайта назначения.

Замена настроек для SOCKS5python
proxy = f"socks5h://{user}:{password}@gw.portproof.org:7001"
proxies = {"http": proxy, "https": proxy}

Схема socks5h передаёт разрешение имени сайта прокси, а socks5 оставляет его клиенту. Выберите нужный вариант и повторите echo-запрос. Если приложение поддерживает оба протокола, используйте сравнение HTTP и SOCKS5.

Не путайте Session и sticky-сессию шлюза

Используйте одну Python Session для связанной последовательности запросов и закрывайте её после окончания работы. Не смешивайте cookie независимых задач. Для многошаговой операции выберите sticky-сессию в настройках подключения и сохраняйте одно и то же полное имя пользователя до её завершения.

Новый вызов Python не обязательно открывает новое сетевое соединение: Session может использовать прежний туннель. Поэтому нельзя проверять ротацию, требуя другой IP после каждого session.get. Совпадение адреса само по себе тоже не доказывает ошибку маршрута. Подробности — в руководстве по ротации и sticky-сессиям.

Определите причину перед повторным запросом

Ошибки Python и первая проверка
РезультатЧто проверить
ProxyError или ошибка авторизации туннеляСверьте полное имя пользователя, текущий пароль прокси, схему и порт с новым результатом настройки подключения.
InvalidSchema или отсутствующая поддержка SOCKSУстановите requests[socks] в окружение, из которого запускается скрипт.
ConnectTimeoutПроверьте доступность хоста и порта шлюза из рабочего процесса.
ReadTimeoutВыполните небольшой echo-запрос перед запросом к нужному сайту. Ограничьте дальнейшие повторы.
SSLErrorПроверьте имя сайта, системное время и файл доверенных сертификатов. Не отключайте проверку.
Ответ с кодом 403 или 429Определите, ответил шлюз или сайт назначения. Соблюдайте правила доступа и ограничения частоты сайта.
Ошибка разбора JSONТело ответа отличается от ожидаемого JSON. Проверьте код и тип содержимого, не записывая учётные данные в журнал.

Исправьте отклонённые учётные данные до повтора запроса. Для подробной диагностики есть руководство по 407 и ошибкам CONNECT — на английском. При временном сбое разрешённого чтения ограничьте число повторов и добавьте задержку. Не повторяйте автоматически покупки, отправку форм и другие операции с побочными действиями.

После успешного echo-запроса выполните одну разрешённую операцию приложения и проверьте нужный ему ответ. Затем измерьте типичную задачу, чтобы выбрать объём ГБ. Условия есть в руководстве по учёту трафика — на английском и на странице цен — на английском.

Допустимое использование

Используйте примеры для разрешённых QA-проверок, мониторинга цен, проверки рекламы и исследований с соблюдением правил сайта назначения. Работающий прокси сам по себе не даёт разрешения собирать данные или отправлять запросы. См. политику допустимого использования — на английском.

Следующий шаг

Настройка прокси в Python Requests · Portproof