Налаштування проксі в aiohttp

Проксі в aiohttp для Python: параметр proxy в запиті, логін і пароль в адресі, SOCKS5 через aiohttp-socks і вибір порту для паралельних запитів.

Оновлено · Редакція Prokso

Дані для підключення
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новий IP на кожен запит · 10000–20000 фіксований IP (sticky-сесія), HTTP(S) і SOCKS5
Логін і пароль
у кабінеті, на сторінці плану

Готові рядки у потрібному форматі генерує кабінет: оберіть країну, тип IP і протокол.

Коротко
  • Хост — gw.prokso.com, порти 823 (HTTP), 824 (SOCKS5), 10000–20000 (фіксований IP, HTTP або SOCKS5)
  • Логін і пароль — у кабінеті на сторінці плану
  • Перевіряйте IP у відповіді самого запиту через проксі: сторінка «Мій IP» у браузері ваш скрипт не перевіряє
Проксі в aiohttp: коротка відеоінструкція · 0:33

Покрокова інструкція, як підключити проксі Prokso в aiohttp. Займе кілька хвилин.

Крок 1. Візьміть дані проксі в особистому кабінеті

Відкрийте план і скопіюйте хост gw.prokso.com, порт, логін і пароль. Порт 823 — HTTP, 824 — SOCKS5 (обидва дають новий IP на кожен запит); порти 10000–20000 — фіксований IP (sticky-сесія) до 120 хвилин, працюють і як HTTP, і як SOCKS5 (кожен порт — окрема адреса). Країну задають у логіні: логін__cr.ua.

Блок «Доступ» на сторінці плану: хост, порти, логін і пароль для рядка проксі
Блок «Доступ» на сторінці плану: хост, порти, логін і пароль для рядка проксі

Крок 2. Встановіть бібліотеку

pip install aiohttp. Для SOCKS5 додатково знадобиться pip install aiohttp-socks.

Крок 3. Передайте проксі в запит

aiohttp приймає HTTP-проксі в параметрі proxy кожного запиту. Логін і пароль впишіть просто в адресу.

import asyncio
import aiohttp

PROXY = "http://ЛОГІН:ПАРОЛЬ@gw.prokso.com:823"


async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://api.ipify.org?format=json", proxy=PROXY) as r:
            print(await r.json())


asyncio.run(main())
Приклад запуску: у виводі — IP проксі, а не ваш. На порту 823 кожен запуск дає нову адресу
Приклад запуску: у виводі — IP проксі, а не ваш. На порту 823 кожен запуск дає нову адресу

Крок 4. SOCKS5 через aiohttp-socks

Сам aiohttp SOCKS не підтримує. Створіть ProxyConnector з пакета aiohttp-socks і передайте його сесії — тоді всі запити сесії підуть через SOCKS5.

import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector


async def main():
    connector = ProxyConnector.from_url("socks5://ЛОГІН:ПАРОЛЬ@gw.prokso.com:824")
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get("https://api.ipify.org?format=json") as r:
            print(await r.json())


asyncio.run(main())

Крок 5. Багато запитів одночасно

Для паралельного збору даних беріть порт 823 (або 824 для SOCKS5): кожен запит отримає нову адресу. Щоб тримати один IP для серії запитів, використовуйте фіксований порт 10000–20000.

Крок 6. Перевірте вивід

Запустіть приклад: скрипт звертається до https://api.ipify.org і друкує IP, який бачить сайт. Це має бути адреса проксі, а не ваша. Помилка 407 означає неправильний логін або пароль. Сторінка «Мій IP» у браузері тут не допоможе: браузер іде напряму.

Обмеження паралельності й тайм-аути

aiohttp легко запускає тисячі запитів одночасно, і саме це найчастіше призводить до помилок 429 і тайм-аутів. Обмежте кількість одночасних запитів семафором і задайте загальний тайм-аут сесії:

import asyncio
import aiohttp

PROXY = "http://USERNAME:PASSWORD@gw.prokso.com:823"
URLS = ["https://prokso.com/ip"] * 20


async def fetch(session, sem, url):
    async with sem:                                   # no more than 10 requests at once
        async with session.get(url, proxy=PROXY) as r:
            return r.status, await r.text()


async def main():
    sem = asyncio.Semaphore(10)
    timeout = aiohttp.ClientTimeout(total=30)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        results = await asyncio.gather(*(fetch(session, sem, u) for u in URLS), return_exceptions=True)
    print(results)


asyncio.run(main())

return_exceptions=True не дає одному збійному запиту скасувати решту: помилки повернуться у списку результатів, і їх можна повторити окремо.

Що означають помилки

  • ClientHttpProxyError, статус 407. Проксі не прийняв логін або пароль чи закінчився трафік.
  • ClientProxyConnectionError. Не вдалося з'єднатися з проксі: перевірте хост і порт.
  • asyncio.TimeoutError. Запит не вклався в тайм-аут. Повторіть його або збільште межу.
  • ServerDisconnectedError. З'єднання обірвалося. Зазвичай допомагає повтор і менша паралельність.

Коди 403 і 429 надходять від сайту — що з ними робити, описано на сторінці помилки 429.

Один IP для групи запитів

Кожен запит на порту 823 іде з нового IP. Якщо кілька запитів мають іти з однієї адреси — вхід, потім сторінки акаунта — використовуйте для них фіксований порт і окрему сесію: так cookie та IP залишаться узгодженими.

Питання й відповіді

Чи бере aiohttp проксі зі змінних середовища?

Лише якщо створити сесію з параметром <code>trust_env=True</code> — тоді він прочитає HTTP_PROXY і HTTPS_PROXY. Надійніше передавати проксі явно, як у прикладі.

Скільки одночасних запитів можна запускати?

План дозволяє до 1000 одночасних з'єднань. Обмежуйте паралельність у коді (наприклад, семафором), щоб не перевищити ліміт і не перевантажити цільовий сайт.

Чи можна задати проксі один раз для всієї сесії?

В актуальних версіях aiohttp параметр <code>proxy</code> приймає і сама сесія. У старих версіях його потрібно передавати в кожен запит.

Як закодувати спецсимволи в паролі?

Пропустіть логін і пароль через <code>urllib.parse.quote(..., safe="")</code> або передайте їх окремо через <code>proxy_auth=aiohttp.BasicAuth(...)</code>.