Всем привет! В этой статье я хочу рассказать как столкнулся с необходимостью парсить маркетплейс Wildberries. Задача была получать информацию о товаре (название, цена, скидка, бренд, рейтинг) по артикулу товара.
Для новичков расскажу про парсинг - это процесс автоматического сбора и анализа данных с веб-сайтов.
Например, если вам нужно собрать какой-то объем информации (как в моей задаче это название, цена, скидка, и т.д.) для большого количества объектов, то для автоматизации можно использовать парсеры(скрипты выполняющие парсинг).
В Python чаще всего используют библиотеки BeautifulSoup, Selenium, lxml.
Я покажу как можно парсить Wb без использования BeautifulSoup, только с помощью библиотеки requests.
Указываем переменную с ссылкой на товара
base_url = "
https://card.wb.ru/cards/detail?&dest=-1257786&nm={}".format(article)
где article - эта переменная функции, в которую мы будем передавать артикул товара
Делаем header, который помогает "маскироваться" под браузер, чтобы сайт не заблокировал запрос
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Headers":"Authorization,Accept,Origin,DNT,User-Agent,Content-Type,Wb-AppType,Wb-AppVersion,Xwbuid,Site-Locale,X-Clientinfo,Storage-Type,Data-Version,Model-Version,__wbl, x-captcha-id",
"Access-Control-Allow-Methods":"GET,OPTIONS",
"Access-control-Allow-Origin":"https://www.wildberries.ru",
"Content-Encoding":"gzip",
"Content-Type":"application/json charset=utf-8"
}
он может быть и проще, я взял из реального браузера при входе на сайт wb
Ну и отправляем запрос:
response = requests.get(base_url, headers=headers)
if response.status_code == 200:
card_data = response.json()
url="https://www.wildberries.ru/catalog/{}/detail.aspx".format(article)
сontent = extract_and_save_data(card_data)
else:
content = url = None
return {"content":content, "url":url}
Функция extract_and_save_data
Эта функция извлекает данные из ответа сервера в формате JSON и возвращает их в виде словаря
def extract_and_save_data(data):
products = data.get("data", {}).get("products", [])
for product in products:
product_id = product.get("id", "unknown_id")
name = product.get("name", "No name")
brand = product.get("brand", "No brand")
price = int(product.get("priceU", 0) / 100)
sale_price = int(product.get("salePriceU", 0) / 100)
description = product.get("description", "No description")
rating = product.get("supplierRating","No rating")
sale = product.get("sale", 0)
totalQuantity = product.get("totalQuantity", "No data")
product_info = {
"ID": product_id,
"Name": name,
"Brand": brand,
"Price": price,
"SalePrice":sale_price,
"Description": description,
"Rating":str(rating),
"Sale": str(sale),
"Stock": totalQuantity
}
return product_info
Здесь нужно знать только как работает метод .get, а он пытается получить значение по ключу. Если ключа нет, он возвращает значение по умолчанию.
products = data.get("data", {}).get("products", [])
data — это словарь (наш ответ сервера в формате JSON).
Метод .get() пытается получить значение по ключу "data".
Если ключ "data" существует, метод вернет его значение.
Если ключа "data" нет, метод вернет второй аргумент '{}' - пустой словарь
Пример:
data = {"data": {"products": [1, 2, 3]}}
result = data.get("data", {}) # Вернет {"products": [1, 2, 3]}
.get("products", [])
После того как мы получили значение по ключу "data" пытаемся получить значение по ключу "products" из словаря, который вернулся на предыдущем шаге
Пример:
data = {"data": {"products": [1, 2, 3]}}
result = data.get("data", {}).get("products", []) # Вернет [1, 2, 3]
На этом и закончим. Если интересно про алгоритм хранения картинок на товар wb, дайте обратную связь и я подготовлю статью. В будущем я планирую сделать подобные парсеры для других маркетплейсов. Подписывайтесь на мой tg-канал, там много интересного.