Библиотека Python requests позволяет интегрировать прокси-серверы через аргумент proxies, принимающий словарь с настройками для протоколов HTTP, HTTPS и SOCKS. Это базовый инструмент для обхода географических ограничений, предотвращения блокировок по IP и распределения нагрузки при парсинге данных или автоматизации веб-действий.
Базовая настройка прокси в Python requests
Для отправки запроса через прокси-сервер необходимо создать словарь, где ключами выступают протоколы, а значениями — URL-адреса прокси. Библиотека requests автоматически выбирает нужный прокси в зависимости от схемы целевого URL (http или https).
import requests
proxies = {
'http': 'http://185.123.45.67:8080',
'https': 'http://185.123.45.67:8080',
}
response = requests.get('https://api.ipify.org?format=json', proxies=proxies)
print(response.json())
В этом примере весь трафик пойдет через указанный IP-адрес. Если прокси поддерживает только HTTP, его все равно можно использовать для доступа к HTTPS-сайтам, однако трафик между вашим скриптом и прокси-сервером в таком случае может быть не зашифрован, хотя соединение с конечным сайтом останется защищенным через TLS-туннель.
Использование системных переменных окружения
Если в коде не указан параметр proxies, requests проверяет переменные окружения HTTP_PROXY и HTTPS_PROXY. Это удобно для настройки локальной среды разработки или контейнеризации через Docker без изменения исходного кода приложения.
export HTTP_PROXY="http://user:pass@10.10.1.10:3128"export HTTPS_PROXY="http://user:pass@10.10.1.10:1080"

Протоколы и аутентификация
Большинство профессиональных прокси-провайдеров, включая GProxy, требуют аутентификацию для доступа к ресурсам. Requests поддерживает передачу учетных данных (логин и пароль) непосредственно в строке подключения.
HTTP и HTTPS прокси с авторизацией
Синтаксис для прокси с авторизацией выглядит следующим образом: http://user:password@host:port. Если в пароле присутствуют специальные символы (@, :, /), их необходимо предварительно закодировать методом URL-encoding (например, @ заменяется на %40).
proxies = {
'http': 'http://gproxy_user:strong_password@proxy.gproxy.pro:10001',
'https': 'http://gproxy_user:strong_password@proxy.gproxy.pro:10001',
}
Работа с SOCKS5
SOCKS5 — более гибкий протокол по сравнению с HTTP, так как он работает на более низком уровне и поддерживает передачу любых типов данных. Для работы с SOCKS в requests требуется установка дополнительной зависимости PySocks.
pip install requests[socks]
После установки конфигурация меняется только в схеме URL:
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
| Протокол | Преимущества | Недостатки |
|---|---|---|
| HTTP | Высокая скорость, нативная поддержка во всех библиотеках. | Передает заголовки, которые могут выдать использование прокси. |
| SOCKS5 | Анонимность, поддержка UDP, работа с любым трафиком. | Требует дополнительных библиотек, чуть медленнее из-за структуры пакетов. |
| Residential (GProxy) | Минимальный риск блокировки, реальные IP провайдеров. | Более высокая стоимость по сравнению с серверными IP. |
Продвинутое управление сессиями и ротацией
Использование requests.get() для каждого запроса неэффективно при масштабировании, так как для каждого вызова создается новое TCP-соединение. Использование объекта requests.Session() позволяет сохранять куки, переиспользовать соединения (keep-alive) и один раз настроить параметры прокси для всех последующих вызовов.
Оптимизация через Session
import requests
session = requests.Session()
session.proxies = {
'http': 'http://user:pass@proxy.gproxy.pro:10001',
'https': 'http://user:pass@proxy.gproxy.pro:10001',
}
# Все запросы через сессию используют одни и те же прокси
res1 = session.get('https://google.com')
res2 = session.get('https://bing.com')
Реализация ротации IP-адресов
При парсинге крупных площадок (Amazon, LinkedIn, Google) статичного прокси недостаточно. Существует два способа ротации:
- Внешняя ротация (GProxy Backconnect): Вы подключаетесь к одному адресу (эндпоинту), а сервер GProxy сам меняет выходной IP для каждого нового запроса или сессии. Это самый простой и надежный метод.
- Клиентская ротация: Вы имеете список из сотен прокси и переключаете их в коде Python.
import random
proxy_list = [
'http://proxy1.gproxy.pro:10001',
'http://proxy2.gproxy.pro:10002',
'http://proxy3.gproxy.pro:10003'
]
def get_random_proxy():
proxy = random.choice(proxy_list)
return {'http': proxy, 'https': proxy}
for i in range(10):
response = requests.get('https://api.ipify.org', proxies=get_random_proxy())
print(f"Запрос {i}: {response.text}")

Обработка ошибок и таймауты
Работа через прокси увеличивает вероятность сетевых сбоев. Прокси-сервер может быть перегружен, соединение может разорваться или целевой сайт может сбросить соединение. Без правильной обработки ошибок ваш скрипт остановится на середине выполнения.
Настройка таймаутов
Никогда не оставляйте запросы без параметра timeout. По умолчанию requests может ждать ответа бесконечно долго, блокируя выполнение программы.
try:
response = requests.get('https://example.com', proxies=proxies, timeout=10)
except requests.exceptions.ProxyError:
print("Ошибка прокси: проверьте доступность сервера или баланс.")
except requests.exceptions.ConnectTimeout:
print("Превышено время ожидания соединения.")
Стратегия повторных попыток (Retries)
Для автоматического перезапуска неудачных запросов рекомендуется использовать HTTPAdapter из модуля requests.adapters. Это позволяет настроить автоматические повторы при определенных кодах состояния (например, 502, 503, 504).
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
session.proxies = proxies
response = session.get('https://target-site.com')
Безопасность и SSL-сертификаты
Иногда при использовании корпоративных или отладочных прокси (например, Charles или Fiddler) возникают ошибки проверки SSL-сертификатов (SSLError). Это происходит потому, что прокси пытается перехватить трафик для анализа, подменяя сертификат сайта своим собственным.
Существует два пути решения:
- Отключение проверки (не рекомендуется):
requests.get(url, proxies=proxies, verify=False). Это делает соединение уязвимым для атак Man-in-the-Middle. - Указание пути к сертификату: Если у вашего прокси-провайдера есть собственный CA-сертификат, передайте путь к нему в параметре
verify='/path/to/cert.pem'.
При использовании GProxy и других качественных резидентных прокси такие проблемы возникают крайне редко, так как они работают в режиме прозрачного туннелирования (HTTPS CONNECT), не вмешиваясь в структуру TLS-пакетов.
Выводы
Настройка прокси в Python requests — это не только передача словаря с IP-адресом, но и грамотное управление жизненным циклом соединений, обработка исключений и выбор правильного типа протокола. Использование requests.Session() в сочетании с резидентными прокси от GProxy обеспечивает стабильность парсинга даже при работе с защищенными антифрод-системами ресурсами.
Практические советы:
- Всегда используйте
Sessionдля многократных запросов к одному домену — это ускоряет работу в 2-3 раза за счет сокращения времени на установку TCP/TLS соединений. - Для массового сбора данных выбирайте резидентные прокси с backconnect-ротацией: это избавляет от необходимости писать сложную логику переключения IP на стороне Python.
- При возникновении ошибок 407 (Proxy Authentication Required) проверяйте наличие специальных символов в пароле и кодируйте их через
urllib.parse.quote().
Читайте также
Ротация прокси в Scrapy: стратегии для обхода анти-бот систем
Использование прокси с Puppeteer для Node.js: обход ограничений
Как настроить прокси для Selenium в Python: полный гайд
Настройка прокси в Scrapy: эффективный веб-скрейпинг без блокировок
Автоматизация смены прокси: скрипты и инструменты для разных ОС
