Проксі для 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 ви знайдете всі перелічені типи проксі. Просто виберіть відповідний тариф під ваші завдання (парсинг, реєстрації або серфінг), скопіюйте доступи та інтегруйте їх у свій проєкт за пару хвилин.