Сбор данных с Wildberries упирается не в код — написать запрос к карточке товара умеет каждый. Упирается он в масштаб: на сотой странице приходит 429, на тысячной адрес перестают обслуживать вовсе. Разбираем, где проходят лимиты площадки, сколько адресов нужно под вашу задачу и как построить сборщик, который не падает на ровном месте.
Прежде чем писать парсер, стоит определиться с источником — их три, и они принципиально разные:
| Источник | Что даёт | Когда использовать |
|---|---|---|
| Официальный API продавца | Данные по вашим товарам: заказы, остатки, цены, отчёты | Всегда, когда речь о собственном кабинете — это законный и стабильный путь |
| Публичные JSON-эндпоинты каталога | Карточки, цены, остатки по складам, позиции в выдаче | Анализ конкурентов и рынка. Основной сценарий, ради которого нужны прокси |
| HTML-страницы | То же самое, но медленнее и с риском поломки при редизайне | Практически никогда — каталог отдаёт данные в JSON |
Про легальность. Сбор общедоступной информации законом не запрещён, но два ограничения соблюдать нужно: не создавать чрезмерную нагрузку на сервера площадки и учитывать её пользовательское соглашение в части автоматизированного доступа. Данные по собственным товарам корректнее брать через официальный API, а не парсингом.
Маркетплейс защищает инфраструктуру от избыточной нагрузки, поэтому считает запросы в единицу времени с одного адреса. Реакция обычно ступенчатая:
Важная деталь: считают именно связку «адрес + частота». Поэтому проблема решается не хитрыми заголовками, а распределением запросов по пулу адресов и разумными паузами.
Отталкивайтесь от простого ориентира: один IP уверенно держит 1–2 запроса в секунду при небольших случайных паузах. Дальше арифметика:
| Задача | Объём | Нужный пул |
|---|---|---|
| Мониторинг цен по своей нише раз в сутки | ~5 000 карточек | 3–5 адресов |
| Ежедневный сбор по категории | ~50 000 карточек | 10–15 адресов |
| Полный обход крупной категории за ночь | ~100 000+ карточек | 20–30 адресов |
| Мониторинг позиций по ключам, много регионов | десятки тысяч запросов | от 30 адресов |
Одно условие критично: адреса должны быть из разных подсетей. Пул из 30 IP вида 185.22.141.* — это фактически один адрес с точки зрения защиты, потому что ограничения нередко накладывают на подсеть целиком.
Для сбора публичных данных высокий уровень доверия не нужен — карточку товара отдают любому посетителю. Значение имеют скорость, стабильность и цена за адрес, а это сильная сторона серверных IPv4-прокси из дата-центров: гигабитный канал, пинг в единицы миллисекунд и стоимость, при которой пул из 30 адресов не разоряет бюджет.
Мобильные прокси для этой задачи избыточны: их преимущество — доверие антифрода при работе с аккаунтами, а платите вы за порт, а не за адрес. Держать на них массовый парсинг дорого и бессмысленно.
Серверные IPv4 из 150+ подсетей: канал до 1 Гбит/с, безлимитный трафик, выдача за 30 секунд.
Купить серверные прокси IPv4Минимальный набор правил, который отличает работающий парсер от падающего:
import random, time, itertools
import requests
PROXIES = [
"http://user:pass@195.24.10.15:8000",
"http://user:pass@91.108.44.62:8000",
"http://user:pass@45.132.19.7:8000",
]
pool = itertools.cycle(PROXIES)
cooldown = {} # адрес -> время, до которого он отдыхает
def next_proxy():
for _ in range(len(PROXIES)):
p = next(pool)
if cooldown.get(p, 0) < time.time():
return p
time.sleep(30) # весь пул на отдыхе — ждём
return next(pool)
def fetch(url, attempts=5):
delay = 1.0
for attempt in range(attempts):
proxy = next_proxy()
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=15,
headers={"Accept": "application/json"},
)
if r.status_code == 200:
time.sleep(random.uniform(0.3, 1.2)) # живая пауза
return r.json()
if r.status_code == 429:
cooldown[proxy] = time.time() + 180 # адрес на паузу
time.sleep(delay)
delay *= 2 # экспоненциальная задержка
continue
except requests.RequestException:
cooldown[proxy] = time.time() + 60
time.sleep(delay)
delay *= 2
return None
Дальше остаётся обвязка: очередь артикулов, запись результата в базу или CSV и сохранение позиции для возобновления. Для больших объёмов имеет смысл перейти на aiohttp с ограничителем параллельности — логика ротации и пауз остаётся той же.
Отдельная ловушка, из-за которой аналитика получается неверной: у маркетплейса цена и наличие зависят от региона доставки. Один и тот же товар в Москве и Хабаровске может отличаться и по стоимости, и по срокам, потому что считается он от ближайшего склада.
Для сборщика это означает две вещи. Во-первых, регион нужно фиксировать явно — иначе площадка подставит его сама, и вы будете сравнивать несопоставимые цифры. Во-вторых, если анализ ведётся по нескольким регионам, каждый из них — это отдельный проход по всему списку артикулов, то есть объём запросов умножается на количество регионов. Пул адресов планируйте с учётом этого множителя: пять регионов по 20 000 карточек — это уже 100 000 запросов, а не 20 000.
Полезная привычка — складывать регион в ту же строку результата, что и цену. Тогда при разборе данных не придётся гадать, откуда взялось расхождение в отчёте за прошлую неделю.
Перед каждым большим сбором прогоняйте адреса коротким тестом: запрос к любому сервису определения IP через каждый прокси из списка. Проверять нужно три вещи — адрес отвечает, отдаёт именно свой IP (а не ваш реальный) и укладывается в разумное время ответа. Пять минут проверки экономят ночь работы: один мёртвый адрес в ротации оставляет в данных дыры, которые обнаружатся уже после сборки отчёта.
Законно ли парсить Wildberries?
Сбор общедоступных данных законом не запрещён. Ограничения — пользовательское соглашение площадки в части автоматизированного доступа и недопустимость чрезмерной нагрузки. По собственным товарам используйте официальный API продавца.
Сколько прокси нужно для парсинга?
Считайте от одного IP на 1–2 запроса в секунду. Для 100 000 карточек за ночь понадобится примерно 20–30 адресов из разных подсетей.
Какие прокси подходят для маркетплейсов?
Серверные IPv4: высокая скорость, низкий пинг и низкая цена за адрес. Высокий trust score для публичных данных не требуется.
Что делать при 429?
Увеличивать паузу вдвое с каждой ошибкой, менять адрес и отправлять текущий IP на несколько минут в отдых.
Подойдут ли мобильные прокси?
Подойдут, но это дорого и избыточно: их сила в доверии антифрода при работе с аккаунтами, а здесь решают скорость и количество адресов.