Парсинг wildberries. Как получить цену одного конкретного товара?

Пишу код для парсинга на wildberries. Когда загружаю в код ссылку на каталог(к примеру https://www.wildberries.ru/catalog/muzhchinam/odezhda/kostyumy), после запуска кода получаю значение цены на первый товар из каталога. Когда же я хочу получить цену на какой-либо из конкретных товаров (к примеру https://www.wildberries.ru/catalog/202925589/detail.aspx), то после запуска получаю сообщение, что цена не найдена. Что нужно исправить в коде, что бы я мог получить цену только одного конкретного товара по ссылке? Поиск элемента с ценой вроде правильный. Быть может нужно изменить подход?

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from fake_useragent import UserAgent
import time
import random
import re
def get_price_wildberries(url):
    options = uc.ChromeOptions()
    ua = UserAgent()
    user_agent = ua.random
    options.add_argument(f'user-agent={user_agent}')
    driver = uc.Chrome(options=options)
    try:
        driver.get(url)
        driver.implicitly_wait(10)  # Wait for dynamic content
        # Поиск элемента с ценой. Подход должен быть гибким
        price_element = driver.find_element(By.CSS_SELECTOR, ".price-block__final-price, .price__price, .price, span.price")
        print(price_element.text)
        price_text = price_element.text.strip()
        print(price_text)

        # Извлекаем только цифры и точки для преобразования в float
        price_value = re.sub(r"[^\d\.]", "", price_text)

        # Проверяем наличие точки
        if "." not in price_value:
           try:
              return int(price_value)
           except ValueError:
                return None
        try:
             return float(price_value)
        except ValueError:
            return None

    except Exception as e:
         print(f"Error getting price: {e}")
         return None
    finally:
        print('Сработал блок 2')

        driver.quit()
if __name__ == '__main__':
   product_url = "https://www.wildberries.ru/catalog/202925589/detail.aspx"
   price = get_price_wildberries(product_url)
   if price:
      print(f"Product price: {price}")
   else:
        print(f"Price not found for {product_url}")

Ответы (1 шт):

Автор решения: Tsvik Vitaly

Советую начать работать с инструментами разработчика (для Chrome или Mozilla это клавиша F12)

Если открыть инструменты разработчика на wildberries и обновить страницу можно найти огромное количество ссылок на внутренние(хотя скорее открытые) api. Подсказка: сеть(network) -> список. там есть заголовки(headers). в заголовках есть url куда посылается запрос (и ip), какой запрос (POST, GET и т.п.) и что туда было отправлено (полезная нагрузка или payload).

есть открытая ручка api wildberries: https://card.wb.ru/cards/v2/detail например, https://card.wb.ru/cards/v2/detail?appType=1&curr=rub&dest=-1255987&spp=30&ab_testing=false&nm=314337853

wildberries, моё почтение - ручки работают молниеносно.

для эффективного парса любой страницы, использующей dotnet(aspx) или js (или в случае wildberries - комбо) selenium и его аналоги стоит использовать только для выполнения действий на странице (ТОЛЬКО В ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ КОНЕЧНО... КОНЕЧНО...) либо в саааааааааааааамом крайнем случае. в остальном всегда есть api-ручки, по которым можно получить чистые данные в json или xml формате, без тонны html разметки, через requests или aiohttp.

→ Ссылка