Skip to content

alextrader2007/wb_parse_search_phrase2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Парсер товаров Wildberries (WB)

Гибридный 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 для выхода

Как это устроено (для понимания)

1. Получение данных

Парсер использует публичные 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 → имя)

2. Защита WB и x_wbaas_token

Wildberries проверяет, что запрос пришёл от реального браузера, через JS-челлендж (canvas, WebGL, тайминги). После прохождения выдаёт cookie x_wbaas_token.

Парсер получает токен тремя способами (по убыванию приоритета):

  1. SeleniumBase + undetected ChromeDriver — запускает полноценный Chrome, проходит все проверки (самый надёжный)
  2. curl_cffi — эмулирует отпечаток TLS Chrome 131 (быстрый, без браузера)
  3. HTTP + регекс — выкусывает токен из HTML (если был установлен ранее)

Токен кэшируется на весь сеанс в _WBAAS_TOKEN. Живёт ~неделю, хватает на 100+ запросов. При ответе 498 парсер обновляет токен автоматически.

3. Параллельные запросы к регионам для остатков

Проблема: 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 — это заглушка "в наличии, точное количество скрыто". Парсер игнорирует эту заглушку.

4. Поисковая выдача

Внутренний поисковый API (u-search/exactmatch/sng/...) требует:

  • Cookie x_wbaas_token (иначе 498)
  • Заголовки X-Spa-Version, X-Userid, X-Requested-With
  • Параметры региона, сортировки, языка (как на сайте)

Парсер перебирает страницы, собирает ID товаров с метаданными (позиция, реклама, время доставки), затем передаёт ID в основной сборщик.

Важно: Порядок выдачи на WB персонализирован (зависит от истории, региона, устройства). Совпадение с браузером ~95-98%.

5. WB-кошелёк ("Незалогиненный кошелёк")

Wildberries предлагает скидку незалогиненным покупателям при оплате через кошелёк. Процент скидки берётся из default-payment.json на CDN WB.

Расчёт: цена_кошелька = цена_со_скидкой × (100 - процент) / 100 (округляется вниз). Если цена выше wlt1DiscountDisplayMaxPrice — скидка не применяется.

6. Определение корзины (basket) для изображений

Изначально basket-номер зависел от vol (vol = артикул // 100000), но WB изменил логику. Теперь парсер:

  1. Угадывает корзину по статической эвристике
  2. Проверяет популярные корзины 39, 40, 41
  3. Если не нашёл — параллельно проверяет корзины 01..99 через ThreadPool

Результат кэшируется в _VOL_BASKET_CACHE.

7. Обработка ошибок

  • 429 Too Many Requests: экспоненциальная задержка (backoff), учёт заголовка Retry-After
  • 404: пробрасывается сразу (повторять бессмысленно)
  • 498 Invalid Token: автоматическое обновление токена через SeleniumBase
  • Аварийное сохранение: при критической ошибке записи Excel → сохраняется *_emergency.csv

8. Сборка .exe

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)

Пошаговая установка

Шаг 1: Клонирование репозитория

git clone https://github.com/alextrader2007/wb_parse_search_phrase2
cd wb_parse_search_phrase2

Шаг 2: Создание виртуального окружения (рекомендуется)

# Windows
python -m venv .venv
.venv\Scripts\activate

# Linux/Mac
python3 -m venv .venv
source .venv/bin/activate

Шаг 3: Установка зависимостей

pip install -r requirements.txt

Это установит: requests, pandas, openpyxl, rich, seleniumbase, curl-cffi, Pillow, pydantic.

Шаг 4: Установка драйвера Chrome для SeleniumBase (опционально)

SeleniumBase автоматически скачает undetected ChromeDriver при первом запуске. Если нужно вручную:

sbase install chromedriver

Шаг 5: Настройка прокси (опционально)

Создайте файл 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) можно скачать из репозитория:

Скачать WBParser.exe

⚠️ Антивирус может ругаться — это нормально для PyInstaller-сборок. Добавьте файл в исключения.

About

Парсер товаров Wildberries (WB)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages