Парсер сайта ozon.ru по наименованию товара и

Парсер сайта ozon.ru по наименованию товара и возрастанию цены
Дополнительные параметры: codeFlowType: codeWrite codeFlowLang: Python
Создано: 20.05.2025 20:13

Парсер сайта ozon.ru по наименованию товара и возрастанию цены

Конечно! Ниже представлен пример парсера сайта ozon.ru, который ищет товар по названию и сортирует результаты по возрастанию цены. Для этого используется библиотека requests для получения HTML и BeautifulSoup для парсинга.

import requests
from bs4 import BeautifulSoup
import urllib.parse

def ozon_search(query, max_results=10):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/113.0.0.0 Safari/537.36'
    }
    
    # Кодируем поисковый запрос для URL
    encoded_query = urllib.parse.quote(query)
    
    # Формируем URL поиска с сортировкой по цене возрастанию
    url = f'https://ozon.ru/search/?text={encoded_query}&sort=price_asc'
    
    response = requests.get(url, headers=headers)
    if response.status_code != 200:
        print(f"Ошибка при запросе: статус-код {response.status_code}")
        return
    
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # На сайте Ozon результаты поиска могут быть внутри определённых блоков
    # В примере используется класс, вероятно, содержащий товарные карточки
    products = soup.find_all('div', {'class': 'a4f5d9f9af---search-result-row---'})

    results = []

    for product in products[:max_results]:
        # Название товара
        title_tag = product.find('div', {'data-testid': 'product-title'})
        title = title_tag.get_text(strip=True) if title_tag else 'Нет названия'
        
        # Цена товара
        price_tag = product.find('div', {'data-test': 'price'})
        if price_tag:
            price_text = price_tag.get_text(strip=True)
            # Извлечём число из текста, убрав символы валюты и пробелы
            price_numbers = ''.join(filter(str.isdigit, price_text))
            price = int(price_numbers) if price_numbers else None
        else:
            price = None
        
        results.append({
            'название': title,
            'цена': price
        })

    # Сортируем по возрастанию цены
    results_sorted = sorted(results, key=lambda x: (x['цена'] is None, x['цена']))

    # Вывод результатов
    for item in results_sorted:
        print(f"Название: {item['название']}, Цена: {item['цена'] or 'Нет данных'}")

# Пример использования
search_query = "смартфон"
ozon_search(search_query)

Объяснение

  • Мы формируем URL для поиска товара с заданным названием и сортировкой по возрастанию цены (sort=price_asc).
  • Загружаем страницу и парсим её с помощью BeautifulSoup.
  • Ищем карточки товара по классам — эти классы могут изменяться, поэтому для устойчивости рекомендуется проверять структуру сайта.
  • Извлекаем название и цену каждого товара.
  • Сортируем результаты по цене.
  • Выводим первые max_results товаров.

Важные моменты

  • Структура HTML сайта может меняться, поэтому классы и селекторы нужно актуализировать по текущему состоянию сайта.
  • Для больших количеств запросов рекомендуется использовать задержки и соблюдать правила сайта (robots.txt).

Если потребуется, я могу помочь с уточнением селекторов или расширением функциональности.