Как извлечь данные истории цены любого товара с Wildberries? Видео инструкция

Не так давно на Wildberries.ru на странице каждого товара появился виджет с историей цены. Я задался вопросом как получить эти данные и вот мое решение.

Тема парсинга маркетплейсов довольно актуальна, и данные о ценах наверное самые важные, на равне с отзывами о товарах. Сегодня об истории цены.

1. Заходим на страницу товара и открываем в браузере панель DevTools (Инструменты разработчика, клавиша F12) и при активированной вкладки Инспектор выбираем блок История цены. В результате мы видим название класса price-history к которому относится данный блок:

<section class="price-history dropdown-open" data-link...

2. Далее переходим во вкладку Network (Сеть) и фильтруем запросы по price-history (если ничего не появилось - обновляем страницу).

Нам повезло, найден один GET запрос, который возвращает от сервера текст в формате *.json.

https://wbx-content-v2.wbstatic.net/price-history/42782921.json?locale=ru

?local=ru можно обрезать, это не обязательный параметр. Теперь мы имеем прямую ссылку на необходимые данные. С самой первой страницей (страницей товара) нас объединяет артикул товара, в нашем случае 42782921.

Здесь данные о цене:

https://wbx-content-v2.wbstatic.net/price-history/42782921.json

Основная ссылка на товар:

https://www.wildberries.ru/catalog/42782921/detail.aspx

Зная артикул товара, мы сможем получить историю его цены.

На самом деле браузер получая эти данные - строит с помощью JS из них красивый график. Но мы заберем только данные, а график будем строить самостоятельно.

3. Смотрим json, можно прямо в браузере, можно в этом сервисе.

[{"dt":1638057600,"price":{"RUB":257600}}, {"dt":1638662400,"price":{"RUB":248100}}, {"dt":1639872000,"price":{"RUB":321500}}, {"dt":1641081600,"price":{"RUB":291375}}, {"dt":1641686400,"price":{"RUB":304500}}, {"dt":1642291200,"price":{"RUB":295800}}]

Он представляет собой список словарей (в питоновской терминологии):

- ключу "dt" соответствует дата в формате Unix (вот как перевести в понятную дату вручную, а вот с помощью Excel)

- а ключу "price" - цена в копейках (кстати, на сайте копейки округлены до рублей, и у нас цены точнее, чем у обычных пользователей).

Теперь вытащить эти данные и обработать их уже дело техники. При небольшом количестве - хоть в ручную. Я использую Python.

5. Скрипт ниже и на GitHub.

import requests from bs4 import BeautifulSoup from datetime import datetime import csv url = "https://www.wildberries.ru/catalog/42782921/detail.aspx" id = url.split("/")[-2] url_price_history = f"https://wbx-content-v2.wbstatic.net/price-history/{id}.json" current_date = "{:%d.%m.%Y}".format(datetime.now()) output_file = f"{id}.csv" def get_title_and_current_price(url): r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') title = soup.title.text current_price = float(soup.find(class_="price-block__final-price").text.strip().replace('₽', '').replace('\xa0', '')) return title, current_price def get_price_history(url_price_history): r = requests.get(url_price_history).json() date_row = [] price_row = [] for i in r: date = datetime.fromtimestamp(i['dt']) date = date.strftime('%d.%m.%Y') date_row.append(date) price_row.append(float((i['price']['RUB']) / 100)) date_row.append(current_date) price_row.append(current_price) return date_row, price_row def add_data_to_csv(row): with open(output_file, "a", encoding='utf-8') as file: writer = csv.writer(file, delimiter=';') writer.writerow(row) if __name__ == '__main__': title, current_price = get_title_and_current_price(url) date_row, price_row = get_price_history(url_price_history) header_row = [title, url] add_data_to_csv(header_row) add_data_to_csv(date_row) add_data_to_csv(price_row)

Разбор в видео

Я по-прежнему в телеграм и теперь на ютубе

0
4 комментария
Marsel Abdullin

Traceback (most recent call last):
File "C:\Users\madbu\OneDrive\������� ����\WB\WB", line 50, in
title, current_price = get_title_and_current_price(url)
File "C:\Users\madbu\OneDrive\������� ����\WB\WB", line 19, in get_title_and_current_price
title = soup.title.text
AttributeError: 'NoneType' object has no attribute 'text'

Ответить
Развернуть ветку
Andrey Roy

@Wildberries_seller_bot

Ответить
Развернуть ветку
MustArt

Спасибо за статью!

Ответить
Развернуть ветку
Дмитрий Савчук

Только вот эта история цен очень странная и не отображает все изменения. Часто наблюдаю собственными глазами колебания цен, которые в график не попадают.

Ответить
Развернуть ветку
1 комментарий
Раскрывать всегда