Проксі для 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-варіанту?
-
Бібліотека: Ми додали
from aiohttp_socks import ProxyConnector. -
Місце налаштування:
-
Було:
session.get(..., proxy=...)(налаштування в кожному запиті). -
Стало:
aiohttp.ClientSession(connector=...)(налаштування всієї сесії).
-
-
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: Вам потрібно обробляти розриви з'єднання. Якщо під час запиту модем пішов на перезавантаження — скрипт повинен зловити помилку
👉 Докладніше про мобільні проксі можна прочитати тут.
Висновок
Інтеграція проксі в Python займає 3-5 рядків коду. Головне — вибрати правильний тип проксі під завдання та бібліотеку.
👉 Готові приступити до кодингу? У каталозі CyberYozh App ви знайдете всі перелічені типи проксі. Просто виберіть відповідний тариф під ваші завдання (парсинг, реєстрації або серфінг), скопіюйте доступи та інтегруйте їх у свій проєкт за пару хвилин.