Парсинг Ozon на Python: от базовых запросов до обхода защиты

Введение: зачем парсить Ozon и какие данные можно получить

Маркетплейс Ozon — это не просто площадка для покупок, а гигантский массив данных, который может стать конкурентным преимуществом для продавцов, аналитиков и маркетологов. Парсинг (автоматический сбор данных) позволяет извлекать информацию о товарах, ценах, отзывах, рейтингах и даже динамике спроса — всё то, что вручную собирать нереально из-за объёмов. Например, вы можете отслеживать, как конкуренты меняют цены на аналогичные товары, анализировать ключевые слова в названиях продуктов или выявлять тренды по росту продаж в определённых категориях.

Однако парсинг Ozon — задача не из простых. Платформа активно борется с автоматизированными запросами: блокирует IP, требует капчи, меняет структуру HTML и даже может забанить аккаунт, если заподозрит нетипичную активность. В этой статье мы разберём, как обойти эти ограничения с помощью Python, какие инструменты использовать для разных типов данных, и — что критично — как делать это легально, не нарушая правила Ozon.

Важно понимать: парсинг может быть как "серым" (с риском блокировок), так и "белым" — через официальные API. Мы рассмотрим оба подхода, чтобы вы могли выбрать оптимальный вариант для своих задач.

Какие данные можно спарсить с Ozon и зачем они нужны

Перед тем как писать код, определите, какую именно информацию вы хотите получить. Вот основные типы данных, которые чаще всего парсят с Ozon:

  • 📦 Каталог товаров: названия, описания, категории, бренды, артикулы. Нужно для анализа ассортимента конкурентов или формирования собственной номенклатуры.
  • 💰 Цены и скидки: текущие и исторические цены, акции, динамика изменений. Позволяет строить стратегии ценообразования.
  • Отзывы и рейтинги: текстовые отзывы, оценки, даты публикации. Используется для анализа удовлетворённости клиентов и выявления слабых мест продуктов.
  • 📈 Позиции в поиске: ранжирование товаров по ключевым словам. Помогает оптимизировать карточки товаров для лучшей видимости.
  • 🚚 Информация о доставке: сроки, стоимость, доступность в регионах. Актуально для логистической аналитики.
  • 🔍 Тренды и популярность: количество продаж, динамика спроса, сезонные колебания. Нужно для прогнозирования и закупок.

Например, если вы продавец, вам может быть интересно отслеживать, как часто конкуренты обновляют цены на смартфоны Xiaomi в категории Электроника, или какие ключевые слова используют в названиях товаров для лучшего ранжирования. Аналитики же могут собирать отзывы на косметику, чтобы выявлять частые жалобы клиентов и предлагать улучшения.

📊 Какие данные с Ozon вам интересны больше всего?
Цены и скидки
Отзывы и рейтинги
Каталог товаров
Позиции в поиске
Другое

Однако не все данные одинаково доступны. Например, историю цен или точные объёмы продаж Ozon не показывает открыто — их можно получить только косвенными методами (например, через парсинг архивов или анализ динамики рейтинга).

Способы парсинга Ozon: от простого к сложному

Существует несколько подходов к парсингу Ozon, каждый из которых имеет свои плюсы и минусы. Выбор метода зависит от объёма данных, бюджета и технических навыков.

Метод Сложность Скорость Риск блокировки Когда использовать
Ручной сбор (копирование в Excel) Низкая Очень медленно Отсутствует Для разовых задач (например, анализ 10-20 товаров)
Парсинг через браузер (Selenium) Средняя Медленно Высокий Для сбора данных с динамически загружаемых страниц (например, отзывы)
HTTP-запросы (Requests + BeautifulSoup) Средняя Быстро Средний Для статических страниц (каталог, карточки товаров)
Официальное API Ozon Высокая (нужен доступ) Очень быстро Низкий Для легального сбора данных в больших объёмах (требует согласования)
Прокси + ротация User-Agent Высокая Быстро Низкий Для массового парсинга с обходом блокировок

Наиболее популярный среди новичков метод — использование библиотек requests и BeautifulSoup. Он подходит для сбора данных со статических страниц, например, каталога товаров. Однако Ozon активно использует JavaScript для подгрузки контента, поэтому для динамических элементов (например, бесконечной ленты товаров или отзывов) потребуется Selenium или Playwright.

Если вам нужны данные в промышленных масштабах (например, ежедневный мониторинг цен на 10 000 товаров), стоит рассмотреть официальное API. Оно платное, но предоставляет структурированные данные без риска блокировок. Подробнее о нём мы расскажем в одном из следующих разделов.

Подготовка к парсингу: инструменты и настройки

Прежде чем приступить к написанию кода, необходимо подготовить рабочую среду. Вот что вам понадобится:

  • 🐍 Python 3.8+ (рекомендуется последняя версия). Установите его с официального сайта или через pyenv.
  • 📦 Библиотеки: requests, BeautifulSoup4, selenium, pandas (для обработки данных). Установите их через pip install requests beautifulsoup4 selenium pandas.
  • 🌐 Браузер и WebDriver: для Selenium нужен chromedriver (если используете Chrome) или geckodriver (для Firefox). Скачайте соответствующую версию для вашей ОС.
  • 🔒 Прокси (опционально): если планируете парсить в больших объёмах, подготовьте список прокси-серверов для ротации IP. Бесплатные прокси часто блокируются, поэтому лучше использовать платные (например, Luminati или Smartproxy).
  • 📂 Файл для сохранения данных: решите, в каком формате будете хранить результаты — CSV, JSON или Excel.

Также рекомендуем создать виртуальное окружение для проекта, чтобы избежать конфликтов библиотек:

python -m venv ozon_parser

source ozon_parser/bin/activate # Для Linux/Mac

ozon_parser\Scripts\activate # Для Windows

Если вы планируете парсить данные с авторизацией (например, личный кабинет продавца), потребуется работать с куками или токенами доступа. Это усложняет задачу, так как Ozon может запрашивать двухфакторную аутентификацию или капчу. В таких случаях лучше использовать Selenium с эмуляцией человеческого поведения (задержки между кликами, случайные движения мыши).

Парсинг каталога товаров: пошаговая инструкция

Начнём с самого распространённого сценария — сбора данных о товарах из каталога. Например, нам нужно спарсить все беспроводные наушники в категории Электроника с ценой до 5000 рублей.

Алгоритм действий:

  1. Сформировать URL с фильтрами (категория, цена, бренд и т.д.).
  2. Отправить HTTP-запрос и получить HTML-код страницы.
  3. Спарсить нужные данные (название, цена, рейтинг, ссылка на товар).
  4. Сохранить результаты в файл.
  5. Обработать пагинацию (переход на следующие страницы).

Вот пример кода на Python с использованием requests и BeautifulSoup:

import requests

from bs4 import BeautifulSoup

import pandas as pd

Настройки запроса

url = "https://www.ozon.ru/category/elektronika-15501/?from_global=true&text=беспроводные%20наушники"

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",

"Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"

}

Отправляем запрос

response = requests.get(url, headers=headers)

soup = BeautifulSoup(response.text, 'lxml')

Ищем блоки с товарами

products = soup.find_all('div', {'class': 'widget-search-result-container'})

data = []

for product in products:

title = product.find('span', {'class': 'tsBody500medium'}).text.strip()

price = product.find('span', {'class': 'tsBody500'}).text.strip()

rating = product.find('span', {'class': 'rating'}).text.strip() if product.find('span', {'class': 'rating'}) else "Нет оценок"

link = "https://www.ozon.ru" + product.find('a')['href']

data.append({

"Название": title,

"Цена": price,

"Рейтинг": rating,

"Ссылка": link

})

Сохраняем в CSV

df = pd.DataFrame(data)

df.to_csv('ozon_headphones.csv', index=False, encoding='utf-8-sig')

Этот код собирает базовую информацию, но у него есть несколько проблем:

  • 🔄 Пагинация: Ozon подгружает товары динамически при скролле, поэтому простой переход по страницам (?page=2) не сработает. Нужно либо парсить JSON-ответы (если они есть), либо использовать Selenium.
  • 🛡️ Блокировка: при многократных запросах Ozon может заблокировать IP. Решение — ротация прокси и User-Agent.
  • 📉 Изменение структуры HTML: классы элементов (widget-search-result-container) могут поменяться, и парсер перестанет работать. Нужно регулярно обновлять селекторы.

Проверьте актуальность URL и фильтров|Обновите User-Agent в заголовках|Настройте задержки между запросами (2-5 секунд)|Проверьте наличие прокси (если парсите в больших объёмах)|Сохраните резервную копию кода-->

Для обхода динамической подгрузки можно использовать Selenium. Вот упрощённый пример:

from selenium import webdriver

from selenium.webdriver.common.by import By

import time

driver = webdriver.Chrome()

driver.get("https://www.ozon.ru/category/elektronika-15501/?from_global=true&text=беспроводные%20наушники")

Скроллим страницу, чтобы подгрузились все товары

for _ in range(3):

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

time.sleep(2) # Ждём подгрузки

Парсим данные

products = driver.find_elements(By.CLASS_NAME, 'widget-search-result-container')

for product in products:

title = product.find_element(By.CSS_SELECTOR, 'span.tsBody500medium').text

print(title)

driver.quit()

Обход блокировок: прокси, User-Agent и имитация поведения

Ozon, как и любой крупный маркетплейс, активно борется с ботами. Если вы отправляете слишком много запросов с одного IP или используете стандартный User-Agent, ваш парсер быстро будет заблокирован. Вот основные методы, чтобы этого избежать:

  • 🔄 Ротация User-Agent: используйте разные заголовки для каждого запроса. Можно взять список актуальных User-Agent из этого источника.
  • 🌍 Прокси-серверы: ротируйте IP-адреса. Бесплатные прокси (например, из списков в интернете) часто уже заблокированы. Лучше использовать платные сервисы с пулом IP.
  • ⏱️ Задержки между запросами: имитируйте человеческое поведение. Например, случайная задержка от 1 до 5 секунд между запросами.
  • 🤖 Эмуляция браузера: если используете Selenium, настройте профиль браузера (разрешение экрана, языковые настройки, отключите WebRTC).
  • 🍪 Работа с куками: сохраняйте и повторно используйте куки сессии, чтобы избежать повторной авторизации.

Пример кода с ротацией прокси и User-Agent:

import random

import time

from fake_useragent import UserAgent

Список прокси (пример)

proxies_list = [

"http://user:pass@123.45.67.89:8080",

"http://user:pass@123.45.67.90:8080"

]

Список User-Agent

ua = UserAgent()

for i in range(5): # 5 запросов

proxy = random.choice(proxies_list)

headers = {"User-Agent": ua.random}

try:

response = requests.get(

"https://www.ozon.ru/category/elektronika-15501/",

headers=headers,

proxies={"http": proxy, "https": proxy},

timeout=10

)

print(f"Запрос {i+1}: Успех, статус {response.status_code}")

except Exception as e:

print(f"Запрос {i+1}: Ошибка - {e}")

time.sleep(random.uniform(1, 3)) # Случайная задержка

Для более сложных случаев (например, обход Cloudflare) может потребоваться использование Playwright или Puppeteer, которые лучше имитируют реальный браузер. Также существуют специализированные сервисы для обхода антибот-систем, такие как Anti-Captcha или 2Captcha, но они платные.

Как Ozon detect ботов?

Ozon использует несколько механизмов для обнаружения ботов:

1. Анализ поведения: слишком быстрые клики, отсутствие движений мыши, одинаковые интервалы между запросами.

2. Проверка заголовков: отсутствие или нетипичные значения в User-Agent, Accept-Language.

3. JavaScript-фингерпринтинг: сбор данных о браузере (разрешение экрана, установленные шрифты, плагины).

4. IP-репутация: если IP ранее использовался для парсинга, он может быть заблокирован.

5. Капчи и чекбоксы "Я не робот": могут появляться при подозрительной активности.

Парсинг отзывов и рейтингов: особенности и сложности

Отзывы — один из самых ценных источников данных для анализа удовлетворённости клиентов. Однако спарсить их сложнее, чем каталог товаров, по нескольким причинам:

  • 🔄 Динамическая подгрузка: отзывы подгружаются при скролле или клике на "Показать ещё".
  • 🔒 Авторизация: некоторые отзывы могут быть доступны только авторизованным пользователям.
  • 📜 Структура данных: отзывы могут содержать текст, оценку, дату, ответ продавца, фотографии.
  • 🚫 Ограничения API: если отзывы подгружаются через внутренний API, его структура может меняться.

Пример парсинга отзывов с помощью Selenium:

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get("https://www.ozon.ru/product/naushniki-besprovodnye-xiaomi-123456/reviews")

Ждём подгрузки отзывов

WebDriverWait(driver, 10).until(

EC.presence_of_element_located((By.CLASS_NAME, "review-item"))

)

Скроллим, чтобы подгрузить все отзывы

for _ in range(3):

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

time.sleep(2)

Парсим отзывы

reviews = driver.find_elements(By.CLASS_NAME, "review-item")

for review in reviews:

author = review.find_element(By.CLASS_NAME, "review-author").text

rating = len(review.find_elements(By.CLASS_NAME, "star_filled"))

text = review.find_element(By.CLASS_NAME, "review-text").text

date = review.find_element(By.CLASS_NAME, "review-date").text

print(f"Автор: {author}, Оценка: {rating}, Дата: {date}")

print(f"Текст: {text}\n")

driver.quit()

Для анализа отзывов полезно использовать NLP (обработка естественного языка). Например, с помощью библиотеки natasha или pymorphy2 можно выделять ключевые слова, определять тональность (позитивный/негативный отзыв) или группировать жалобы по тематикам. Пример:

from natasha import (

Segmenter,

MorphVocab,

NewsEmbedding,

NewsMorphTagger,

Doc

)

text = "Наушники быстро разряжаются, звук тихий, зато удобно сидят в ушах."

segmenter = Segmenter()

morph_vocab = MorphVocab()

emb = NewsEmbedding()

morph_tagger = NewsMorphTagger(emb)

doc = Doc(text)

doc.segment(segmenter)

doc.tag_morph(morph_tagger)

for token in doc.tokens:

token.lemmatize(morph_vocab)

print(f"{token.text} -> {token.lemma}")

Это поможет автоматически выявлять частые проблемы в товарах (например, "быстро разряжаются" или "плохое качество звука") и оперативно реагировать на них.

Легальные альтернативы парсингу: официальное API Ozon

Если вы не хотите рисковать блокировками или нуждаетесь в надёжном источнике данных, рассмотрите официальное API Ozon. Оно предоставляет структурированный доступ к многим типам данных, включая:

  • 📦 Информацию о товарах (названия, цены, остатки).
  • 📊 Статистику продаж (для продавцов).
  • 📦 Данные о заказах и возвратах.
  • 📈 Аналитику по категориям.

Однако у API есть ограничения:

Параметр Описание
Доступ Только для зарегистрированных продавцов или партнёров. Нужно подать заявку и получить API-ключ.
Ограничения по запросам Лимиты на количество запросов в минуту/день (зависят от тарифа).
Стоимость Платное использование (цена зависит от объёма данных).
Документация Официальная документация не всегда полная, могут потребоваться доработки.

Пример запроса к API для получения информации о товаре:

import requests

api_key = "ВАШ_API_КЛЮЧ"

product_id = "12345678" # ID товара на Ozon

url = f"https://api-seller.ozon.ru/v1/product/info/{product_id}"

headers = {

"Client-Id": "Ваш_Client_ID",

"Api-Key": api_key,

"Content-Type": "application/json"

}

response = requests.get(url, headers=headers)

data = response.json()

print(data)

Если вы не продавец на Ozon, но вам нужны данные, можно рассмотреть альтернативные источники:

  • 📊 Сервисы аналитики: DataLens, Retail Rocket, eLama предоставляют агрегированные данные по маркетплейсам (включая Ozon).
  • 📦 Партнёрские программы: некоторые сервисы (например, Pricer24) предлагают легальный сбор данных за абонентскую плату.
  • 📈 Публичные отчёты: Ozon иногда публикует тренды и статистику в открытом доступе (например, в блоге или пресс-релизах).

FAQ: ответы на частые вопросы о парсинге Ozon

❓ Можно ли парсить Ozon без риска блокировки?

Технически да, но для этого нужно соблюдать несколько правил:

  • Использовать ротацию прокси и User-Agent.
  • Делать задержки между запросами (не менее 2-3 секунд).
  • Не парсить авторизованные разделы (личный кабинет, корзина).
  • Ограничивать количество запросов (не более 100-200 в час с одного IP).

Однако даже при этом Ozon может заблокировать IP, если заподозрит бот-активность. Легальная альтернатива — официальное API.

❓ Как спарсить исторические данные о ценах?

Ozon не предоставляет историю цен в открытом доступе. Варианты решения:

  • Использовать сервисы мониторинга цен (например, PriceTrack или Keepa для аналогичных площадок).
  • Настроить ежедневный парсинг текущих цен и сохранять их в базу данных для последующего анализа.
  • Обратиться к продавцам за архивными данными (если вы партнёр).
❓ Как обойти капчу при парсинге?

Капча на Ozon может появляться при:

  • Слишком частых запросах с одного IP.
  • Использовании стандартного User-Agent.
  • Отсутствии кук или заголовков браузера.

Способы обхода:

  • Использовать сервисы распознавания капчи (2Captcha, Anti-Captcha).
  • Настроить Selenium с эмуляцией человеческого поведения (случайные паузы, движения мыши).
  • Ротировать прокси и User-Agent.

⚠️ Внимание: обход капчи может нарушать пользовательское соглашение Ozon. Используйте этот метод на свой страх и риск.

❓ Можно ли парсить Ozon для арбитража товаров?

Арбитраж (покупка товара на одной площадке и перепродажа на другой) не запрещён, но:

  • ✅ Разрешено, если вы покупаете товар как физическое лицо и перепродаёте его легально.
  • ❌ Запрещено, если вы используете ботов для массовых заказов или манипулируете ценами.
  • ⚠️ Ozon может заблокировать аккаунт, если заподозрит нетипичную активность (например, много заказов с одного IP).

Для арбитража лучше использовать официальные инструменты (например, Ozon Seller) или согласовывать действия с поддержкой.

❓ Как автоматизировать загрузку данных в Excel?

После парсинга данные можно сохранять в CSV или Excel с помощью библиотеки pandas:

import pandas as pd

data = [

{"Название": "Наушники Xiaomi", "Цена": 2990, "Рейтинг": 4.5},

{"Название": "Наушники Samsung", "Цена": 3490, "Рейтинг": 4.7}

]

df = pd.DataFrame(data)

df.to_excel("товары.xlsx", index=False, engine='openpyxl')

Для автоматического обновления данных можно написать скрипт с планировщиком задач (cron на Linux или Task Scheduler на Windows).