Работа с прокси в Python

Веб-прокси Proxypy: как использовать прокси в Python

Proxypy — частый поисковый запрос Python-разработчиков, которым нужен локальный веб-прокси, обработчик прокси на Python или способ направить трафик приложения через внешний прокси-сервер. На этой странице разобраны основные шаблоны работы с прокси в Python: от простых настроек requests до urllib ProxyHandler, переменных окружения, настройки SOCKS5 и диагностики в продакшене.

В Python есть три основных способа настроить прокси: (1) библиотека requests: словарь proxies с URL прокси для HTTP и HTTPS; (2) urllib.request.ProxyHandler: более старый подход из стандартной библиотеки, который работает без внешних зависимостей; (3) переменные окружения HTTP_PROXY и HTTPS_PROXY, которые requests и urllib подхватывают автоматически без изменения кода. Для SOCKS5 в requests установите дополнение requests[socks] или PySocks. Перед запуском продакшен-парсинга всегда проверяйте выходной IP.

Проверено:

Шаблоны прокси в Python: библиотека requests

HTTP/HTTPS-прокси в requests

import requests; proxies = {'http': 'http://user:pass@host:port', 'https': 'http://user:pass@host:port'}; response = requests.get(url, proxies=proxies). Если авторизация не нужна, уберите user:pass@. Чтобы задать прокси один раз для всей сессии, используйте requests.Session().

SOCKS5-прокси в requests

Установка: pip install requests[socks]. Использование: proxies = {'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port'}. Чтобы DNS шёл через SOCKS5 (без утечки DNS), используйте socks5h:// вместо socks5://. Буква «h» означает, что разрешение имён хостов делегируется прокси-серверу.

Переменные окружения

export HTTP_PROXY=http://user:pass@host:port; export HTTPS_PROXY=http://user:pass@host:port. И requests, и urllib читают их автоматически. Удобно для CI/CD или файлов .env, когда не хочется менять код приложения.

Шаблоны прокси в Python: urllib ProxyHandler

Базовый ProxyHandler

import urllib.request; proxy_handler = urllib.request.ProxyHandler({'http': 'http://user:pass@host:port', 'https': 'http://user:pass@host:port'}); opener = urllib.request.build_opener(proxy_handler); urllib.request.install_opener(opener). После install_opener все вызовы urllib.request.urlopen используют прокси.

ProxyBasicAuthHandler

Для прокси, которым нужна Basic-авторизация через заголовок Proxy-Authorization (встречается реже): proxy_auth = urllib.request.ProxyBasicAuthHandler(); proxy_auth.add_password(realm=None, uri='host:port', user='user', passwd='pass'); создайте opener с обоими обработчиками.

Когда urllib, а когда requests

urllib работает без внешних зависимостей и подходит для простой маршрутизации через прокси. requests проще, лучше поддерживает SOCKS5 и удобнее работает с сессиями. Используйте urllib, только если внешние пакеты недопустимы.

Что на самом деле означают запросы про Proxypy web proxy

Шаблон локального веб-прокси

Веб-прокси в духе Proxypy — это локальный HTTP-прокси-сервер (на localhost), который перехватывает трафик браузера или скрипта и пересылает его через вышестоящий прокси. Полезен для отладки заголовков, изменения запросов на лету или централизации настроек прокси для нескольких скриптов.

Для большинства парсеров на Python локальный прокси не нужен

Для парсинга и автоматизации на Python с requests или Scrapy локальный прокси почти не нужен: обе библиотеки сами работают с вышестоящими HTTP- и SOCKS5-прокси. Дополнительный слой пересылки добавляет задержку и сложность, а реальной пользы в большинстве продакшен-сценариев не даёт.

Шаблон ротатора вышестоящих прокси

Для парсинга в несколько воркеров с ротацией IP держите список прокси в приложении, а не используйте локальный веб-прокси. Каждый воркер выбирает прокси из пула по кругу или случайно. Либо используйте backconnect-сервис прокси, который ротирует IP на стороне сервера.

Проверка и диагностика в Python

Проверка выходного IP из кода

import requests; r = requests.get('https://api.ipify.org?format=json', proxies=proxies); print(r.json()['ip']). Убедитесь, что показанный IP — адрес прокси, а не ваш. Делайте это перед любым продакшен-обходом.

Обработка ошибок прокси

requests.exceptions.ProxyError — проблема подключения к прокси-серверу. requests.exceptions.ConnectTimeout — прокси не ответил вовремя. ConnectionRefusedError — неверный порт или IP не в белом списке. Для временных ошибок добавьте повторные попытки с экспоненциальной задержкой.

Проверка ротации IP

Отправьте несколько запросов к API проверки IP через прокси с ротацией между каждым из них и сравните IP в ответах. Если все запросы возвращают один и тот же IP, ротация не работает: проверьте, вызывали ли вы эндпоинт ротации между запросами.

Проверьте конфигурацию прокси в Python, прежде чем масштабировать на продакшен

Документация по интеграции с Python

Частые вопросы о прокси в Python

01Proxypy — это продукт Proxy Poland?

Нет: proxypy — общий поисковый запрос Python-разработчиков, которые ищут решения для работы с прокси. На этой странице объясняется, как использовать прокси в Python и как подключить мобильный прокси как вышестоящий для ваших скриптов.

02Как использовать SOCKS5-прокси в Python requests?

Установите: pip install requests[socks]. Затем: proxies = {'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port'}. Чтобы DNS шёл через SOCKS5 (без утечки DNS), используйте socks5h://: буква «h» означает, что имя хоста разрешается на стороне прокси-сервера.

03Зачем использовать вышестоящий мобильный прокси вместо дата-центра?

IP дата-центров легко распознать: их диапазоны ASN общедоступны и блокируются Cloudflare, DataDome и большинством крупных платформ. IP мобильных операторов принадлежат тем же диапазонам, которыми пользуются миллионы обычных владельцев смартфонов. Заблокировать их без ущерба для реальных пользователей гораздо сложнее.

04Как обработать ProxyError в Python requests?

ProxyError означает, что подключиться к прокси-серверу не удалось. Проверьте: (1) верные ли хост и порт; (2) требования к белому списку IP; (3) актуальность учётных данных; (4) открыт ли порт прокси (telnet host port). Для временных ошибок добавьте повторные попытки: from requests.adapters import HTTPAdapter, Retry.

05Чем отличаются socks5 и socks5h в URL прокси?

socks5:// — DNS разрешается на стороне клиента (в вашем скрипте) до отправки через прокси. socks5h:// — DNS разрешается на стороне сервера (имя хоста разрешает прокси). Используйте socks5h://, чтобы не допустить утечки DNS и скрыть имена хостов от вашей локальной сети.