Всем привет!
Ранее я уже писал про парсинг Wildberries, но та статья была довольно узконаправленной и не затрагивала более широкие возможности анализа. Да и с тех пор многое изменилось — тема стала ещё актуальнее, а у читателей накопилось больше вопросов.
Поэтому в этой статье мы разберём тему заново, но уже с акцентом на практическую пользу. Мы разберём:
как достать данные о товарах и ценах из WB,
как превратить их в удобные таблицы или графики,
и как использовать их для анализа конкурентов и рынка в целом.
Всё это будет реализовано на Python.
Все примеры приведены исключительно в образовательных целях. Для коммерческой работы у Wildberries есть официальный Public API.
Сам парсер мы развернем тремя командами в IDE, используя Git, в облачном сервисе Amvera — о нём расскажем чуть ниже.
Где искать данные для парсинга?
Первый вопрос, который возникает у любого, кто хочет парсить Wildberries: а где вообще лежат данные?
Ответ прост: прямо в браузере. Когда мы открываем карточку товара или каталог, сайт делает фоновые запросы к API и принимает информацию в формате JSON.
Посмотреть их можно в DevTools (панель разработчика в браузере):
Откройте любую страницу на Wildberries.
Нажмите
F12— вкладка Network - фильтр Fetch/XHR.Обновите страницу (
CTRL+F5).-
В списке запросов вы увидите адреса вида:
https://u-search.wb.ru/exactmatch/ru/common/v18/search?ab\_testid=new\_benefit\_sort&appType=1&curr=rub&dest=-1257786&inheritFilters=false&lang=ru&page=1&query=%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&resultset=catalog&sort=popular&spp=30&suppressSpellcheck=false— именно это и выводит результаты поиска (в нашем случае по запросу «пример поиска»).
Если кликнуть по такому запросу и открыть вкладку Response, то там будет чистый JSON: название, цена, рейтинг, количество отзывов, бренд и другая полезная информация, которую мы будем парсить.
Пример ответа для одного товара:
"products":[
{
"__msort":113473,
"mrel":9862,
"mksort":65,
"id":124063338,
"time1":3,
"time2":60,
"wh":117986,
"dtype":6597069766664,
"dist":991,
"root":110497359,
"kindId":0,
"brand":"НА ПРИМЕР",
"brandId":313700,
"siteBrandId":0,
"colors":[
],
"subjectId":4961,
"subjectParentId":786,
"name":"Комиксы детские для мальчиков 5-11 лет",
"entity":"книги-комиксы",
"matchId":131554853,
"supplier":"ОП!",
"supplierId":222339,
"supplierRating":4.7,
"supplierFlags":12224,
"pics":18,
"rating":5,
"reviewRating":4.7,
"nmReviewRating":4.7,
"feedbacks":45,
"nmFeedbacks":45,
"panelPromoId":1009972,
"volume":3,
"viewFlags":1581072,
"sizes":[
{
"name":"",
"origName":"0",
"rank":0,
"optionId":218050475,
"wh":117986,
"time1":3,
"time2":60,
"dtype":6597069766664,
"price":{
"basic":160000,
"product":33700,
"logistics":300,
"return":0
},
"saleConditions":146800640,
"payload":"длинная-строка"
}
],
"totalQuantity":1,
"meta":{
"tokens":[
]
}
},
...

Где будем запускать парсер?
Прежде чем приступать к работе с данными, давайте разберём, где мы будем развертывать наш парсер.
Запуск произведем в Amvera — облачном сервисе, который позволяет быстро и просто запускать IT‑приложения. А главное, запросы идут с разных IP, что снижает риск блокировки. Проект можно развернуть буквально за 5–10 минут.
Почему Amvera удобен для нас:
Использование пула IP — наши запросы будут идти через разные IP, что снизит риск блокировки и 429 ошибки. Это бесплатно и идет из коробки.
Бонус при регистрации — 111 рублей. Эти деньги можно получить и использовать для тестирования, отладки или кратковременного запуска приложения без дополнительных условий.
Бесплатное проксирование к OpenAI, Gemini, Grok AI и другим сервисам с региональными ограничениями — удобно для интеграций с LLM.
Поддержка LLaMA и ChatGPT‑инференса. Это значит, что мы можем обрабатывать данные без покупки токенов через зарубежные карты, например для OpenAI.
Простое развёртывание приложения: достаточно настроить несколько параметров конфигурации и выполнить 4 команды в терминале через git push. При желании файлы можно загружать и через веб-интерфейс, без командной строки.
Итак, перейдём к практике.
Шаг 0: Как устроен URL поиска Wildberries и что означают его параметры
Когда мы работаем с данными Wildberries через внутреннее API, мы обращаемся к URL вроде этого:
На первый взгляд, это длинная и сложная строка, но на самом деле она состоит из обычных параметров, каждый из которых отвечает за конкретную часть поиска.
Основные параметры
appType— тип приложения: 1 = веб, 4 = мобильное. Влияет на формат данных.curr— валюта:rub— рубли,usd— доллары и т.д.dest— регион или склад. Определяет наличие товара и цену.lang— язык интерфейса и описаний товаров.page— номер страницы поиска. Позволяет листать результаты.query— поисковый запрос, например"смартфон"или"наушники".resultset— скорее всего тип поиска. Обычноcatalog.sort— сортировка результатов: популярные, по цене, рейтингу и т.д.spp— количество товаров на одной странице.
Шаг 1. Минимальный парсер Wildberries
Для запуска нужен Python >=3.11 и библиотеки requests и pandas
import requests
import pandas as pd
# Создаем строку (пока query = захардкоженое значение)
query = "смартфон"
url = f"https://search.wb.ru/exactmatch/ru/common/v18/search?appType=1&curr=rub&dest=-1257786&lang=ru&page=1&query={query}&resultset=catalog&sort=popular&spp=30"
response = requests.get(url)
data = response.json()
# Получаем список продуктов
products = data.get("products", [])
# Преобразуем данные в удобный для создания DataFrame вид
items = []
for p in products:
item = {
"id": p.get("id"),
"name": p.get("name"),
"brand": p.get("brand"),
"price": p.get("sizes", [{}])[0].get("price", {}).get("product", 0) / 100, # цена в рублях
"rating": p.get("rating", 0),
"feedbacks": p.get("feedbacks", 0)
}
items.append(item)
df = pd.DataFrame(items)
print(df.head())
# Сохраняем в CSV
df.to_csv("test.csv", index=False)
Что делает этот код:
Достает данные с Wildberries по запросу
query.Берёт нужные поля:
id,name,brand,price,rating,feedbacks.Преобразует в таблицу
pandas DataFrame.Сохраняет в CSV, чтобы можно было удобно анализировать и строить графики.
После выполнения кода выше получаем test.csv с содержимым:
id,name,brand,price,rating,feedbacks
507623823,Смартфон Redmi 13C 8ГБ 256 ГБ 90гц Аndroid синий,Xiaomi,6121.0,5,4
518695516,Смартфон Y19 8 256 ГБ Черный,VIVO,4320.0,0,0
309442000,Смартфон Frbby F10 4 128GB 5000mAh черный,,5301.0,5,53
488478649,Смартфон realne 13C 6 128ГБ,,4517.0,4,15
256099131,"M-HORSE, Смартфон P70 64 ГБ 5000 мАч Светло-серый",MI,4143.0,4,84
365784152,"Смартфон Y04 4+128 Гб, малахитовый черный",vivo,8567.0,5,95
440536590,SPARK Go 1 4+128GB,TECNO,6754.0,5,107
478600034,Galaxy A16 4+128GB,Samsung,10995.0,5,23
384497995,Смартфон A55 Plus 12+512+Разблокировка по лицу и отпечатку,,5569.0,4,68
342395239,SPARK Go 1 3+64GB,TECNO,4945.0,5,150
507519429,Смартфон Y71 6 128 Gb Черный,VIVO,2760.0,5,2
480685679,Смартфон SPARK 40C 128+8GB Ink Black,TECNO,9272.0,5,39
...
Шаг 2. Визуализация данных
После того как мы собрали данные о товарах и ценах из Wildberries и сохранили их в CSV (test.csv), следующим шагом будет анализ и визуализация. Это позволит быстро понять, какие бренды популярны, как распределены цены, и где есть возможности для конкуренции.
Мы будем использовать Python, а именно библиотеки:
pandas— для работы с таблицами,matplotlibиseaborn— для графиков.
2.1. Гистограмма цен
Сначала посмотрим, как распределены цены на смартфоны:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("test.csv")
plt.figure(figsize=(10,6))
sns.histplot(df['price'], bins=20, kde=True)
plt.title("Распределение цен на смартфоны")
plt.xlabel("Цена, руб")
plt.ylabel("Количество товаров")
plt.tight_layout()
plt.savefig("price.png")
plt.close()
Вывод сохраняется в price.png:

2.2. Топ брендов по количеству товаров
Теперь посмотрим, какие бренды представлены больше всего:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("test.csv")
top_brands = df['brand'].value_counts().head(10)
plt.figure(figsize=(10,6))
sns.barplot(x=top_brands.index, y=top_brands.values)
plt.title("Топ-10 брендов по количеству товаров")
plt.xlabel("Бренд")
plt.ylabel("Количество товаров")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("brands_count.png")
plt.close()
Вид brands_count.png:

2.3. Топ брендов по средней цене
Интересно также посмотреть, у каких брендов самые дорогие товары:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("test.csv")
brand_price = df.groupby('brand')['price'].mean().sort_values(ascending=False).head(10)
plt.figure(figsize=(10,6))
sns.barplot(x=brand_price.index, y=brand_price.values)
plt.title("Топ-10 брендов по средней цене")
plt.xlabel("Бренд")
plt.ylabel("Средняя цена, руб")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("brands_avg_price.png")
plt.close()
График brands_avg_price.png:

Шаг 3. Создаём Телеграм-бота для анализа Wildberries
Теперь мы можем сделать бота, которому достаточно написать команду /search <запрос>;, а бот:
Получает товары с WB по вашему запросу,
Строит графики и сохраняет их в PNG,
Отправляет графики пользователю.
3.1. Установка зависимостей
В проекте будут использованы следующие зависимости:
aiogram— для бота Telegrampandas— работа с таблицамиmatplotlibиseaborn— графикиrequests— запросы к API WBpython-dotenv— хранение токена бота в.env(нужно только локально, в Amvera будем использовать интерфейс)
Если будете тестировать локально — создайте .env с содержимым:
TOKEN=ВАШ_ТОКЕН_ТЕЛЕГРАМ
Напишем файл requirements.txt, содержащий список наших зависимостей. Это поможет нам в дальнейшем развертывании решения.
requirements.txt:
aiogram==3.22.0
requests==2.32.5
pandas==2.3.2
matplotlib==3.10.6
seaborn==0.13.2
python-dotenv==1.1.1
3.2. Код бота
import asyncio
import requests
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import io
import logging
import os
from dotenv import load_dotenv
from aiogram import Bot, Dispatcher, types, F
from aiogram.types import InlineKeyboardButton, CallbackQuery, InputFile
from aiogram.filters import CommandStart, Command, CommandObject
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.client.default import DefaultBotProperties
from aiogram.enums.parse_mode import ParseMode
logging.basicConfig(level=logging.INFO)
load_dotenv()
bot = Bot(os.getenv("TOKEN"), default=DefaultBotProperties(parse_mode=ParseMode.HTML)) # Создайте переменную окружения TOKEN с токеном вашего бота
dp = Dispatcher()
@dp.message(Command("search"))
async def search_wb(message: types.Message):
query = message.text.split(" ", 1)[1]
if not query:
await message.answer("Пожалуйста, укажи, что искать: /search <запрос>")
return
await message.answer(f"Ищу товары по запросу: {query}...")
# Получаем и парсим данные
url = f"https://search.wb.ru/exactmatch/ru/common/v18/search?appType=1&curr=rub&dest=-1257786&lang=ru&page=1&query={query}&resultset=catalog&sort=popular&spp=30"
response = requests.get(url)
data = response.json()
products = data.get("products", [])
items = []
for p in products:
item = {
"id": p.get("id"),
"name": p.get("name"),
"brand": p.get("brand"),
"price": p.get("sizes", [{}])[0].get("price", {}).get("product", 0) / 100,
"rating": p.get("rating", 0),
"feedbacks": p.get("feedbacks", 0)
}
items.append(item)
df = pd.DataFrame(items)
if df.empty:
await message.answer("По вашему запросу товаров не найдено.")
return
# 1. Гистограмма цен
plt.figure(figsize=(8,5))
sns.histplot(df['price'], bins=20, kde=True)
plt.title("Распределение цен")
plt.xlabel("Цена, руб")
plt.ylabel("Количество товаров")
price_buf = io.BytesIO()
plt.savefig(price_buf, format='png')
price_buf.seek(0)
plt.close()
# 2. Топ-10 брендов по количеству
top_brands = df['brand'].value_counts().head(10)
plt.figure(figsize=(8,5))
sns.barplot(x=top_brands.index, y=top_brands.values)
plt.title("Топ-10 брендов по количеству товаров")
plt.xlabel("Бренд")
plt.ylabel("Количество")
plt.xticks(rotation=45)
brands_count_buf = io.BytesIO()
plt.savefig(brands_count_buf, format='png')
brands_count_buf.seek(0)
plt.close()
# 3. Топ-10 брендов по средней цене
brand_price = df.groupby('brand')['price'].mean().sort_values(ascending=False).head(10)
plt.figure(figsize=(8,5))
sns.barplot(x=brand_price.index, y=brand_price.values)
plt.title("Топ-10 брендов по средней цене")
plt.xlabel("Бренд")
plt.ylabel("Средняя цена, руб")
plt.xticks(rotation=45)
brands_avg_price_buf = io.BytesIO()
plt.savefig(brands_avg_price_buf, format='png')
brands_avg_price_buf.seek(0)
plt.close()
# Отправляем все 3 графика
await message.answer_photo(types.BufferedInputFile(price_buf.getvalue(), filename='price.png'))
await message.answer_photo(types.BufferedInputFile(brands_count_buf.getvalue(), filename='brands_count.png'))
await message.answer_photo(types.BufferedInputFile(brands_avg_price_buf.getvalue(), filename='brands_avg_price.png'))
async def on_start():
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(on_start())
3.3. Что умеет бот
По команде
/search <запрос>;собирает товары Wildberries.-
Формирует три графика:
распределение цен,
топ-10 брендов по количеству товаров,
топ-10 брендов по средней цене.
Отправляет графики в PNG, готовые для анализа

Код и графики дают базовую аналитику, но пространство для улучшений огромное: можно парсить больше страниц, анализировать отзывы, интегрировать и с другими сервисами.
Шаг 4. Деплой в Amvera
Итак, когда у нас уже есть что-то, мы можем перейти к деплою бота.
Регистрация в Amvera
Как ни странно, для начала нужно зарегистрироваться по ссылке. Сразу после регистрации вы получите 111 рублей для тестов. Этого будет достаточно для того, чтобы довести проект до ума и некоторое время подержать приложение бесплатно.
Создание проекта
На главной странице жмем кнопку "Создать проект" и действуем по инструкции ниже:
Шаги создания проекта
-
Выбор сервиса
1.1 Тип сервиса: Приложение
1.2 Жмём далее.
-
Тариф
2.1 Название проекта: произвольное
2.2 Выберите тариф: рекомендуется использовать тариф не ниже "Начального".
-
Загрузка данных.
3.1 На этом шаге вы можете привязать локальный репозиторий Git, если будете использовать его. Об этом поговорим чуть позже.
3.2 Рекомендуется пропустить этот шаг и загрузить данные после создания проекта. 3.3 Жмём далее.
-
Переменные
4.1 Переменные окружения создадим позже. Жмём далее
-
Конфигурация
5.1 Аналогично с переменными, создадим их позже.
Завершаем создание проекта и переходим на его страницу.
Загрузка данных
Теперь у нас есть выбор как загружать данные:
Через интерфейс. Удобно, если вдальнейшем не планируете часто обновлять проект.
Через пуш в git-репозиторий Amvera. Самый удобный способ, если ведете разработку в одиночку.
Через пуш в репозиторий стороннего Git-сервиса (например, GitHub). Удобно, если работаете в команде.
Сейчас же мы загрузим данные через интерфейс.
Однако, если вы планируете использовать второй или третий способ, следуйте инструкциям ниже:
Загружаем в корень Code два файла:
requirements.txt
Создание конфигурации
Для сборки и запуска приложения, сервису нужны инструкции, которые мы пропишем в файл конфигурации — amvera.yml.
Самостоятельно файл создавать не нужно, достаточно воспользоваться встроенным во вкладку «Конфигурация» конфигуратором и нажать кнопку «Применить».
Просто пропишите следующие значения параметров:

Создание переменных окружения
Amvera поддерживает два типа переменных:
Секрет. Чаще всего используется для токенов ботов и любых других конфиденциальных данных. Именно его мы и создадим. Его особенность в том, что никто кроме вашего проекта не видит значение переменной.
Переменная окружения. Обычная переменная. Видна всем, у кого есть доступ к ЛК (извне не видно никому).
Создадим секрет TOKEN во вкладке «Переменные».

Сборка и запуск проекта
Если вы все сделали по инструкции, то все готово к первой сборке и запуску. Для этого нужно лишь перейти вовкладку «Конфигурация» и нажать кнопку «Собрать». После этого начнется процесс сборки и запуска.
Если у вас возникли сложности при запуске или сборке - обращайтесь в техническую поддержку.
https://t.me/amverachat
support@amvera.ru
Итог
В этой статье мы разобрали, как собрать и проанализировать данные о товарах и ценах с Wildberries и реализовали:
Парсинг данных — через внутренние API Wildberries, получая JSON с товарами, брендами, ценами, рейтингами и отзывами.
Обработку и визуализацию — с помощью
pandas,matplotlibиseabornможно строить таблицы и графики для анализа конкурентов.Автоматизацию через Telegram-бота — бот позволяет быстро получать аналитику по любому запросу прямо в чат, с готовыми графиками.
Деплой в облако Amvera — проект можно легко запустить и тестировать в облачном окружении без лишних настроек.
Это именно демонстрационный пример, на основе которого можно реализовать собственный парсер цен конкурентов.
Релевантные статьи и страницы документации:
Комментарии (0)

VladimirFarshatov
21.09.2025 08:58В парсерах надо обязательно ограничивать частоту запросов, делая паузы в 3-10сек между не более десятком запросов. В противном случае ИБ заблокирует ваш ИП как ДДОС и достаточно быстро, автоматами контроля за нагрузкой сайтов. Поэтому и прилетает 429.

Alosxkj
21.09.2025 08:58Но на ВБ есть открытый эндпоинт по которому можно получить список всех товаров любого продавца. Без каких либо лимитов.

maks_demin
21.09.2025 08:58Глянул то о чём вы говорите, и кажется, что это работает только для продавцов и только в рамках собственного магазина, или вы можете поделиться, как это можно прикрутить для исследований товаров других магазинов?

ilnuribat
21.09.2025 08:58В целом он прав, на вб практически нет защиты от парсинга, и достаточно изучить как-то запросы идут из браузера и повторить
Занимаюсь парсингом вб с 2020, почти все что там видно покупателю - храню в своей бд clickhouse

maks_demin
21.09.2025 08:58окак.. Надо будет как-то на досуге ради интереса посмотреть самому. Вообще даже удивительно, что у них всё на примитивном уровне

kloun_za_2rub
21.09.2025 08:58Хотелось бы почитать комментарий антифрод команды wb. Просто я не верю, что они не подсовывают вам фейковые данные

ilnuribat
21.09.2025 08:58Этим озон активно занимался
Вб в курсе что их парсят, и понимают ценность этого: селлеры лучше ориентируются в мп, понимают что происходит в нише, и видят куда ещё можно зайти
Обычно, анализ ниш делают на вб, потом эти товары пытаются продавать и на вб и на озн

Groh
21.09.2025 08:58Все жду, когда смогу приказать нюросети найти и купить самый лучший товар в самый дешёвый момент

ivchatov309
21.09.2025 08:58Когда невросети флагманского уровня будут работать на финансируемых краудфандингом ЦОДах в юрисдикции без экстрадиции во все имперские государства. Вот как только - так сразу.

Groh
21.09.2025 08:58А зачем флагманский уровень? Просто в цикле крутить тот же сценарий, с которым люди справляются во время распродажи на амазоне

ivchatov309
21.09.2025 08:58Потому что гонка вооружений. Чем способней невросети - тем больше мер против них и тем они хитрее.

Groh
21.09.2025 08:58Воевать против покупателя, который делает покупки эмоционально, это стрелять себе во все три ноги

h4r7w3l1
21.09.2025 08:58а есть ли смысл?
https://huggingface.co/datasets/nyuuzyou/wb-feedbacks
p.s. соседние смотрите датасеты
p.s.s. вроде бы как озон предоставлял данные в открытую, даже с кейсами подбора целевой ниши. кажется вполне разумным аккумулировать рынок, создавать конкурентность для роста качества и утп, путем предоставления открытых данных
Data4
А какие ограничения у данного подхода парсинга? Обычно крупные маркетплейсы, как Wildberries не любят, когда много информации с них парсят
MarkovM Автор
В данной реализации парсинга, лучше ограничивать количество запросов, иначе будет прилетать 429 ошибка.