Назад к блогу

Как снизить ban rate при веб-скрейпинге до 5%: 12 проверенных методов защиты

Разбираем 12 проверенных методов снижения ban rate при парсинге: от настройки прокси до имитации поведения реального пользователя. Практические примеры и готовые решения.

📅10 февраля 2026 г.

Если вы занимаетесь парсингом маркетплейсов, мониторингом цен конкурентов или сбором данных с сайтов, то знаете проблему: сайты блокируют IP-адреса, требуют капчу или возвращают пустые страницы. Ban rate (процент заблокированных запросов) может достигать 70-90%, что делает парсинг невозможным. В этой статье разберём конкретные методы, которые помогут снизить ban rate до 5-10% и собирать данные стабильно.

Мы рассмотрим как технические решения (ротация прокси, заголовки HTTP, fingerprinting), так и поведенческие паттерны (задержки, имитация действий пользователя). Все методы проверены на практике при парсинге Wildberries, Ozon, Авито и зарубежных площадок.

Почему сайты блокируют парсеры: основные триггеры

Прежде чем разбирать методы защиты, важно понять, как сайты определяют автоматизированный трафик. Современные антибот-системы (Cloudflare, Akamai, DataDome, Imperva) анализируют десятки параметров каждого запроса. Вот основные триггеры блокировки:

Триггеры на уровне сети:

  • Слишком много запросов с одного IP-адреса (например, 100+ запросов в минуту)
  • IP из известных диапазонов дата-центров (AWS, Google Cloud, Hetzner)
  • Географическое несоответствие: IP из России запрашивает английскую версию сайта
  • Отсутствие обратного DNS-записи для IP-адреса

Триггеры на уровне HTTP:

  • Отсутствие или неправильные HTTP-заголовки (User-Agent, Accept-Language, Referer)
  • Порядок заголовков отличается от стандартного для браузера
  • Версия TLS/SSL не соответствует заявленному браузеру
  • Отсутствие cookies или некорректное их использование

Триггеры на уровне браузера (JavaScript):

  • Отсутствие выполнения JavaScript (если используете простой HTTP-клиент)
  • Browser fingerprinting: Canvas, WebGL, AudioContext, установленные шрифты
  • Отсутствие движения мыши, скроллинга, кликов
  • Размер окна браузера (headless браузеры часто имеют нестандартные размеры)
  • Наличие автоматизации: свойства navigator.webdriver, window.chrome

Поведенческие триггеры:

  • Слишком быстрая навигация между страницами (меньше 1 секунды)
  • Одинаковые интервалы между запросами (например, ровно каждые 2 секунды)
  • Последовательный обход страниц (1, 2, 3, 4...) без пропусков
  • Отсутствие типичных действий пользователя: поиск, фильтры, просмотр изображений

Например, при парсинге Wildberries типичная ошибка — отправлять запросы каждые 0.5 секунды с одного IP. Антибот-система Cloudflare моментально определит паттерн и заблокирует IP на 24 часа. Реальный пользователь тратит 5-15 секунд на просмотр карточки товара, скроллит страницу, кликает на изображения.

Ротация прокси: как правильно менять IP-адреса

Использование прокси — базовый метод снижения ban rate. Но важно не просто купить прокси, а правильно настроить ротацию. Вот проверенные стратегии:

Выбор типа прокси для парсинга

Тип прокси Ban rate Скорость Когда использовать
Прокси дата-центров Высокий (40-60%) Очень высокая Простые сайты без защиты, массовый парсинг с большим пулом IP
Резидентные прокси Низкий (5-15%) Средняя Маркетплейсы (Wildberries, Ozon), сайты с Cloudflare, социальные сети
Мобильные прокси Очень низкий (2-8%) Низкая Сайты с агрессивной защитой, мобильные версии приложений

Для парсинга маркетплейсов (Wildberries, Ozon, Авито) рекомендуются резидентные прокси — они имеют IP реальных домашних пользователей, которые сложно отличить от обычного трафика. Прокси дата-центров подойдут для менее защищённых сайтов или когда нужна максимальная скорость при большом объёме данных.

Стратегии ротации IP-адресов

Стратегия 1: Ротация по времени

Меняйте IP каждые 5-10 минут. Это оптимальный баланс: достаточно долго, чтобы не вызвать подозрений частой сменой, но достаточно часто, чтобы не накопить историю запросов на одном IP.

Пример: При парсинге каталога на 1000 товаров с интервалом 3 секунды между запросами, один IP будет активен примерно 100 запросов, затем происходит смена.

Стратегия 2: Ротация по количеству запросов

Меняйте IP после 50-150 запросов. Это помогает избежать накопления подозрительной активности на одном адресе. Добавьте случайность: не ровно 100 запросов, а от 80 до 120.

Пример: Настройте скрипт так, чтобы после случайного числа запросов (80-120) происходила ротация прокси из пула.

Стратегия 3: Sticky sessions (сессионные прокси)

Для сайтов, требующих авторизации или работающих с корзиной, используйте sticky sessions — закрепление IP на время сессии (10-30 минут). Это позволяет сохранять cookies и не вызывать подозрений при смене IP внутри одной сессии.

Пример: При парсинге личного кабинета на Ozon используйте один IP для входа и всех последующих запросов в рамках 15-минутной сессии.

Важно: Не используйте один и тот же IP для разных задач. Если IP был заблокирован при парсинге одного сайта, не используйте его сразу для другого — подождите 24-48 часов.

Размер пула прокси

Минимальный размер пула зависит от интенсивности парсинга:

  • Низкая интенсивность (до 10 000 запросов в день): 10-20 прокси
  • Средняя интенсивность (10 000 - 100 000 запросов в день): 50-100 прокси
  • Высокая интенсивность (более 100 000 запросов в день): 200+ прокси или резидентные с автоматической ротацией

Для резидентных прокси с ротацией на каждый запрос (rotating proxies) размер пула может быть меньше, так как провайдер автоматически подставляет новый IP из своего пула в миллионы адресов.

User-Agent и HTTP-заголовки: имитация реального браузера

Даже с хорошими прокси вас могут заблокировать, если HTTP-заголовки выглядят подозрительно. Сайты анализируют не только User-Agent, но и порядок заголовков, их значения и соответствие друг другу.

Правильный User-Agent

Не используйте один и тот же User-Agent для всех запросов. Создайте список популярных браузеров и случайно выбирайте из него:

user_agents = [
    # Chrome на Windows
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    # Chrome на macOS
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    # Firefox на Windows
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
    # Safari на macOS
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
    # Edge на Windows
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
]

Ошибка: Использовать устаревшие версии браузеров (например, Chrome 80) — это сразу вызовет подозрения. Обновляйте список User-Agent каждые 2-3 месяца, отслеживая актуальные версии на сайте whatismybrowser.com.

Полный набор HTTP-заголовков

Современные браузеры отправляют 15-20 заголовков. Вот минимально необходимый набор для имитации Chrome:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Accept-Encoding": "gzip, deflate, br",
    "DNT": "1",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Cache-Control": "max-age=0",
    "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Windows"'
}

Обратите внимание на заголовки Sec-Fetch-* и sec-ch-ua-* — они появились в новых версиях Chrome и их отсутствие может выдать автоматизацию.

Порядок заголовков имеет значение

Браузеры отправляют заголовки в определённом порядке. Например, Chrome всегда ставит Host первым, затем Connection, User-Agent и так далее. Если вы используете Python библиотеку requests, порядок может быть алфавитным, что выдаст автоматизацию.

Решение: используйте библиотеки, которые правильно формируют заголовки (curl_cffi для Python, got для Node.js) или headless браузеры (Puppeteer, Playwright, Selenium), которые генерируют заголовки как настоящий браузер.

Задержки между запросами: оптимальные интервалы

Один из самых простых, но эффективных методов снижения ban rate — правильные задержки между запросами. Реальный пользователь не может открывать 10 страниц в секунду, поэтому слишком быстрые запросы моментально вызывают блокировку.

Случайные задержки вместо фиксированных

Не используйте фиксированную задержку (например, ровно 2 секунды между запросами). Антибот-системы легко определяют такой паттерн. Используйте случайный интервал:

import random
import time

# Вместо фиксированной задержки
time.sleep(2)  # ❌ Плохо

# Используйте случайный интервал
delay = random.uniform(2.5, 5.5)  # ✅ Хорошо
time.sleep(delay)

Рекомендуемые интервалы для разных сайтов

Тип сайта Минимальная задержка Рекомендуемая задержка Примеры
Маркетплейсы с защитой 3-5 сек 5-10 сек Wildberries, Ozon, Lamoda
Доски объявлений 2-4 сек 4-8 сек Авито, Юла, ЦИАН
Новостные сайты 1-2 сек 2-4 сек РБК, Коммерсантъ, Ведомости
API без ограничений 0.5-1 сек 1-2 сек Открытые API, RSS-ленты

Адаптивные задержки на основе ответов сервера

Продвинутый подход — динамически изменять задержки в зависимости от ответов сервера:

base_delay = 3.0  # Базовая задержка
delay_multiplier = 1.0

response = requests.get(url, headers=headers, proxies=proxies)

# Если получили капчу или 429 — увеличиваем задержку
if response.status_code == 429 or 'captcha' in response.text.lower():
    delay_multiplier *= 1.5
    print(f"Обнаружена защита, увеличиваем задержку до {base_delay * delay_multiplier}с")

# Если всё хорошо — можем немного ускориться
elif response.status_code == 200:
    delay_multiplier = max(1.0, delay_multiplier * 0.95)

time.sleep(random.uniform(base_delay * delay_multiplier, base_delay * delay_multiplier * 1.5))

Этот подход позволяет автоматически замедляться при обнаружении защиты и ускоряться, когда сайт не проявляет агрессии.

Защита от fingerprinting: Canvas, WebGL, шрифты

Если сайт использует JavaScript для проверки, простых HTTP-заголовков недостаточно. Современные антибот-системы создают "отпечаток" браузера (fingerprint) на основе десятков параметров: Canvas, WebGL, установленных шрифтов, часового пояса, разрешения экрана и других.

Основные параметры fingerprinting

Canvas fingerprinting

Сайт рисует невидимое изображение в Canvas и считывает его. Разные браузеры и операционные системы рендерят изображение по-разному, создавая уникальный отпечаток. Headless браузеры часто генерируют одинаковый Canvas, что выдаёт автоматизацию.

WebGL fingerprinting

Аналогично Canvas, но использует 3D-рендеринг. Считывается информация о видеокарте, драйверах, поддерживаемых расширениях. Headless браузеры часто показывают программный рендеринг (SwiftShader) вместо реального GPU.

Установленные шрифты

JavaScript может определить список установленных шрифтов. У headless браузеров обычно минимальный набор системных шрифтов, что отличается от реального пользователя с установленным Microsoft Office, Adobe и другими программами.

Navigator properties

Свойства navigator.webdriver, navigator.plugins, navigator.languages выдают автоматизацию. Например, в Selenium navigator.webdriver === true, что моментально определяется антибот-системами.

Инструменты для обхода fingerprinting

Для обхода fingerprinting используйте специализированные инструменты:

  • Undetected ChromeDriver (Python) — модифицированная версия Selenium, которая скрывает признаки автоматизации
  • Puppeteer Stealth (Node.js) — плагин для Puppeteer, подменяющий fingerprint параметры
  • Playwright с stealth — аналогично Puppeteer, но с лучшей поддержкой разных браузеров
  • Антидетект-браузеры (Dolphin Anty, AdsPower, Multilogin) — для тех, кто не хочет писать код, эти браузеры автоматически подменяют fingerprint

Пример использования undetected-chromedriver в Python:

import undetected_chromedriver as uc

# Создаём браузер с защитой от детектирования
options = uc.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')

driver = uc.Chrome(options=options)
driver.get('https://example.com')

# Проверяем, что navigator.webdriver === undefined
webdriver_status = driver.execute_script("return navigator.webdriver")
print(f"navigator.webdriver: {webdriver_status}")  # Должно быть None/undefined

Управление cookies и сессиями

Многие сайты используют cookies для отслеживания поведения пользователей. Правильное управление cookies помогает избежать блокировок и выглядеть как реальный пользователь.

Сохранение и переиспользование cookies

Вместо создания новой сессии на каждый запрос, сохраняйте cookies и используйте их повторно. Это имитирует поведение реального пользователя, который возвращается на сайт:

import requests
import pickle

session = requests.Session()

# Первый визит — получаем cookies
response = session.get('https://example.com')

# Сохраняем cookies в файл
with open('cookies.pkl', 'wb') as f:
    pickle.dump(session.cookies, f)

# Позже загружаем cookies
with open('cookies.pkl', 'rb') as f:
    session.cookies.update(pickle.load(f))

# Теперь запросы выглядят как от вернувшегося пользователя
response = session.get('https://example.com/catalog')

Прогрев сессии перед парсингом

Не начинайте парсинг сразу с целевых страниц. Имитируйте поведение реального пользователя:

  1. Откройте главную страницу сайта
  2. Подождите 2-5 секунд
  3. Откройте страницу категории или раздела
  4. Подождите 3-7 секунд
  5. Только после этого начинайте парсить целевые страницы

Это создаёт историю активности в cookies и снижает вероятность блокировки.

Обработка session cookies и токенов

Некоторые сайты генерируют уникальные токены при первом визите и проверяют их в последующих запросах. Например, Wildberries использует токен в заголовке x-requested-with. Всегда сохраняйте такие токены из первого ответа и отправляйте их в последующих запросах.

Рендеринг JavaScript: когда он необходим

Многие современные сайты загружают контент через JavaScript. Если вы используете простой HTTP-клиент (requests в Python, axios в Node.js), вы получите пустую страницу или заглушку. В таких случаях необходим рендеринг JavaScript.

Когда нужен рендеринг JavaScript

  • Сайт использует React, Vue, Angular — контент загружается после первоначальной загрузки страницы
  • Данные подгружаются через AJAX/Fetch запросы
  • Сайт требует выполнения JavaScript для генерации токенов или cookies
  • Присутствует защита от ботов, требующая выполнения JS-кода (например, Cloudflare Challenge)

Инструменты для рендеринга JavaScript

Инструмент Язык Скорость Обход защиты
Selenium Python, Java, C# Медленная Средний (с undetected-chromedriver)
Puppeteer Node.js Средняя Хороший (с puppeteer-extra-plugin-stealth)
Playwright Python, Node.js, Java Быстрая Отличный
Splash HTTP API Средняя Слабый

Для большинства задач рекомендуется Playwright — он быстрее Selenium, лучше обходит защиту и имеет более удобный API.

Альтернатива: перехват API запросов

Часто можно избежать рендеринга JavaScript, если найти API-запросы, которые использует сайт для загрузки данных. Откройте DevTools (F12) → вкладка Network → фильтр XHR/Fetch и посмотрите, какие запросы отправляет сайт. Затем повторите эти запросы напрямую через HTTP-клиент.

Пример: Wildberries загружает данные товаров через API https://catalog.wb.ru/catalog/.... Вместо рендеринга всей страницы можно запрашивать этот API напрямую, что в 10-20 раз быстрее.

Обход капчи: автоматические решения

Даже с правильными прокси и заголовками вы можете столкнуться с капчей. Существует несколько подходов к её решению:

Типы капчи и методы решения

reCAPTCHA v2 (галочка "Я не робот")

Решается через сервисы распознавания: 2Captcha, Anti-Captcha, CapMonster. Стоимость: $1-3 за 1000 решений. Время решения: 10-30 секунд.

reCAPTCHA v3 (невидимая, score-based)

Более сложная. Анализирует поведение пользователя и выставляет score от 0 до 1. Обход: использование headless браузеров с правильным fingerprint + имитация действий пользователя (движение мыши, клики).

hCaptcha

Аналог reCAPTCHA, используется на многих сайтах. Решается через те же сервисы распознавания. Стоимость: $0.5-2 за 1000 решений.

Cloudflare Challenge

JavaScript-challenge, который проверяет браузер. Обход: использование специализированных библиотек (cloudscraper для Python, cloudflare-scraper для Node.js) или сервисов (FlareSolverr).

Интеграция сервиса распознавания капчи

Пример интеграции 2Captcha в Python:

from twocaptcha import TwoCaptcha

solver = TwoCaptcha('YOUR_API_KEY')

try:
    # Решаем reCAPTCHA v2
    result = solver.recaptcha(
        sitekey='6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
        url='https://example.com'
    )
    
    # Получаем токен решения
    captcha_token = result['code']
    
    # Отправляем форму с токеном
    response = requests.post('https://example.com/submit', data={
        'g-recaptcha-response': captcha_token
    })
    
except Exception as e:
    print(f"Ошибка решения капчи: {e}")

Важно: Решение капчи замедляет парсинг в 10-30 раз и увеличивает стоимость. Используйте его только когда другие методы не работают. Сначала попробуйте улучшить прокси, fingerprint и задержки.

Rate limiting: как не превысить лимиты сайта

Многие сайты имеют явные или неявные лимиты на количество запросов. Превышение этих лимитов приводит к временной или постоянной блокировке IP.

Определение лимитов сайта

Обращайте внимание на HTTP-заголовки в ответах сервера:

  • X-RateLimit-Limit — максимальное количество запросов в период
  • X-RateLimit-Remaining — сколько запросов осталось
  • X-RateLimit-Reset — когда лимит сбросится (Unix timestamp)
  • Retry-After — через сколько секунд можно повторить запрос

Если вы получили статус-код 429 (Too Many Requests), это означает превышение лимита. Прочитайте заголовок Retry-After и подождите указанное время перед следующим запросом.

Реализация rate limiter

Создайте механизм контроля скорости запросов: