Прокси для Python

Python — язык №1 для парсинга данных и автоматизации. Но любой скрипт рано или поздно упирается в бан по IP. Чтобы этого избежать, нужно грамотно интегрировать прокси.

В этом гайде мы разберем, как подключить прокси в четырех самых популярных сценариях: от простых запросов до управления браузером.


📌 Способ 1. Библиотека requests (Самый популярный)

Если вы пишете простой парсер или работаете с API, вы используете requests. Здесь прокси передаются через обычный словарь (dict).

Код:

import requests
# Формат: login:password@ip:port
# В CyberYozh App мы используем порт 5959 для HTTP
proxy = "http://user:pass@51.77.190.247:5959"
proxies = {
 "http": proxy,
 "https": proxy
}
try:
 # Обязательно указывайте timeout!
 response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
 print(f"Ваш IP: {response.json()['origin']}")
except Exception as e:
 print(f"Ошибка: {e}")

Совет: Не хардкодьте прокси в коде. Лучше выносить их в переменные окружения (os.getenv).

Если вы захотите использовать SOCKS5 в Python, вам нужно:

1. Установить дополнительную библиотеку: requests сам по себе не умеет работать с SOCKS. Нужно установить дополнение:

pip install requests[socks]
# или
pip install pysocks

2. Изменить схему в коде: Здесь порт и синтаксис меняется на 9595 и socks5h://.

import requests
# Используем socks5h для защиты от утечки DNS (Remote DNS resolution)
socks_proxy = "socks5h://user:pass@51.77.190.247:9595"
proxies = {
 "http": socks_proxy,
 "https": socks_proxy
}
try:
 response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
 print(f"Ваш IP через SOCKS5: {response.json()['origin']}")
except Exception as e:
 print(f"Ошибка: {e}")

🤖 Способ 2. Библиотека Selenium (Имитация браузера)

Если сайт использует сложный JavaScript (React, Vue), Single Page Application (SPA) или защиту Cloudflare, обычный requests не справится — он просто не умеет выполнять JS-код. Вам нужен Selenium, который открывает и управляет реальным браузером (Chrome/Firefox).

⚠️ Главная проблема: Авторизация

Стандартный Chrome имеет неприятную особенность: он не поддерживает передачу логина и пароля прокси через аргументы запуска. Если вы попробуете передать http://user:pass@ip:port, браузер просто проигнорирует авторизацию и покажет всплывающее окно для ввода пароля, что сломает автоматизацию.

✅ Решение: Библиотека selenium-wire

Это надстройка над обычным Selenium, которая умеет перехватывать запросы и автоматически подставлять логин и пароль прокси.

Установка:

pip install selenium-wire

Код (Правильная настройка с авторизацией):

# Обратите внимание: импортируем webdriver из seleniumwire, а не из selenium
from seleniumwire import webdriver
# Ваши данные прокси от CyberYozh App
PROXY_HOST = "51.77.190.247"
PROXY_PORT = "5959" # Порт для HTTP
PROXY_USER = "ваш_логин"
PROXY_PASS = "ваш_пароль"
# Формируем словарь настроек
proxy_options = {
 'proxy': {
 'http': f'http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
 'https': f'http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
 'no_proxy': 'localhost,127.0.0.1' # Не проксировать локальные адреса
 }
}
# Инициализируем браузер с опцией seleniumwire_options
driver = webdriver.Chrome(seleniumwire_options=proxy_options)
print("Браузер запущен, проверяем IP...")
driver.get("https://httpbin.org/ip")
# Выводим контент страницы (там должен быть ваш IP прокси)
print(driver.find_element("tag name", "body").text)
driver.quit()

Почему это работает: selenium-wire создает локальный промежуточный сервер, который берет на себя общение с вашим прокси. Браузер думает, что работает без пароля, а библиотека сама "приклеивает" нужные заголовки авторизации. Это самый надежный способ для Python.

Selenium и SOCKS5:

Так же, как и для requests, для работы selenium-wire с SOCKS-прокси нужно установить библиотеку pysocks (если она еще не стоит):

pip install pysocks
Код для SOCKS5 (Selenium Wire)

Логика остается та же: ключи словаря ('http', 'https') говорят библиотеке, какой трафик перехватывать, а значения (socks5://...) — куда его направлять.

from seleniumwire import webdriver # Импорт именно из seleniumwire!
# Ваши данные SOCKS5 прокси
PROXY_HOST = "51.77.190.247"
PROXY_PORT = "9595" # Убедитесь, что это порт именно для SOCKS5 (часто отличается от HTTP)
PROXY_USER = "ваш_логин"
PROXY_PASS = "ваш_пароль"
# Настройки
proxy_options = {
 'proxy': {
 # Схема меняется на socks5://
 'http': f'socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
 'https': f'socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
 'no_proxy': 'localhost,127.0.0.1'
 }
}
# Запуск браузера
# Можно добавить обычные опции Chrome (headless и т.д.) через chrome_options=...
driver = webdriver.Chrome(seleniumwire_options=proxy_options)
try:
 print("Браузер запущен, проверяем IP...")
 driver.get("https://httpbin.org/ip")
 # Выводим IP
 print(driver.find_element("tag name", "body").text)
 # Рекомендую проверить тип прокси на более подробном чекере
 # driver.get("https://browserleaks.com/ip")
except Exception as e:
 print(f"Ошибка: {e}")
finally:
 driver.quit()
В чем разница?

В словаре proxy_options мы поменяли схему с http:// на socks5://.

Обратите внимание на ключи словаря: Мы НЕ меняем ключи 'http' и 'https' на 'socks'.

  • Ключ 'https' означает: "Когда браузер запрашивает HTTPS сайты..."
  • Значение 'socks5://...' означает: "...отправляй их через этот SOCKS5 туннель".
А как же DNS (socks5h)?

В selenium-wire за резолвинг DNS отвечает внутренняя логика библиотеки. Обычно она сама справляется с перенаправлением DNS-запросов через прокси, если используется схема socks5, так как selenium-wire работает как Man-in-the-Middle (посредник) между браузером и интернетом.

Если вдруг вы заметите утечку DNS (ваш провайдер виден на чекерах), попробуйте в строке подключения указать socks5h://selenium-wire поддерживает этот формат благодаря библиотеке requests под капотом.


🚀 Способ 3. Библиотека aiohttp (Асинхронность)

Когда нужно спарсить 10 000 страниц за минуту, используют асинхронный подход (async/await). Здесь стандартный requests не подойдет, нужен aiohttp.

Код:

import aiohttp
import asyncio
async def fetch_ip():
 proxy_auth = aiohttp.BasicAuth('user', 'pass') # Логин и пароль отдельно
 proxy_url = "http://51.77.190.247:5959"
 async with aiohttp.ClientSession() as session:
 async with session.get("https://httpbin.org/ip",
 proxy=proxy_url,
 proxy_auth=proxy_auth) as resp:
 print(await resp.json())
asyncio.run(fetch_ip())
SOCKS5 для aiohttp

Для aiohttp ситуация немного сложнее, чем для requests. Сама по себе библиотека aiohttp не поддерживает SOCKS прокси "из коробки". Она умеет работать только с HTTP-прокси.

Чтобы "научить" её работать с SOCKS5, нужно использовать специальный коннектор.

1. Установка

Вам понадобится дополнительная библиотека-связка aiohttp-socks:

pip install aiohttp-socks
2. Код (правильный подход через Connector)

В отличие от HTTP-примера, где мы передавали прокси в каждый запрос (session.get(..., proxy=...)), для SOCKS5 мы настраиваем прокси один раз при создании сессии.

Это даже лучше для производительности (Keep-Alive соединение).

import aiohttp
import asyncio
from aiohttp_socks import ProxyConnector # Импортируем коннектор
async def fetch_ip():
 # Формируем строку подключения.
 # Обратите внимание: логин и пароль вшиваем прямо в строку URL.
 socks_url = "socks5://user:pass@51.77.190.247:9595"
 # Создаем коннектор
 # rdns=True — это аналог socks5h (защита от утечки DNS).
 # Это ОБЯЗАТЕЛЬНО для анонимности.
 connector = ProxyConnector.from_url(socks_url, rdns=True)
 # Передаем коннектор в ClientSession
 # Теперь вся эта сессия будет работать через SOCKS5
 async with aiohttp.ClientSession(connector=connector) as session:
 try:
 # ВНИМАНИЕ: Внутри .get() больше НЕ НУЖНО писать proxy=...
 # Прокси уже "вшит" в session через connector.
 async with session.get("https://httpbin.org/ip") as resp:
 print(await resp.json())
 except Exception as e:
 print(f"Ошибка: {e}")
if __name__ == '__main__':
 # Корректный запуск для Windows/Linux
 asyncio.run(fetch_ip())
🔍 В чем главные отличия от HTTP-варианта?
  1. Библиотека: Мы добавили from aiohttp_socks import ProxyConnector.
  2. Место настройки:
    • Было: session.get(..., proxy=...) (настройка в каждом запросе).
    • Стало: aiohttp.ClientSession(connector=...) (настройка всей сессии).
  3. DNS (rdns=True): Параметр rdns=True делает то же самое, что и socks5h — заставляет резолвить домены на стороне прокси, скрывая от провайдера, куда вы заходите.

Этот код идеально подойдет для парсинга 10 000 страниц, так как connector эффективно управляет пулом соединений через SOCKS-туннель.


🔧 Способ 4. Использование переменных окружения (Best Practice)

Профессиональные разработчики не пишут прокси внутри кода. Это небезопасно (если вы выложите код на GitHub, ваши прокси украдут). Python умеет автоматически подхватывать прокси из системы.

В терминале (Linux/Mac):

export HTTP_PROXY="http://user:pass@51.77.190.247:5959"

В коде:

import requests
# Никаких аргументов proxies=... передавать не нужно!
# Библиотека сама найдет настройки в системе.
requests.get("https://httpbin.org/ip") 

💡 Какой прокси выбрать для Python-скрипта?

Код — это полдела. Главное — качество самого прокси и способ управления ротацией. В зависимости от задачи, архитектура вашего скрипта будет меняться.

1. Серверные IPv4, IPv6 (Server Data Center)

Идеально для: Простых API запросов, скачивания файлов, работы с сайтами без жесткой защиты.

  • Логика в Python: Если IP попадает в бан — скриптом просто меняйте его на следующий из вашего списка прокси.
  • Плюс: Высокая скорость (до 1 Гбит/с) и низкая цена.
2. Резидентские Ротационные (Residential Rotating)

Идеально для: Жесткого парсинга (Amazon, Avito), обхода Cloudflare и сбора больших объемов данных.

  • Как работает ротация: Вам не нужно писать сложный код-ротатор. В CyberYozh App мы используем «Умный генератор кредов». Вы меняете логику поведения прокси, просто изменяя логин:
    • login-res-any: Скрипт получает новый IP на каждый запрос (requests.get).
    • login-res-any-sid-12345678: IP закрепляется за этим набором цифр (sid) на срок до 1 минуты.
    • login-resfix: Скрипт закрепляет IP за собой (Sticky Session) для авторизации.
  • Плюс для Python: Вы используете всего одну строку подключения, а получаете доступ к миллиону IP.

👉 Подробнее о ротации для резидентских прокси можно прочитать здесь.

3. Мобильные Прокси (Mobile 4G/LTE)

Идеально для: Регистрации аккаунтов, работы с соцсетями (Instagram, TikTok) и эмуляции реальных пользователей через Selenium/Appium. Самый высокий уровень траста.

Здесь есть два сценария управления в коде:

  • 🅰️ Приватные (Private): Ротация по ссылке Вы арендуете модем целиком. Чтобы сменить IP, ваш Python-скрипт должен «дернуть» специальную API-ссылку.
    • Пример логики:
      # 1. Сделали цикл действий
      do_registration()
      # 2. Перезагружаем модем через API
      requests.get("https://app.cyberyozh.com/api/v1/...")
      time.sleep(15) # Ждем, пока модем поднимется
      # 3. Начинаем новый цикл
  • 🅱️ Общие (Shared): Авто-ротация IP меняется сам по таймеру сервиса (например, каждые 5 или 30 минут).
    • Логика в Python: Вам нужно обрабатывать разрывы соединения. Если во время запроса модем ушел на перезагрузку — скрипт должен поймать ошибку ConnectionError, подождать пару секунд и повторить запрос (Retry).

👉 Подробнее о мобильных прокси можно прочитать здесь.


Заключение

Интеграция прокси в Python занимает 3-5 строк кода. Главное — выбрать правильный тип прокси под задачу и библиотеку.

👉 Готовы приступить к кодингу? В каталоге CyberYozh App вы найдете все перечисленные типы прокси. Просто выберите подходящий тариф под ваши задачи (парсинг, регистрации или серфинг), скопируйте доступы и интегрируйте их в свой проект за пару минут.