Короткие ответы
Как передать прокси в 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 не настроит рабочую задачу.
python -m pip install requests
python -c "import requests; print(requests.__version__)"- Откройте настройки подключения — на английском. Выберите пул, доступную сейчас страну и протокол HTTP.
- Задайте
PROXY_USER: полное сгенерированное имя пользователя с токенами пула, страны и ротации. Одного имени аккаунта недостаточно. - Задайте
PROXY_PASSWORD: пароль прокси. Пароль сайта и ключ API для этой цели не подходят. - Передайте значения через настройки запуска или систему секретов вашего окружения. Не сохраняйте их в репозитории, выводе команд или общих блокнотах.
Список полей есть в справочнике подключения — на английском. Если проверка через curl уже проходит, используйте в Python те же параметры. Меняйте по одному условию, чтобы результат можно было объяснить.
Выполните один запрос через HTTP-прокси
Сохраните пример как proxy_check.py. Ему нужны две переменные с учётными данными. Необязательная PROXY_SERVER содержит только схему, хост и порт. Echo-сервис вернёт IP, с которого получил запрос; это не подтверждает доступность других сайтов через тот же прокси.
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.
Разделите ожидание соединения и данных
Пара (10, 30) задаёт таймауты соединения и чтения в секундах. Это настройки примера, а не обещание скорости. Таймаут чтения ограничивает ожидание без поступления данных: он не завершает весь файл ровно через тридцать секунд. См. описание таймаутов Requests — на английском.
Для фоновой задачи задайте отдельный общий срок выполнения и ограничьте очередь. Если сервер понемногу присылает данные, загрузка может продолжаться дольше таймаута чтения. Начните с одного небольшого запроса, прежде чем добавлять параллельность, повторы и большие ответы.
Подключите SOCKS5, если он нужен приложению
python -m pip install "requests[socks]"Сохраните закодированные user и password из HTTP-примера. Замените создание адреса прокси и словаря следующими строками, а проверку, разрешающую только http://, удалите. Ключи словаря по-прежнему обозначают протокол сайта назначения.
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-сессиям.
Определите причину перед повторным запросом
| Результат | Что проверить |
|---|---|
| ProxyError или ошибка авторизации туннеля | Сверьте полное имя пользователя, текущий пароль прокси, схему и порт с новым результатом настройки подключения. |
| InvalidSchema или отсутствующая поддержка SOCKS | Установите requests[socks] в окружение, из которого запускается скрипт. |
| ConnectTimeout | Проверьте доступность хоста и порта шлюза из рабочего процесса. |
| ReadTimeout | Выполните небольшой echo-запрос перед запросом к нужному сайту. Ограничьте дальнейшие повторы. |
| SSLError | Проверьте имя сайта, системное время и файл доверенных сертификатов. Не отключайте проверку. |
| Ответ с кодом 403 или 429 | Определите, ответил шлюз или сайт назначения. Соблюдайте правила доступа и ограничения частоты сайта. |
| Ошибка разбора JSON | Тело ответа отличается от ожидаемого JSON. Проверьте код и тип содержимого, не записывая учётные данные в журнал. |
Исправьте отклонённые учётные данные до повтора запроса. Для подробной диагностики есть руководство по 407 и ошибкам CONNECT — на английском. При временном сбое разрешённого чтения ограничьте число повторов и добавьте задержку. Не повторяйте автоматически покупки, отправку форм и другие операции с побочными действиями.
После успешного echo-запроса выполните одну разрешённую операцию приложения и проверьте нужный ему ответ. Затем измерьте типичную задачу, чтобы выбрать объём ГБ. Условия есть в руководстве по учёту трафика — на английском и на странице цен — на английском.
Допустимое использование
Используйте примеры для разрешённых QA-проверок, мониторинга цен, проверки рекламы и исследований с соблюдением правил сайта назначения. Работающий прокси сам по себе не даёт разрешения собирать данные или отправлять запросы. См. политику допустимого использования — на английском.