Настройка прокси в Python requests

Прокси в Python requests: словарь proxies, SOCKS5 через socks5h, новый IP на каждый запрос (823) или один IP для сессии, проверка через api.ipify.org.

Обновлено · Редакция Prokso

Данные для подключения
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новый IP на каждый запрос · 10000–20000 фиксированный IP (sticky-сессия), HTTP(S) и SOCKS5
Логин и пароль
в кабинете, на странице плана

Готовые строки в нужном формате генерирует кабинет: выберите страну, тип IP и протокол.

Коротко
  • Хост — gw.prokso.com, порты 823 (HTTP), 824 (SOCKS5), 10000–20000 (фиксированный IP, HTTP или SOCKS5)
  • Логин и пароль — в кабинете на странице плана
  • Проверяйте IP в ответе самого запроса через прокси: страница «Мой IP» в браузере ваш скрипт не проверяет
Прокси в Python requests: короткая видеоинструкция · 0:36

Пошаговая инструкция, как подключить прокси Prokso в Python requests. Займёт несколько минут.

Шаг 1. Возьмите данные прокси в кабинете

Откройте план и скопируйте хост gw.prokso.com, порт, логин и пароль. Порт 823 — HTTP, 824 — SOCKS5 (оба дают новый IP на каждый запрос); порты 10000–20000 — фиксированный IP до 120 минут, работают и как HTTP, и как SOCKS5 (каждый порт — отдельный адрес). Страну задают в логине: логин__cr.ua.

Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси
Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси

Шаг 2. Установите библиотеку

Нужен Python 3 и библиотека requests: pip install requests. Для SOCKS5 — pip install "requests[socks]".

Шаг 3. Передайте прокси в запрос

Укажите прокси в словаре proxies для http и https. Код ниже выведет IP-адрес, с которого сайт видит запрос.

import requests

proxy = "http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
print(r.json())

Шаг 4. SOCKS5 и фиксированный IP

Для SOCKS5 замените схему на socks5h:// и порт на 824. Чтобы несколько запросов шли с одного IP, используйте порт 10000–20000 вместо 823 или 824 — он работает и с http://, и с socks5h://.

# pip install "requests[socks]"
proxy = "socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824"   # socks5h — DNS тоже через прокси

Шаг 5. Проверьте вывод скрипта

Запустите код из шага 3: он запрашивает https://api.ipify.org через прокси и печатает {"ip": "…"} — адрес, который видит сайт. Он должен отличаться от вашего. Запустите дважды: на 823 IP сменится, на фиксированном порту останется тем же. Страница «Мой IP» в браузере здесь не подходит — браузер идёт без этого прокси.

Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес
Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес

Сессия, тайм-ауты и повторы

Для серии запросов создайте requests.Session() и задайте прокси один раз: сессия переиспользует соединения и работает заметно быстрее. Тайм-аут ставьте всегда — без него зависший запрос остановит скрипт навсегда. Через резидентские и мобильные адреса ответ идёт дольше, чем напрямую, поэтому 30 секунд — разумная отправная точка.

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

proxy = "http://USERNAME:PASSWORD@gw.prokso.com:823"

s = requests.Session()
s.proxies = {"http": proxy, "https": proxy}
# retry only temporary failures, with a growing pause
retry = Retry(total=3, backoff_factor=1, status_forcelist=[502, 503, 504])
s.mount("http://", HTTPAdapter(max_retries=retry))
s.mount("https://", HTTPAdapter(max_retries=retry))

r = s.get("https://prokso.com/ip", timeout=30)
print(r.status_code, r.text)

Повторять стоит только временные сбои: 502, 503, 504 и тайм-ауты. На порту 823 каждый повтор уйдёт с нового IP. Коды 403 и 429 приходят от сайта: мгновенный повтор их не исправит и только потратит трафик.

Что означают ошибки

  • ProxyError с кодом 407. Прокси не принял логин или пароль. Проверьте строку и остаток трафика на плане.
  • ConnectTimeout. Скрипт не достучался до прокси: проверьте хост и порт и не закрыт ли порт в вашей сети.
  • ReadTimeout. Прокси доступен, но сайт не ответил вовремя. Увеличьте тайм-аут или повторите запрос.
  • Missing dependencies for SOCKS support. Не установлен пакет для SOCKS: выполните pip install "requests[socks]".

Расшифровка кодов ответа — на странице коды ошибок прокси.

Как тратить меньше трафика

Трафик считается по объёму ответов. Запрашивайте данные через API сайта, если он есть: JSON весит в разы меньше HTML-страницы. Не скачивайте повторно то, что уже получили, и не загружайте картинки, если нужен только текст. Оценить объём заранее поможет калькулятор трафика.

Вопросы и ответы

Как сделать много потоков?

Используйте concurrent.futures или asyncio с aiohttp. Каждый поток может идти через тот же порт 823 — IP будет разный.

Почему requests идёт через прокси, хотя я его не задавал?

Библиотека читает переменные окружения <code>HTTP_PROXY</code> и <code>HTTPS_PROXY</code>. Чтобы отключить это, задайте у сессии <code>trust_env = False</code>.

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

Пропустите логин и пароль через <code>urllib.parse.quote(..., safe="")</code> перед тем, как собирать адрес прокси. Иначе символы <code>@</code> и <code>:</code> сломают разбор адреса.

Как задать страну в коде?

Страна записана в логине, например <code>USERNAME__cr.de</code>. Меняйте логин — адрес и порт остаются прежними.