Реализация обхода защиты от парсинга (CAPTCHA, rate limiting)
Промышленные защиты от парсинга — DataDome, Cloudflare Bot Management, PerimeterX, Akamai Bot Manager — анализируют поведение пользователей по десяткам сигналов одновременно. Обход требует понимания конкретной системы защиты и применения нескольких техник в связке.
Классификация защит
Уровень 1 — Rate limiting. Простая защита по IP: более N запросов в секунду → блокировка. Решается прокси-ротацией и снижением частоты запросов.
Уровень 2 — Fingerprinting браузера. Проверка navigator.webdriver, canvas fingerprint, WebGL рендеринг, аудио контекст, список плагинов. Детектирует headless-браузеры без маскировки.
Уровень 3 — Поведенческий анализ. ML-модели на стороне защиты: паттерны движения мыши, тайминги между действиями, порядок событий. Отличает бота от человека даже при правильном fingerprint.
Уровень 4 — CAPTCHA. Визуальные или поведенческие задачи. Google reCAPTCHA v2/v3, hCaptcha, Arkose Labs (FunCaptcha), Cloudflare Turnstile.
Обход rate limiting
import asyncio
import random
from aiohttp import ClientSession
async def fetch_with_delay(session, url, semaphore):
async with semaphore:
await asyncio.sleep(2 + random.gauss(1, 0.5)) # нормальное распределение
async with session.get(url) as resp:
return await resp.text()
semaphore = asyncio.Semaphore(3) # максимум 3 одновременных запроса
Случайные задержки с нормальным распределением значительно эффективнее фиксированных: паттерн ближе к человеческому.
Stealth для Playwright
const { chromium } = require('playwright');
const { stealth } = require('playwright-stealth');
const browser = await chromium.launch({
args: [
'--disable-blink-features=AutomationControlled',
'--no-sandbox',
]
});
const context = await browser.newContext({
userAgent: getRandomUserAgent(),
locale: 'ru-RU',
timezoneId: 'Europe/Moscow',
geolocation: { longitude: 37.6173, latitude: 55.7558 },
permissions: ['geolocation'],
});
await stealth(context);
playwright-stealth патчит более 30 детектируемых полей: navigator.webdriver, window.chrome, navigator.languages, canvas noise и другие.
Решение CAPTCHA
Автоматическое решение через сервисы:
| Сервис | Тип CAPTCHA | Время | Модель |
|---|---|---|---|
| 2captcha | reCAPTCHA v2/v3, hCaptcha, Turnstile | 5–30 сек | Люди |
| Anti-Captcha | reCAPTCHA v2/v3, ImageToText | 7–15 сек | Люди |
| CapSolver | reCAPTCHA v3, Arkose Labs | 1–3 сек | AI |
| NopeCHA | hCaptcha, reCAPTCHA | 2–10 сек | AI |
from twocaptcha import TwoCaptcha
solver = TwoCaptcha(API_KEY)
# reCAPTCHA v2
result = solver.recaptcha(
sitekey='6LfXXXXXXXXXXXXXXXXXXXXX',
url='https://example.com/page'
)
token = result['code'] # вставляем в форму
Для reCAPTCHA v3 нужен токен с высоким score. CapSolver специализируется именно на этом.
Прокси-инфраструктура
Качество прокси критично. Иерархия по эффективности:
- Резидентные прокси (Bright Data, Oxylabs, Smartproxy) — реальные IP домашних пользователей. Самые дорогие, но практически не блокируются
- Мобильные прокси — 4G/5G IP операторов. Высокий trust score, дешевле резидентных
- ISP прокси (статические резидентные) — постоянный IP провайдера
- Дата-центр прокси — дешёвые, но легко блокируются серьёзными защитами
class ProxyRotator:
def __init__(self, proxies: list):
self.proxies = proxies
self.stats = {p: {'success': 0, 'fail': 0} for p in proxies}
def get_best_proxy(self):
# выбираем прокси с наибольшим процентом успеха
return max(
self.proxies,
key=lambda p: self.stats[p]['success'] /
max(self.stats[p]['success'] + self.stats[p]['fail'], 1)
)
def report_success(self, proxy):
self.stats[proxy]['success'] += 1
def report_fail(self, proxy):
self.stats[proxy]['fail'] += 1
Работа с куками и сессиями
Сессионные куки — важный сигнал для защит. Бот, который не накапливает куки через несколько страниц, выглядит подозрительно.
# Сохранение и восстановление контекста Playwright
await context.storage_state(path='session.json')
# В следующем запуске
context = await browser.new_context(storage_state='session.json')
Для сложных сайтов: сначала «греем» сессию — посещаем главную, пару случайных страниц, имитируем скролл — затем переходим к целевым URL.
Обнаружение смены алгоритма защиты
Защиты обновляют алгоритмы. Нужен мониторинг:
- Трекинг HTTP-статусов: рост 403/429/503 → триггер проверки
- Сравнение fingerprint-запросов (JavaScript, который загружает DataDome)
- Алерты при падении процента успешных парсингов ниже порога
Сроки
Базовый обход rate limiting + stealth: 3–5 дней. Полная система с CAPTCHA-солвером, прокси-ротатором и мониторингом: 12–18 дней.







