🎯 О чём этот конспект: Детальное руководство по обходу жесткого лимита Wildberries (и других маркетплейсов), который не позволяет просматривать более 60 страниц выдачи (около 6000 товаров). Разбирается уникальная методика динамического дробления поискового запроса на ценовые диапазоны для выгрузки миллионных баз данных.
👤 Кому будет полезно: Вайбкодерам, разработчикам парсеров и тем, кто хочет зарабатывать на продаже готовых выгрузок товаров (Data Mining).
✨ Что получите: Готовый Python-класс для автоматического подбора ценовых фильтров, который позволяет «достать» все товары из категории, даже если их там более 900 000.
1. Проблема «61-й страницы» и стратегия обхода
Контекст: При обычном парсинге через GET-запросы Wildberries отдает данные только до 60-й страницы (по 100 товаров на каждой). При попытке запросить 61-ю страницу сервер возвращает ошибку 500. Это сделано для защиты от ботов, так как обычный пользователь редко листает так далеко. Чтобы обойти это ограничение и спарсить, например, 900 000 кроссовок, нужно использовать фильтры, которые сузят выборку до <5000 товаров в каждом сегменте. Самый универсальный фильтр — цена.
Выгода: Возможность выгружать полные базы данных товаров для аналитики, обходя любые лимиты пагинации.
Как применить:
Шаг 1: Анализ API — Инструменты разработчика (Network -> Fetch/XHR) — Найти запрос catalog и изучить параметр priceU, который принимает диапазон цен в копейках.
Шаг 2: Алгоритм сегментации — Python — Использовать рекурсивное деление диапазона цен (Binary Search-like подход): если в диапазоне >5000 товаров, делим его пополам, пока не уложимся в лимит.
2. Архитектура класса для поиска ценовых диапазонов
Контекст: Для автоматизации процесса создается класс VBSearchPhraseParserRange. Он инициализирует базовые параметры: поисковую фразу, куки (для обхода защиты) и шаги цены. Важно учитывать, что WB принимает цены в копейках (нужно умножать рубли на 100).
Выгода: Модульный код, который легко встроить в любой асинхронный парсер.
Как применить: Используйте следующую структуру инициализации класса:
Контекст: Это «сердце» алгоритма. Если запрос к API показывает, что в выбранном диапазоне цен (например, 1000–2000 руб.) товаров больше 5000, функция вызывает саму себя для двух под-диапазонов (1000–1500 и 1501–2000). Процесс повторяется, пока каждый сегмент не станет «видимым» для парсера.
Выгода: Гарантированный охват 100% товаров в высококонкурентных категориях.
Как применить: Реализуйте метод split_price_range с защитой от бесконечной рекурсии:
def split_price_range(self, min_price, max_price, depth=0): if depth > self.max_split or (max_price - min_price) <= self.min_step: # Если достигли дна, возвращаем что есть data = self.fetch_data(add_params={'priceU': f"{min_price};{max_price}"}) total = self.get_total(data) return [DataPage(min_price, max_price, total)] # Логика деления пополам middle = (min_price + max_price) // 2 left = self.split_price_range(min_price, middle, depth + 1) right = self.split_price_range(middle + 1, max_price, depth + 1) return left + right
4. Динамическое управление шагом (Optimization)
Контекст: Цены распределены неравномерно. В сегменте «эконом» товаров очень много (нужен мелкий шаг), в сегменте «люкс» — мало (нужен огромный шаг для скорости). Алгоритм должен уметь ускоряться, если товаров в текущем окне меньше 500.
Выгода: Сокращение количества запросов к API в 5-10 раз, что снижает риск блокировки и увеличивает скорость работы.
Как применить: В основном цикле while добавьте проверку наполненности:
if data.total > self.max_count_of_goods: # Если перебор — дробим рекурсивно result_ranges.extend(self.split_price_range(start_price, finish_price))elif data.total < 500: # Если слишком мало — увеличиваем шаг для следующей итерации self.step = self.max_stepelse: # Оптимально — сбрасываем на дефолт self.step = self.default_step
5. Получение метаданных (Min/Max Price и Total)
Контекст: Прежде чем начинать цикл, нужно узнать глобальные границы цен для конкретного поискового запроса. Эти данные WB отдает в объекте filters при первом пустом запросе.
Выгода: Автоматическая адаптация под любой товар — от спичек до телевизоров.
Как применить: Используйте вспомогательный метод для парсинга JSON-ответа:
def get_min_max_price(self, data): filters = data.get('data', {}).get('filters', []) for f in filters: if f.get('name') == 'Цена': return f.get('minPrice'), f.get('maxPrice') return None, None
FAQ
В: Почему нельзя просто парсить по брендам или продавцам?
О: У популярных брендов (Nike, Adidas) или крупных продавцов количество товаров также может превышать 5000-6000 единиц, и вы снова упретесь в лимит. Цена — более гибкий и дробный параметр.
В: Что делать, если WB заблокирует IP за частые запросы?
О: Используйте мобильные прокси с ротацией по ссылке (например, Mobile Proxy Space). При получении ошибки, отличной от 200, делайте GET-запрос на смену IP и повторяйте попытку.
В: Насколько точны данные о количестве товаров (Total)?
О: Цифра total в API WB — это оценочное значение (кэшированное). Реальное количество собранных товаров может отличаться на 1-3% из-за динамического обновления остатков.
В: Зачем нужны Cookies в запросе?
О: С недавних пор Wildberries усилил защиту. Без актуальных куки (особенно параметров проверки браузера) сервер может отдавать пустые результаты или ошибку 403.
В: Можно ли использовать этот метод для Ozon?
О: Да, принцип сегментации по цене универсален для большинства маркетплейсов (Ozon, AliExpress, Amazon), так как все они имеют лимиты на глубину пагинации для оптимизации нагрузки на БД.
Конспект создан на основе видео «Как спарсить миллион товаров? Парсинг Wildberries на Python» канала Parshub. Все права на оригинальный материал принадлежат авторам.Источник: https://youtu.be/iqZ1H8qyFlc