Гибридный CLI-парсер для сбора данных с Wildberries напрямую через внутренние API.
Работает в двух режимах: по списку артикулов (SKU) и по поисковому запросу.
Собирается в .exe через PyInstaller для работы на Windows без Python.
| Возможность | Описание |
|---|---|
| Сбор по артикулам | Передаёте список SKU — парсер собирает цены, остатки, рейтинг, продавца |
| Поиск по ключевому слову | Вводите "джинсы женские" — парсер находит все товары, определяет их позицию в выдаче |
| Цены в BYN | Регион Гродно (Беларусь) — PRIMARY_DEST, цены в белорусских рублях |
| Остатки по всем складам | Параллельные запросы к 11 регионам (6 российских, Казахстан, Беларусь) — stocks[] мерджатся через Math.max |
| Детализация по складам | "Коледино: 15, Электросталь: 7, Казань: 3" — с человеческими названиями складов |
| Позиция в выдаче | Сквозная нумерация товаров по всем страницам поиска (всегда в таблице) |
| Рекламные товары | Поле "Реклама (Да/Нет)" — всегда присутствует в Excel |
| Цена с WB-кошельком | Расчёт цены со скидкой "Незалогиненный кошелёк" (округляется вниз) |
| Срок доставки | Отдельно для региона и для МСК (всегда в таблице) |
| Характеристики | Описание, размеры, материалы, цвета — выгрузка в отдельные листы Excel |
| Изображения | Автоматическое определение корзины (basket) CDN, вставка фото в Excel |
| Прокси | Ротация прокси из файла, повтор при 429 (Too Many Requests) |
| Rich-интерфейс | Цветные прогресс-бары, таблицы, интерактивные меню в консоли |
| Экспорт | Excel (.xlsx) с авто-фильтром и авто-шириной колонок + опциональный CSV (UTF-8-sig) |
| Сборка .exe | PyInstaller --onefile --console, драйвер в %LOCALAPPDATA%, Pillow вшит |
| Не закрывается | После завершения — Enter для повтора, Esc для выхода |
Парсер использует публичные API Wildberries — те же, что вызываются из браузера:
card.wb.ru/cards/v4/detail— информация о товаре: цены, остатки по складам, рейтинг__internal/u-search/exactmatch/sng/...— внутренний поисковый API: выдача по ключевому словуstatic-basket-XX.wbbasket.ru/vol{vol}/part{part}/{id}/info/ru/card.json— описание и характеристикиstatic-basket-01.wbbasket.ru/vol0/data/stores-data.json— справочник складов (ID → имя)
Wildberries проверяет, что запрос пришёл от реального браузера, через JS-челлендж (canvas, WebGL, тайминги). После прохождения выдаёт cookie x_wbaas_token.
Парсер получает токен тремя способами (по убыванию приоритета):
- SeleniumBase + undetected ChromeDriver — запускает полноценный Chrome, проходит все проверки (самый надёжный)
- curl_cffi — эмулирует отпечаток TLS Chrome 131 (быстрый, без браузера)
- HTTP + регекс — выкусывает токен из HTML (если был установлен ранее)
Токен кэшируется на весь сеанс в _WBAAS_TOKEN. Живёт ~неделю, хватает на 100+ запросов. При ответе 498 парсер обновляет токен автоматически.
Проблема: WB для каждого dest возвращает только склады, привязанные к этому региону. Беларусь показывает лишь ближайшие склады.
Решение: На каждый батч артикулов делаются параллельные запросы к 11 регионам с их родными валютами:
| Регион | dest | Валюта |
|---|---|---|
| Москва / Центр | 123585815 |
RUB |
| СПб / Северо-Запад | 123585590 |
RUB |
| Сибирь / Новосибирск | 123585567 |
RUB |
| Юг / Краснодар | 123585532 |
RUB |
| Поволжье / Казань | 123585474 |
RUB |
| Вост. Сибирь / Кемерово | 123585558 |
RUB |
| Москва (альт.) | -1257786 |
RUB |
| Россия | -1181704 |
RUB |
| Россия | -1029256 |
RUB |
| Казахстан | -1221148 |
KZT |
| Гродно, Беларусь | -2888067 |
BYN |
- Цены берутся только из PRIMARY_DEST (
-2888067, Grodno, BYN) - Stocks[] мерджатся через
Math.maxпо каждому(размер, склад)из ВСЕХ 11 регионов — максимально полная картина остатков - Каждый регион запрашивается со своей валютой (RUB/BYN/KZT), чтобы WB возвращал корректные данные
Важно: WB иногда присылает totalQuantity: 39 — это заглушка "в наличии, точное количество скрыто". Парсер игнорирует эту заглушку.
Внутренний поисковый API (u-search/exactmatch/sng/...) требует:
- Cookie
x_wbaas_token(иначе 498) - Заголовки
X-Spa-Version,X-Userid,X-Requested-With - Параметры региона, сортировки, языка (как на сайте)
Парсер перебирает страницы, собирает ID товаров с метаданными (позиция, реклама, время доставки), затем передаёт ID в основной сборщик.
Важно: Порядок выдачи на WB персонализирован (зависит от истории, региона, устройства). Совпадение с браузером ~95-98%.
Wildberries предлагает скидку незалогиненным покупателям при оплате через кошелёк. Процент скидки берётся из default-payment.json на CDN WB.
Расчёт: цена_кошелька = цена_со_скидкой × (100 - процент) / 100 (округляется вниз). Если цена выше wlt1DiscountDisplayMaxPrice — скидка не применяется.
Изначально basket-номер зависел от vol (vol = артикул // 100000), но WB изменил логику. Теперь парсер:
- Угадывает корзину по статической эвристике
- Проверяет популярные корзины 39, 40, 41
- Если не нашёл — параллельно проверяет корзины 01..99 через ThreadPool
Результат кэшируется в _VOL_BASKET_CACHE.
- 429 Too Many Requests: экспоненциальная задержка (backoff), учёт заголовка Retry-After
- 404: пробрасывается сразу (повторять бессмысленно)
- 498 Invalid Token: автоматическое обновление токена через SeleniumBase
- Аварийное сохранение: при критической ошибке записи Excel → сохраняется
*_emergency.csv
pyinstaller --onefile --console --name "WBParser" \
--hidden-import curl_cffi --hidden-import seleniumbase \
--hidden-import openpyxl --hidden-import rich --hidden-import pandas \
--collect-all PIL wb_parser.py- Драйвер Chrome сохраняется в
%LOCALAPPDATA%\WBParser\drivers(не слетает между запусками) - Pillow (
--collect-all PIL) нужен для вставки изображений в Excel через openpyxl - После завершения — Enter для повторного запуска или Esc для выхода
- Python 3.8 или выше
- Chrome/Chromium (для получения токена через SeleniumBase)
pip(менеджер пакетов Python)
git clone https://github.com/alextrader2007/wb_parse_search_phrase2
cd wb_parse_search_phrase2# Windows
python -m venv .venv
.venv\Scripts\activate
# Linux/Mac
python3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtЭто установит: requests, pandas, openpyxl, rich, seleniumbase, curl-cffi, Pillow, pydantic.
SeleniumBase автоматически скачает undetected ChromeDriver при первом запуске. Если нужно вручную:
sbase install chromedriverСоздайте файл proxies.txt в корне проекта:
http://user:password@ip:port
http://ip:port
ip:port
Одна строка = один прокси. Строки с # игнорируются.
python wb_parser.pyСкрипт сам спросит режим, артикулы/запрос, количество страниц, нужны ли характеристики, имя файла.
По артикулам:
python wb_parser.py -m sku -s "7403217, 13859082, 172948723" -o my_skusПо поисковому запросу:
python wb_parser.py -m search -q "джинсы женские" -p 3 -o search_results| Параметр | Описание |
|---|---|
-m, --mode |
Режим: sku (по артикулам) или search (поиск) |
-s, --skus |
Артикулы через запятую (только для sku) |
-q, --query |
Поисковый запрос (только для search) |
-p, --pages |
Количество страниц поиска (1 страница ≈ 100 товаров) |
-o, --output |
Имя файла (без расширения, по умолчанию wb_results) |
--proxy-file |
Путь к файлу с прокси |
--supplier-id |
ID продавца для фильтрации результатов |
Парсер товаров Wildberries (WB)
Выберите режим:
1 — Сбор данных по артикулам (SKU)
2 — Поиск товаров по ключевому слову
> 2
Введите ключевое слово для поиска: джинсы женские
Укажите количество страниц (1 стр. ~ 100 товаров): 3
Получение токена через SeleniumBase... ✓
Поиск артикулов... ████████████████████████ 3/3
Найдено артикулов: 256
Загрузка деталей... ████████████████████████
┌──── Результаты парсинга ────┐
│ Артикул │ Бренд │ Цена │ ...
│ 123456 │ ZARA │ 89.00 │
│ 789012 │ H&M │ 65.50 │
└──────────────────────────────┘
Созданы файлы:
- wb_results.xlsx
- wb_results.csv
├── wb_parser.py # Главный скрипт парсера
├── requirements.txt # Список зависимостей
├── proxies.txt # Список прокси (создаётся пользователем)
├── README.md # Этот файл
├── dist/
│ └── WBParser.exe # Собранный .exe (если собирали)
- Цены: показываются в BYN (PRIMARY_DEST =
-2888067). Для RUB поменяйте_PRIMARY_DESTиDEFAULT_CURRна"rub". - totalQuantity: 39: это заглушка WB. Парсер её игнорирует.
- Персонализация выдачи: поисковая выдача у WB плавает из-за A/B-тестов и истории пользователя. Парсер выдаёт "как есть" — без учёта персональных факторов.
- Лимиты: парсер делает случайные паузы между запросами. При большом объёме данных используйте прокси.
- SeleniumBase отказ: если Chrome не установлен, парсер пробует curl_cffi и HTTP-fallback. Для стабильной работы рекомендуется Chrome.
- CSV: по умолчанию не сохраняется. Парсер спросит "Сохранить также CSV-файл?" — ответьте
yпри необходимости.
Скомпилированный .exe (Windows, не требует Python) можно скачать из репозитория:
⚠️ Антивирус может ругаться — это нормально для PyInstaller-сборок. Добавьте файл в исключения.