Парсинг Ozon: карточки товаров, цены и остатки в реальном времени
Как собирать данные с карточек товаров Ozon — структура страницы, изменчивые селекторы и практичные способы обхода этих проблем.

Карточка товара на Ozon выглядит просто, но технически это динамически собираемый SPA-компонент — цена, остатки и рейтинг подгружаются через JavaScript, а конкретные CSS-классы регулярно меняются при обновлениях фронтенда.
Особенности парсинга Ozon
- SPA-рендеринг. Нужен headless-браузер (Playwright) — исходный HTML не содержит нужных данных до выполнения JS.
- Варианты товара. Один URL карточки может скрывать несколько вариантов (размер, цвет) с разными ценами и остатками — простое извлечение "цены со страницы" без учёта выбранного варианта даёт неточные данные.
- Нестабильные селекторы. Автогенерируемые классы вида
tsHeadline500Mediumменяются между деплоями фронтенда чаще, чем хотелось бы.
Базовый пример через headless-браузер
import { chromium } from "playwright";
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto("https://www.ozon.ru/product/example-123456", {
waitUntil: "networkidle",
});
const data = await page.evaluate(() => {
const getText = (selector) => document.querySelector(selector)?.textContent?.trim();
return {
title: getText("h1"),
price: getText('[data-widget="webPrice"] span'),
};
});
console.log(data);
await browser.close();Важно
Селекторы вроде [data-widget="webPrice"] привязаны к текущей структуре виджетов Ozon и могут поменяться при следующем обновлении фронтенда. Закладывайте в процесс регулярную проверку, что парсер всё ещё возвращает корректные данные, а не тихо ломается.
Извлечение по смыслу вместо жёстких селекторов
Поскольку вёрстка Ozon меняется часто, подход "описать поле по смыслу" вместо привязки к конкретному классу снижает частоту поломок:
from parsera import Client
client = Client(api_key="pk_...")
result = client.scrape(
url="https://www.ozon.ru/product/example-123456",
fields=["название товара", "текущая цена", "цена без скидки", "остаток на складе", "рейтинг", "количество отзывов"],
)
print(result.rows[0])Модель находит нужные значения по смысловому описанию, независимо от того, как называется CSS-класс в текущей версии фронтенда.
Отслеживание изменений во времени
Для мониторинга цен важна не разовая выгрузка, а история изменений — только так можно увидеть тренд и вовремя среагировать:
def track_price_history(sku, current_data, db):
last = db.get_last_snapshot(sku)
db.save_snapshot(sku, current_data)
if last and current_data["price"] != last["price"]:
change_pct = (current_data["price"] - last["price"]) / last["price"] * 100
db.log_price_change(sku, last["price"], current_data["price"], change_pct)Сравнение: свой парсер vs управляемый сервис
| Критерий | Собственный Playwright-скрипт | Parsera |
|---|---|---|
| Первичная настройка | Часы на изучение вёрстки | Минуты (описать поля) |
| Поддержка при смене вёрстки | Ручное обновление селекторов | Не требуется — AI адаптируется |
| Обход блокировок | Нужно настраивать самостоятельно | Встроено |
| Расписание и уведомления | Нужно реализовать отдельно | Встроено |
Заключение
Парсинг Ozon технически несложен на старте, но дорог в поддержке из-за частоты изменений вёрстки и специфики вариантов товара. Для разовой выгрузки собственный Playwright-скрипт вполне подходит; для регулярного мониторинга десятков и сотен SKU стоимость поддержки селекторов быстро превышает стоимость управляемого решения.
Частые вопросы
Почему парсер Ozon, который работал вчера, сегодня возвращает пустые данные?+
Ozon — SPA-приложение с часто обновляемой вёрсткой и автогенерируемыми CSS-классами. Небольшое обновление фронтенда способно сломать селекторы без изменения видимого пользователю интерфейса. Это основная причина "внезапных" поломок парсеров маркетплейсов.
Нужен ли headless-браузер для Ozon?+
Да — карточки товаров и особенно результаты поиска рендерятся через JavaScript, простой HTTP-запрос вернёт по большей части пустой HTML-каркас.
Как отслеживать остатки по конкретным размерам/вариантам товара?+
Нужно явно указывать вариант (размер, цвет) как отдельное поле при извлечении — на карточке Ozon остатки и цена могут отличаться по вариантам одного товара, и агрегированное значение по карточке может ввести в заблуждение.
Похожие материалы

Мониторинг цен на Wildberries: как отслеживать конкурентов автоматически
Практическое руководство: как настроить регулярный сбор цен и остатков конкурентов на Wildberries без ручной проверки карточек товаров.

Как парсить цены конкурентов: схема мониторинга для e-commerce
Практическое руководство по парсингу цен конкурентов: источники, SKU-матчинг, частота проверок, контроль РРЦ, алерты и интеграции с таблицами, CRM и BI.

Как мониторить РРЦ: контроль цен дилеров, маркетплейсов и конкурентов
Практическая схема мониторинга РРЦ: источники, правила нарушений, продавцы, карточки, алерты, доказательная база и отчеты для бренда или дистрибьютора.