Если вы занимаетесь мониторингом цен конкурентов, парсингом остатков товаров или автоматическим размещением объявлений на маркетплейсах — вы наверняка сталкивались с блокировками. API Wildberries, Ozon, Яндекс.Маркета и Авито активно защищаются от автоматизации: ограничивают количество запросов, банят IP-адреса и требуют капчу. В этом руководстве разберём почему происходят блокировки и как настроить парсер так, чтобы работать стабильно месяцами без банов.
Почему маркетплейсы блокируют частые запросы к API
Маркетплейсы тратят огромные деньги на поддержку инфраструктуры — серверы, базы данных, CDN. Когда вы делаете тысячи запросов в минуту для парсинга цен, вы создаёте дополнительную нагрузку на их системы. Но главная причина блокировок не техническая, а бизнес-ориентированная.
Основные причины блокировок:
- Защита конкурентных данных. Wildberries и Ozon не хотят, чтобы конкуренты легко получали информацию о ценах, остатках и популярных товарах. Эти данные — коммерческая тайна.
- Снижение нагрузки на сервера. Один парсер может генерировать столько же запросов, сколько 10 000 обычных покупателей. Это увеличивает расходы на хостинг.
- Борьба с накруткой и спамом. Автоматические системы используют для накрутки просмотров, отзывов, массового размещения объявлений на Авито.
- Монетизация API. Некоторые маркетплейсы предлагают официальные платные API с лимитами. Блокируя бесплатный парсинг, они стимулируют покупку доступа.
Например, если вы мониторите цены на 5000 товаров каждый час — это 120 000 запросов в сутки. С одного IP-адреса это выглядит подозрительно, и система защиты маркетплейса быстро заблокирует ваш доступ.
Какие методы защиты используют Wildberries, Ozon и Авито
Современные маркетплейсы используют многоуровневую защиту от парсинга. Понимание этих механизмов поможет правильно настроить обход блокировок.
| Метод защиты | Как работает | Как обойти |
|---|---|---|
| Rate Limiting | Ограничение запросов с одного IP: 100-500 в час | Задержки между запросами + ротация IP |
| IP Blacklist | Блокировка известных прокси дата-центров | Использование резидентных прокси |
| User-Agent проверка | Блокировка запросов без браузерного User-Agent | Установка реалистичных заголовков |
| JavaScript проверки | Требование выполнения JS-кода для получения данных | Использование headless браузеров |
| Captcha | Принудительная проверка при подозрительной активности | Снижение частоты запросов, сервисы решения капчи |
| TLS Fingerprinting | Определение автоматизации по параметрам TLS | Использование библиотек с правильным fingerprint |
| Поведенческий анализ | Анализ паттернов: скорость кликов, движения мыши | Рандомизация задержек, имитация человеческого поведения |
Wildberries использует агрессивную защиту: лимит около 200-300 запросов в час с одного IP, проверку User-Agent и JavaScript-челленджи. При превышении лимита вы получите HTTP 429 (Too Many Requests) или 403 (Forbidden).
Ozon более лоялен к парсингу через API, но активно банит IP дата-центров. Они используют сервисы определения типа IP (DataCenter vs Residential), поэтому обычные прокси часто не работают.
Авито защищает API от массового размещения объявлений и парсинга контактов. Здесь важна географическая привязка: если размещаете объявление в Казани, IP должен быть из Казани, иначе модерация заблокирует публикацию.
Rate limiting: как правильно настроить задержки между запросами
Rate limiting — это искусственное ограничение скорости запросов, чтобы ваша активность выглядела как действия обычного пользователя. Главное правило: лучше медленно, но стабильно, чем быстро и с баном.
Рекомендуемые настройки для популярных маркетплейсов:
Wildberries:
- Задержка между запросами: 2-5 секунд (рандомизированная)
- Максимум 150-200 запросов в час с одного IP
- Пауза 10-15 минут после каждых 100 запросов
- Ротация IP после 200 запросов
Ozon:
- Задержка между запросами: 1-3 секунды
- Максимум 300-400 запросов в час с одного IP
- Использование резидентных прокси обязательно
- Ротация IP после 300 запросов
Авито:
- Задержка между запросами: 3-7 секунд
- Максимум 50-100 запросов в час (строгие лимиты)
- IP должен соответствовать городу объявления
- Один IP = один аккаунт (не смешивайте)
Как реализовать рандомизированные задержки: Не используйте фиксированные интервалы типа "ровно 3 секунды" — это выглядит как бот. Добавьте случайность: от 2 до 5 секунд. Большинство парсеров поддерживают это через настройки.
Например, в Python с библиотекой requests это выглядит так:
import time
import random
import requests
def make_request(url, proxies):
response = requests.get(url, proxies=proxies)
# Рандомная задержка от 2 до 5 секунд
delay = random.uniform(2.0, 5.0)
time.sleep(delay)
return response
# Пример использования
proxy = {
'http': 'http://username:password@proxy.example.com:8000',
'https': 'http://username:password@proxy.example.com:8000'
}
for product_id in product_list:
url = f'https://card.wb.ru/cards/detail?nm={product_id}'
response = make_request(url, proxy)
# Обработка данных...
Важный момент: После каждых 100-200 запросов делайте длинную паузу (10-20 минут) или меняйте IP. Это имитирует поведение человека, который просматривает товары, потом отвлекается на другие дела.
Ротация прокси для распределения нагрузки
Даже с правильными задержками один IP не выдержит долгой нагрузки. Решение — ротация прокси: распределение запросов между множеством IP-адресов. Это основа стабильного парсинга маркетплейсов.
Типы прокси для парсинга маркетплейсов:
| Тип прокси | Преимущества | Недостатки | Для каких задач |
|---|---|---|---|
| Дата-центры | Быстрые, дешёвые, стабильные | Легко определяются, часто в бан-листах | Яндекс.Маркет, мелкие маркетплейсы |
| Резидентные | Реальные IP домашних пользователей, низкий риск бана | Дороже, медленнее дата-центров | Wildberries, Ozon, Авито |
| Мобильные | IP мобильных операторов, максимальная анонимность | Самые дорогие, переменная скорость | Обход жёстких блокировок Авито |
Для парсинга Wildberries и Ozon рекомендуем использовать резидентные прокси — они имеют IP реальных домашних пользователей, поэтому маркетплейсы не могут их отличить от обычных покупателей. Прокси дата-центров здесь работают плохо: Ozon и Wildberries ведут чёрные списки таких IP.
Стратегии ротации прокси:
- Ротация после N запросов. Меняйте IP после каждых 100-300 запросов. Это оптимальный баланс между эффективностью и безопасностью.
- Ротация по времени. Меняйте IP каждые 30-60 минут. Подходит для долгих сессий парсинга.
- Sticky sessions. Используйте один IP для всех запросов к одному товару/категории, потом меняйте. Это снижает подозрительность.
- Географическая привязка. Для Авито обязательно: парсите объявления Москвы через московские IP, Казани — через казанские.
Большинство провайдеров резидентных прокси предлагают автоматическую ротацию: вы получаете один endpoint, а IP меняется автоматически с заданной частотой или после каждого запроса. Это упрощает настройку парсера.
Пример настройки пула прокси в Python:
import requests
import random
# Список прокси (можно загрузить из файла)
proxy_list = [
'http://user:pass@proxy1.example.com:8000',
'http://user:pass@proxy2.example.com:8000',
'http://user:pass@proxy3.example.com:8000',
# ... ещё 50-100 прокси
]
def get_random_proxy():
proxy = random.choice(proxy_list)
return {
'http': proxy,
'https': proxy
}
# Использование
for product_id in product_list:
proxy = get_random_proxy() # Случайный прокси для каждого запроса
response = requests.get(url, proxies=proxy)
# Обработка...
Настройка заголовков и fingerprint для имитации браузера
Маркетплейсы анализируют не только IP и частоту запросов, но и HTTP-заголовки. Если ваш парсер отправляет запросы с дефолтными заголовками библиотеки (например, python-requests/2.28.0), он мгновенно определяется как бот.
Обязательные заголовки для имитации браузера:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'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',
'Cache-Control': 'max-age=0',
'Referer': 'https://www.google.com/'
}
Важные моменты:
- User-Agent должен соответствовать реальному браузеру. Используйте актуальные версии Chrome, Firefox, Safari. Меняйте User-Agent каждые 100-200 запросов.
- Accept-Language должен соответствовать географии прокси. Если используете российские IP — ставьте ru-RU, для украинских — uk-UA.
- Referer показывает откуда пришёл пользователь. Для первого запроса используйте Google/Яндекс, для последующих — внутренние страницы маркетплейса.
- Sec-Fetch-* заголовки добавляют реалистичности. Современные браузеры отправляют их автоматически.
TLS Fingerprinting: Продвинутые системы защиты (Ozon, Wildberries) анализируют параметры TLS-соединения: порядок cipher suites, расширения, версию протокола. Стандартные библиотеки Python/Node.js имеют отличающийся fingerprint от браузеров.
Решение — использование специализированных библиотек:
- curl-impersonate (Python) — имитирует TLS fingerprint Chrome/Firefox
- tls-client (Go, Python bindings) — настраиваемый TLS fingerprint
- Playwright / Puppeteer — headless браузеры с настоящим TLS
Для большинства задач парсинга маркетплейсов достаточно правильных HTTP-заголовков и резидентных прокси. TLS fingerprinting критичен только при работе с самыми защищёнными API.
API vs веб-скрапинг: что безопаснее для парсинга
У маркетплейсов есть два способа получения данных: официальное API и парсинг HTML-страниц (веб-скрапинг). Какой выбрать для стабильной работы?
| Параметр | Официальное API | Веб-скрапинг |
|---|---|---|
| Легальность | ✅ Разрешено, есть документация | ⚠️ Серая зона, может нарушать ToS |
| Стабильность | ✅ Стабильная структура данных | ❌ Ломается при редизайне сайта |
| Лимиты | ⚠️ Жёсткие официальные лимиты | ⚠️ Неофициальные, но есть защита |
| Доступ к данным | ⚠️ Не все данные доступны | ✅ Все публичные данные |
| Скорость | ✅ Быстрые JSON-ответы | ❌ Медленнее из-за HTML |
| Стоимость | ⚠️ Часто платное | ✅ Бесплатно (только прокси) |
Рекомендации по выбору:
- Используйте официальное API если: Вам нужны небольшие объёмы данных (до 10 000 товаров в день), вы готовы платить за доступ, важна легальность и стабильность.
- Используйте веб-скрапинг если: Нужны большие объёмы данных, официальное API не предоставляет нужную информацию (например, цены конкурентов), бюджет ограничен.
Гибридный подход: Многие профессиональные парсеры комбинируют оба метода. Например, получают список товаров через API (быстро и легально), а детальную информацию о ценах и остатках парсят с HTML-страниц (больше данных).
Внутренние API маркетплейсов: Кроме официального API, маркетплейсы используют внутренние API для работы сайта. Например, Wildberries загружает данные товаров через https://card.wb.ru/cards/detail. Эти эндпоинты не документированы, но работают быстрее HTML-парсинга. Минус — могут измениться без предупреждения.
Настройка популярных парсеров и инструментов
Большинство селлеров и маркетологов используют готовые инструменты для парсинга маркетплейсов. Рассмотрим как правильно настроить прокси и лимиты в популярных решениях.
Настройка Scrapy (Python фреймворк)
Scrapy — популярный фреймворк для веб-скрапинга. Для работы с маркетплейсами добавьте в settings.py:
# Задержки между запросами
DOWNLOAD_DELAY = 3 # 3 секунды
RANDOMIZE_DOWNLOAD_DELAY = True # Рандомизация от 0.5*DELAY до 1.5*DELAY
# Лимиты одновременных запросов
CONCURRENT_REQUESTS = 8
CONCURRENT_REQUESTS_PER_DOMAIN = 2
# Настройка прокси (через middleware rotating-proxies)
ROTATING_PROXY_LIST = [
'http://user:pass@proxy1.example.com:8000',
'http://user:pass@proxy2.example.com:8000',
# ... список прокси
]
# User-Agent ротация
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/537.36',
# ... список User-Agent
]
# Повторные попытки при ошибках
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]
Настройка Octoparse (визуальный парсер без кода)
Octoparse — популярный инструмент для парсинга без программирования. Настройка прокси и лимитов:
- Откройте Task Settings → Advanced Options
- В разделе "Network" включите "Use Proxy Server"
- Добавьте список прокси в формате
IP:PORT:USER:PASS - Включите "Rotate IP for each request" для автоматической ротации
- В разделе "Speed" установите "Slow" или "Custom" с задержкой 3-5 секунд
- Включите "Random delay" для имитации человеческого поведения
Настройка Selenium (автоматизация браузера)
Selenium управляет настоящим браузером, поэтому обходит многие защиты. Пример настройки с прокси:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import random
# Настройка Chrome с прокси
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://user:pass@proxy.example.com:8000')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=chrome_options)
# Скрытие WebDriver
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
# Парсинг с задержками
urls = ['https://www.wildberries.ru/catalog/...', ...]
for url in urls:
driver.get(url)
# Рандомная задержка 3-7 секунд
time.sleep(random.uniform(3, 7))
# Скроллинг для имитации чтения
driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
time.sleep(random.uniform(1, 3))
# Парсинг данных
# ...
Готовые сервисы парсинга маркетплейсов
Если не хотите настраивать парсер самостоятельно, используйте специализированные сервисы:
- Mpstats.io — аналитика Wildberries и Ozon, автоматический мониторинг цен и продаж
- SellerFox — мониторинг конкурентов на маркетплейсах, отслеживание остатков
- Moneyplace — парсинг Авито, автоматическое размещение объявлений
- Parsehub — визуальный парсер для любых сайтов, включая маркетплейсы
Эти сервисы уже настроили прокси, лимиты и обход защит — вам остаётся только указать что парсить. Минус — ежемесячная подписка от 2000₽.
Мониторинг блокировок и автоматическая реакция
Даже с правильными настройками блокировки возможны: маркетплейсы обновляют защиту, прокси попадают в бан-листы, лимиты меняются. Важно отслеживать проблемы и реагировать автоматически.
Признаки блокировки которые нужно отслеживать:
- HTTP 429 (Too Many Requests) — превышен лимит запросов, нужна пауза или смена IP
- HTTP 403 (Forbidden) — IP заблокирован, нужна немедленная ротация прокси
- HTTP 503 (Service Unavailable) — временная перегрузка или защита от DDoS
- Капча в ответе — обнаружена автоматизация, нужно снизить активность
- Пустые ответы или редирект на главную — мягкая блокировка
- Резкое увеличение времени ответа — возможно rate limiting на стороне сервера
Автоматическая реакция на блокировки (пример на Python):
import requests
import time
from datetime import datetime
class SmartParser:
def __init__(self, proxy_list):
self.proxy_list = proxy_list
self.current_proxy_index = 0
self.request_count = 0
self.blocked_proxies = set()
def get_next_proxy(self):
# Пропускаем заблокированные прокси
while self.current_proxy_index in self.blocked_proxies:
self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
proxy = self.proxy_list[self.current_proxy_index]
return {'http': proxy, 'https': proxy}
def rotate_proxy(self):
self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
self.request_count = 0
def make_request(self, url):
max_retries = 3
for attempt in range(max_retries):
try:
proxy = self.get_next_proxy()
response = requests.get(url, proxies=proxy, timeout=10)
# Проверка на блокировку
if response.status_code == 429:
print(f"[{datetime.now()}] Rate limit! Пауза 60 секунд...")
time.sleep(60)
self.rotate_proxy()
continue
elif response.status_code == 403:
print(f"[{datetime.now()}] IP заблокирован! Ротация прокси...")
self.blocked_proxies.add(self.current_proxy_index)
self.rotate_proxy()
continue
elif response.status_code == 503:
print(f"[{datetime.now()}] Сервер перегружен. Пауза 120 секунд...")
time.sleep(120)
continue
# Успешный запрос
self.request_count += 1
# Ротация после 200 запросов
if self.request_count >= 200:
self.rotate_proxy()
time.sleep(10) # Пауза после ротации
return response
except requests.exceptions.Timeout:
print(f"[{datetime.now()}] Таймаут. Попытка {attempt + 1}/{max_retries}")
time.sleep(5)
return None # Все попытки исчерпаны
Логирование и алерты: Настройте уведомления при критических событиях. Например, отправляйте сообщение в Telegram когда:
- Заблокировано более 30% прокси из пула
- Процент успешных запросов упал ниже 80%
- Парсер не получил данных более 30 минут
- Обнаружена капча в ответах
Метрики для мониторинга:
- Success rate — процент успешных запросов (должен быть >90%)
- Average response time — среднее время ответа (рост может указывать на проблемы)
- Requests per hour — количество запросов в час по каждому прокси
- Proxy health — процент работающих прокси в пуле
- Block rate — частота блокировок (должна быть <5%)
Используйте дашборды для визуализации метрик: Grafana, Datadog или простые Google Sheets с автоматическим обновлением через API.
Заключение
Блокировки при парсинге маркетплейсов — это не препятствие, а задача которую можно решить правильной настройкой инструментов. Ключевые моменты для стабильной работы без банов:
- Используйте резидентные прокси для Wildberries, Ozon и Авито — прокси дата-центров здесь не работают
- Настройте рандомизированные задержки 2-5 секунд между запросами
- Ротируйте IP после каждых 150-300 запросов или каждые 30-60 минут
- Используйте реалистичные HTTP-заголовки с актуальными User-Agent
- Мониторьте блокировки и автоматически реагируйте на них
- Для Авито обязательна географическая привязка IP к городу объявления
Правильно настроенный парсер с качественными прокси может работать месяцами без единой блокировки, собирая десятки тысяч товаров ежедневно. Главное — не гнаться за скоростью, а имитировать поведение обычного пользователя.
Если вы планируете регулярно парсить Wildberries, Ozon или Авито, рекомендуем использовать резидентные прокси с автоматической ротацией — они обеспечивают максимальную стабильность и минимальный риск блокировок. Для задач требующих мобильные IP (например, обход жёстких блокировок Авито) подойдут мобильные прокси с IP российских операторов.