Как понять что парсить и как пользоваться developer console довольно полно расписал в данном ответе. Повторяться не буду, шаги примерно те же, только тут без сокетов.
Что имеем здесь?
Здесь каталог можно удобно получить в json по адресу catalog.wb.ru, а конкретно по этому адресу:
https://catalog.wb.ru/catalog/head_accessories2/catalog?cat=9967&curr=rub&dest=-1257786&fkind=3&page=1®ions=80,64,38,4,115,83,33,68,70,69,30,86,75,40,1,66,48,110,31,22,71,114,111&sort=popular&spp=0&xsubject=79
Копируем в Postman, никакие авторизации не нужны, api открытый. Запрос работает и выдаёт товары, всё, задача решена.
Параметры
Но просто копировать вставлять запрос из браузера дико не интересно, правда же?
Предлагаю разобраться в составляющих запроса.
Какие тут есть параметры?
- cat — 9967
Циферки. Берутся они отсюда, соответственно можно искать по названию категории и потом использовать в запросе.
- curr — rub
Тут, думаю, объяснять не надо. Ну а существующие на сайте курсы можно взять отсюда.
- dest — -1257786
Берётся отсюда, в качестве параметров GPS координаты, адрес можно указать любой он на результат не влияет, но если его не указать, то координаты не сработают и выдаст стандартные. Забираем всё с xinfo
- fkind — 3
Если данный параметр не указывать, результат на первый взгляд не поменялся, можно глубоко не изучать.
- page — 1
Очевидно номер страницы
- regions — 80,64,38,4,115,83,33,68,70,69,30,86,75,40,1,66,48,110,31,22,71,114,111
Опять циферки, много циферок!
- sort — popular
Опять же, совершенно необязательный параметр, сортировка по дефолту идёт по популярным. Чтобы понять какие есть вариант, надо потыкать сайт и смотреть запросы. Возможно они где-то даже указаны, искать сейчас не будем, оставим вам на домашнее задание.
- spp — 0
Очередной параметр который в моём случае не меняет ничего.
- xsubject — 79
Наконец-то что-то интересное. Это подкатегории товаров, которые можно получить в фильтрах по категории.
Код
Отлично, с параметрами разобрались, теперь у нас есть всё, чтобы забрать данные по нескольким категориям, по нескольким городам для сравнения цен и т.д. Делать мы это, конечно же, не будем, но следующий код можно будет адаптировать под цели:
import urllib.parse
import requests
import pprint
# Сюда будем собирать параметры
catalog_params = {}
# Тут ищем id категории. Можно вместо поиска парсить все категории,
# можно прикрутить near match для названия категорий, смысл думаю понятен
for cat in categories:
if cat['name'] == 'Аксессуары':
for child in cat['childs']:
if child['name'] == 'Головные уборы':
catalog_params['cat'] = child['id']
# Получаем координаты любого адреса, пусть будет доставка в Областную Думу в Магадане
address = 'улица Горького, 8А, Магадан'
url = 'https://nominatim.openstreetmap.org/search/' + urllib.parse.quote(address) +'?format=json'
coords = requests.get(url).json()
params = {
'latitude': coords[0]["lat"],
'longitude': coords[0]["lon"],
'address': 'Город чудес и вкусных морепродуктов'
}
r = requests.get('https://user-geo-data.wildberries.ru/get-geo-info', params = params).json()
# Парсим строку с полученными данными и добавляем к параметрам
catalog_params.update({p.split('=')[0]:p.split('=')[1] for p in r['xinfo'].split('&')})
# xsubject забирается также как и основная категория
# Не буду повторяться, просто пропишем
catalog_params['xsubject'] = 79
# Ну и в конце-концов
r = requests.get('https://catalog.wb.ru/catalog/head_accessories2/catalog', params = catalog_params).json()
pprint.pprint(r['data']['products'][0:2], depth=2)
Вывод:
[{'__sort': 61167,
'brand': 'lafreice',
'brandId': 121717,
'colors': [...],
'diffPrice': False,
'dist': 10003,
'feedbacks': 199,
'id': 40036810,
'kindId': 2,
'ksort': 54000,
'logisticsCost': 35500,
'name': 'Меховые наушники',
'panelPromoId': 158688,
'pics': 16,
'priceU': 74100,
'promoTextCat': 'КОСМИЧЕСКИЕ СКИДКИ',
'rating': 5,
'root': 30057509,
'sale': 0,
'saleConditions': 0,
'salePriceU': 100500,
'siteBrandId': 131717,
'sizes': [...],
'subjectId': 79,
'subjectParentId': 6,
'supplierId': 68077,
'time1': 17,
'time2': 257,
'volume': 60},
{'__sort': 58003,
'brand': 'lafreice',
'brandId': 121717,
'colors': [...],
'diffPrice': False,
'dist': 10003,
'feedbacks': 363,
'id': 39884574,
'kindId': 5,
'ksort': 51786,
'logisticsCost': 26600,
'name': 'Меховые наушники кошка',
'pics': 6,
'priceU': 46200,
'rating': 5,
'root': 29487176,
'sale': 0,
'saleConditions': 0,
'salePriceU': 70700,
'siteBrandId': 131717,
'sizes': [...],
'subjectId': 79,
'subjectParentId': 6,
'supplierId': 68077,
'time1': 17,
'time2': 257,
'volume': 45}]