Реалізація проксі-ротації для парсингу
При промисловому парсингу одна IP-адреса швидко блокується: сайти фіксують високу частоту запитів і видають 403 або 429. Втрати даних при цьому сягають 40%. Ручна зміна проксі неефективна — потрібне автоматичне рішення. Ми будуємо систему, яка розподіляє запити по пулу адрес, виводить заблоковані на карантин і зважено обирає найнадійніші проксі. Досвід показує: грамотна ротація підвищує збір даних до 99,5%.
Як працює зважений вибір проксі?
Кожен проксі в пулі зберігає статистику успішних і невдалих запитів. Ротатор обчислює success_rate як відношення успішних запитів до загальної кількості. При виборі адреси використовується зважена випадковість: проксі з коефіцієнтом 0.92 обирається в 7 разів частіше, ніж з 0.5. Якщо проксі повертає помилку (403, 429, таймаут), він поміщається на карантин на 15 хвилин (налаштовується). Це запобігає повторним спробам через свідомо заблокований IP.
Request → Proxy Selector
↓
[Proxy Pool]
192.168.1.1:8080 ← статус: OK, 245 запитів, скор 0.92
10.0.0.5:3128 ← статус: OK, 198 запитів, скор 0.88
172.16.0.2:8080 ← статус: BLOCKED, на карантині
↓
Target Site
↓
Response Checker
(статус 200 → success / 403/429 → fail)
Як інтегрувати ротатор із aiohttp?
Інтеграція будується на asyncio та aiohttp. Функція fetch отримує проксі з ротатора, виконує запит і звітує про успіх. При помилці проксі йде на карантин, і наступний запит отримає іншу адресу. Це дозволяє обробляти до 1000 запитів на хвилину без блокувань.
import asyncio
import aiohttp
from dataclasses import dataclass, field
from datetime import datetime, timedelta
@dataclass
class ProxyEntry:
url: str
success: int = 0
fail: int = 0
blocked_until: datetime = field(default_factory=lambda: datetime.min)
@property
def is_available(self):
return datetime.now() > self.blocked_until
@property
def success_rate(self):
total = self.success + self.fail
return self.success / total if total > 0 else 0.5
class ProxyRotator:
def __init__(self, proxies: list[str], quarantine_minutes=15):
self.pool = [ProxyEntry(url=p) for p in proxies]
self.quarantine = timedelta(minutes=quarantine_minutes)
self._lock = asyncio.Lock()
async def get(self) -> ProxyEntry:
async with self._lock:
available = [p for p in self.pool if p.is_available]
if not available:
raise RuntimeError("All proxies are blocked")
weights = [p.success_rate for p in available]
return random.choices(available, weights=weights)[0]
async def report(self, proxy: ProxyEntry, success: bool):
async with self._lock:
if success:
proxy.success += 1
else:
proxy.fail += 1
proxy.blocked_until = datetime.now() + self.quarantine
async def fetch(session, url, rotator):
proxy = await rotator.get()
try:
async with session.get(url, proxy=proxy.url, timeout=10) as resp:
if resp.status in (403, 429, 503):
await rotator.report(proxy, success=False)
return None
await rotator.report(proxy, success=True)
return await resp.text()
except Exception:
await rotator.report(proxy, success=False)
return None
Чому зважений вибір кращий за випадковий?
Випадковий вибір проксі перевантажує систему помилками: погані адреси отримують стільки ж запитів, скільки хороші. Зважений підхід, заснований на success_rate, аналогічний методу експоненційного згладжування — чим довше проксі працює стабільно, тим частіше він використовується. Це знижує кількість повторних запитів на 30% — зважений вибір у 1.5 раза швидший за випадковий. Додатково ми впроваджуємо моніторинг проксі: кожні 5 хвилин перевіряємо доступність пулу та автоматично виключаємо довго заблоковані адреси.
Порівняння пулів: резидентні vs ISP vs дата-центр
| Тип проксі | Швидкість | Анонімність | Вартість ($/IP/міс) | Стійкість до блокувань |
|---|---|---|---|---|
| Резидентні | Низька | Висока | ~2-5 | Дуже висока |
| ISP | Середня | Середня | ~1-3 | Висока |
| Дата-центр | Висока | Низька | ~0.5-1 | Низька |
Резидентні проксі (наприклад, від Bright Data) дають найкращий обхід блокувань, але дорожчі — економія бюджету досягається за рахунок меншої кількості повторних запитів (до 40% економії). ISP-проксі (Oxylabs) — золота середина для парсингу інтернет-магазинів. Дата-центр підходить лише для швидких прототипів, де допустимі тимчасові блокування.
Що робити, якщо всі проксі в карантині?
Алгоритм перевіряє blocked_until для кожної адреси. Якщо всі недоступні, викидається виняток — це сигнал для оператора. На практиці ми рекомендуємо резервний пул із 5–10 проксі зі збільшеним часом очікування між запитами. При пулі з 20 резидентних проксі з налаштуваннями за замовчуванням парсер працює без простоїв у 99% випадків. У складних сценаріях автоматично збільшуємо quarantine_minutes до 30, щоб знизити навантаження на пул.
Етапи впровадження системи ротації
- Аналіз цільових сайтів: визначення таргетингу, лімітів запитів, типів блокувань.
- Вибір проксі-провайдера: підбір оптимального пулу (резидентні/ISP/мікс) під бюджет і завдання.
- Розробка ротатора: реалізація зваженого вибору, карантину та моніторингу.
- Інтеграція з парсером: підключення
aiohttp, обробка помилок, логування. - Навантажувальне тестування: прогін 10 000 запитів, перевірка стабільності при пікових навантаженнях.
Вибір проксі-провайдера: порівняння за цільовими завданнями
| Завдання | Рекомендований провайдер | Мінімальний пул |
|---|---|---|
| Парсинг інтернет-магазинів (RU) | Oxylabs ISP | 10 IP |
| Збір даних з соцмереж | Bright Data Resident | 20 IP |
| Швидке прототипування | Smartproxy Datacenter | 5 IP |
Для більшості завдань достатньо 10–15 резидентних проксі від Smartproxy при адекватних затримках. Якщо потрібне глобальне покриття, обирайте Bright Data — їхній пул включає 72 млн IP.
Що входить у результат
- Архітектура системи ротації з документацією
- Вихідний код на Python із asyncio та інтеграцією з aiohttp
- Інструкція з розгортання (Docker, налаштування моніторингу)
- Двотижнева підтримка після впровадження
Ми займаємося розробкою систем парсингу більше 5 років (5+ років досвіду), реалізували 15+ проєктів із проксі-ротацією. Всі рішення проходять навантажувальне тестування та супроводжуються гарантією стабільності. Отримайте консультацію — надішлемо оцінку за 1 день. Замовте реалізацію — впровадимо систему за 2–3 дні.
Строки
Базова система — 2–3 робочі дні. Під ключ з адаптацією під ваш стек — до 5 днів.







