Если вы занимаетесь парсингом маркетплейсов, мониторингом цен конкурентов или сбором данных с сайтов, то знаете проблему: сайты блокируют 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')
Прогрев сессии перед парсингом
Не начинайте парсинг сразу с целевых страниц. Имитируйте поведение реального пользователя:
- Откройте главную страницу сайта
- Подождите 2-5 секунд
- Откройте страницу категории или раздела
- Подождите 3-7 секунд
- Только после этого начинайте парсить целевые страницы
Это создаёт историю активности в 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
Создайте механизм контроля скорости запросов: