Посібник з Python · 2 хв читання

Як робити ротацію проксі в Python (requests і aiohttp)

Ротація — це різниця між скрапером, що ловить бан на одну IP, і тим, який розподіляє навантаження між багатьма. Показуємо робочий ротатор для синхронного requests і асинхронного aiohttp, із перевіркою живучості й автоматичним виведенням мертвих вузлів.

Що насправді дає ротація

Сайти обмежують і банять за IP. Якщо всі запити виходять з однієї адреси, ліміт настає швидко, а один бан зупиняє всю роботу. Ротація розкидає запити по пулу виходів: навантаження на кожен IP лишається під порогом, а мертвий чи заблокований вихід коштує вам лише повторної спроби, а не всього запуску. Двох схем вистачає майже на все: round-robin (перебираємо пул по колу — передбачувано й рівномірно) та random (обираємо на кожен запит — просто й без стану).

Сам пул можна взяти з двох місць. Можна перелічити кілька ендпоінтів і портів s4m і ротувати між ними, а для швидких неважливих тестів — витягнути живі записи з безкоштовного публічного списку проксі з фільтрами за країною, протоколом і анонімністю; щоправда, ці сторонні проксі використовуються на власний ризик і часто вмирають. Продакшн-ротація має спиратися на автентифіковані проксі дата-центру від s4m (SOCKS5 на 1080, HTTP на 3128, USER:PASS): вони тримаються й тарифікуються за трафіком, тож розширювати пул дешево. Це пряме продовження гайда скрапінг за допомогою requests.

Ротатор для requests і aiohttp

Пул, який ходить по колу, повторює запит після збою та списує виходи, що падають раз за разом. Синхронна й асинхронна версії. Підставте свої USER:PASS.

python
import asyncio, itertools, random
import requests, aiohttp
from aiohttp_socks import ProxyConnector  # pip install aiohttp-socks

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",
    f"http://{USER}:{PASS}@{HOST}:3128",
    # add more endpoints/ports here to widen the pool
]

# ---------- Synchronous: requests + round-robin + retirement ----------
class Rotator:
    def __init__(self, pool):
        self.alive = list(pool)
        self.fails = {p: 0 for p in pool}
        self._cycle = itertools.cycle(self.alive)

    def pick(self):
        return next(self._cycle)

    def retire(self, proxy):
        self.fails[proxy] += 1
        if self.fails[proxy] >= 3 and proxy in self.alive:
            self.alive.remove(proxy)
            self._cycle = itertools.cycle(self.alive or POOL)

def get(url, rot, retries=4):
    for _ in range(retries):
        proxy = rot.pick()
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy},
                             timeout=(5, 20))
            r.raise_for_status()
            return r
        except requests.RequestException:
            rot.retire(proxy)
    raise SystemExit("pool exhausted")

rot = Rotator(POOL)
print(get("https://api.ipify.org", rot).text)

# ---------- Async: aiohttp, one connector per proxy ----------
async def fetch(url, proxy):
    connector = ProxyConnector.from_url(proxy)
    async with aiohttp.ClientSession(connector=connector) as s:
        async with s.get(url, timeout=aiohttp.ClientTimeout(total=25)) as r:
            return await r.text()

async def main():
    tasks = [fetch("https://api.ipify.org", random.choice(POOL))
             for _ in range(5)]
    for ip in await asyncio.gather(*tasks, return_exceptions=True):
        print(ip)

asyncio.run(main())

Рішення, які справді важать

Налаштування, від яких залежить, чи ротація допоможе, чи лише додасть метушні.

Round-robin проти random

Round-robin розподіляє навантаження рівномірно, і його легко тримати в голові; random не має стану й простіший. Обидва кращі за один фіксований вихід — беріть round-robin, коли важлива рівномірність.

Списуйте мертві виходи

Рахуйте невдачі поспіль для кожного проксі й викидайте вихід після кількох промахів — тоді пул лікує себе сам, а не б'ється вічно в мертву адресу.

Перевіряйте перед використанням

Періодично звертайтеся через кожен проксі до ендпоінта, що повертає ваш IP, і лишайте тільки ті, що відповідають. Обов'язково, якщо в пулі є нестабільні записи з безкоштовного списку.

Відступайте, а не женіть

Ротація — не дозвіл заливати сайт запитами. Додайте паузи для кожного хоста й експоненційний відступ, щоб триматися під лімітами, а не воювати з ними одразу з багатьох IP.

Липкі сесії та чесні межі

Ротація потрібна не завжди. Деякі сценарії — вхід в акаунт, кошик, багатокрокова форма — вимагають одного IP на всю сесію, інакше сайт бачить користувача, який телепортується між адресами, і блокує його. Це і є липка сесія: ротуйте між задачами й тримайте фіксований вихід усередині однієї. Коли процесу потрібна одна гарантовано стабільна адреса, замість ротації додайте виділений персональний IP.

Про стелю чесно. Проксі s4m — дата-центрові, тож ротація допомагає з лімітами запитів і рівномірним навантаженням, але не сховає IP дата-центру від антибот-системи, яка блокує весь діапазон. Ротація так само нічого не робить із відбитком браузера чи патернами запитів. Сприймайте її як один шар: додайте правдоподібні заголовки, відступи й повагу до правил кожного сайту. Для асинхронної частини знадобиться aiohttp-socks для підтримки SOCKS5; перевіряйте виходи інструментами, а роботу з обліковими даними автоматизуйте через API.

FAQ

Відповіді на питання

Як ротувати проксі з requests?

Тримайте список URL проксі й обирайте один на кожен запит — по колу або випадково — передаючи його в аргументі proxies. Списуйте вихід після кількох невдач поспіль, щоб пул лікував себе сам. Приклад вище — повноцінний ротатор.

Як ротувати проксі з aiohttp?

Для HTTP aiohttp задає проксі на кожен запит, а для SOCKS5 доводиться створювати ProxyConnector (з aiohttp-socks) під кожен проксі й робити з ним сесію. Розкидайте задачі по пулу через asyncio.gather.

Коли ротувати проксі НЕ треба?

Коли процесу потрібна стала особистість — входи в акаунт, кошики, багатокрокові форми. Зміна IP посеред сесії виглядає підозріло й веде до блокування. Для таких сценаріїв беріть липку сесію або виділений IP.

Чи врятує ротація проксі дата-центру від усіх блокувань?

Ні. Ротація розподіляє навантаження й обходить ліміти на окремий IP, але агресивні антибот-системи можуть позначити діапазон дата-центру цілком, а відбиток браузера й вашу поведінку ротація не змінює.

Ротуйте по справжніх виходах

Розширте пул автентифікованими проксі SOCKS5 та HTTP дата-центру на proxy.s4m.online — з оплатою за трафік, тож масштабуватися дешево. Для кроків із липкою сесією додайте виділений IP.

Цю сторінку знаходять за запитами

Реальні пошукові фрази, на які відповідає ця сторінка — за посиланнями відкриються матеріали, що розкривають тему глибше.