Как стать автором
Обновить

Как я парсил Wildberries без BeautifulSoup

Уровень сложностиПростой

Всем привет! В этой статье я хочу рассказать как столкнулся с необходимостью парсить маркетплейс 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-канал, там много интересного.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.