ozon-parser-1.md 12.09.2026

Парсер цены товара Ozon по ID

Скрипт по ID товара Ozon читает цену покупателя из зелёной плашки, отдаёт её в JSON и сам переживает антибот-проверку Ozon.

Задача

Нужна цена по конкретному ID товара на Ozon для выгрузки в 1С — не для разового просмотра, а для регулярного обновления. Ozon держит цену в живом DOM приложения и не отдаёт её в исходном HTML, поэтому BeautifulSoup здесь бесполезен.

Вторая сложность — антибот. Площадка проверяет не только разметку, но и поведение: холодный браузер на карточку товара получает abt-challenge вместо товара. Значит скрипт должен уметь сам выйти из этого состояния и продолжить работу, а не просто упасть.

Как делал

Playwright поднимает установленный Chrome вместо своего Chromium: лишние 150 МБ не нужны, а для обхода проверки важно, чтобы это был реальный браузер пользователя. Список путей широкий — Windows, Linux, Edge, Brave, — и только если ничего не нашлось, скрипт пробует каналы chrome и msedge.

На --no-sandbox добавлен только для Linux: в контейнерах и под root Chrome без него не стартует, а на Windows флаг вызывает лишнее предупреждение. Дальше --disable-blink-features=AutomationControlled и init-скрипт убирают navigator.webdriver, который Playwright выставляет честно и всегда.

Отдельная тонкость — User-Agent. В headless Chrome подставляет HeadlessChrome, и Ozon реагирует на это слово мгновенно. Скрипт открывает служебную страницу, читает настоящий UA движка и меняет в нём HeadlessChrome на Chrome. Так подмена точно совпадает с версией браузера, а не собирается вручную.

Цена читается в два захода, и порядок важен: сначала зелёная плашка span.tsHeadline600Large — это цена с Ozon Card, которую видит покупатель, и только потом обычная span.pdp_ib0. Источник пишется в лог, чтобы было видно, что именно вернулось.

Антибот у Ozon приходит двумя разными лицами. Первый — обычная страница-заглушка с пазлом, она ловится по URL и по слову «пазл» в тексте. Второй интереснее: вместо капчи отдаётся белая страница «Похоже, нет соединения» с меткой инцидента fab_chlg. Формально это не капча, но товара там тоже нет, поэтому оба случая свожу к одному статусу.

На капчу заложено до 180 секунд, и только что решённая проверка даёт свежий полный таймаут на данные — иначе после неё вылетал бы лимит, выбранный до капчи. В headless ждать бессмысленно, там пазл некому решать, поэтому вместо ожидания скрипт сразу перезапускается в видимом окне.

Ложное срабатывание на «товар не найден» приходится гасить отдельно: селектор цены одинаково совпадает в блоке рекомендаций внизу страницы. Поэтому наличие селектора само по себе ничего не значит — скрипт дожидается, пока цена реально распарсится в число, и только потом признаёт страницу удачной.

Ошибки в JSON отдаются словами, а не кодами, иначе вызывающий не поймёт, что произошло:

errorЧто случилось
not_foundТовар удалён или ID неверный
blockedOzon не пропустил после капчи
network_errorДанные не появились за отведённое время
exceptionВнутренний сбой при работе с браузером

Итог

Результат — price.json, при ошибке он всё равно пишется, чтобы 1С всегда читала актуальное состояние, а не старые данные. Запись атомарная: сначала временный файл, потом os.replace, поэтому 1С не прочитает наполовину записанный JSON.

Вход принимает и просто nmId, и полную ссылку, и параметр nm= в URL — регулярки покрывают все три формата, которые приходят из учётной системы. Файлы сессии, логов и результата лежат рядом со скриптом по абсолютным путям, потому что 1С вызывает его с произвольным рабочим каталогом.

Работает на Windows и Linux одинаково, есть setup.bat и текстовая инструкция для клиента. Селекторы Ozon меняет вместе с вёрсткой — как и у любого такого скрипта, это слабое место, чинить придётся по логу.

// похожие проекты

Ещё работы

// проект 2026
Скриншот главной страницы лединга AROMA

Aroma. Лендинг кофейни

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

// проект 2026
Скриншот страницы сайта chetaika с попапом

Chetaika. Книжный поисковик

Книжный поисковик поверх Google Books API: один HTML-файл, два serverless-прокси и чистый vanilla JS без зависимостей.

// проект 2026
Нет изображения

Telegram парсер участников каналов

Консольный инструмент на Telethon: инвентаризация участников Telegram-групп с чекпоинтами и обходом FloodWait.

// проект 2026
Скриншот главной страницы сайта ayupov

Ayupov. Сайт-портфолио

Сайт-портфолио на своей теме WordPress с нуля: живой терминал, скрамбл-заголовок, CSS одним ответом.

// проект 2026
Скриншот главной страницы лендинга ИГРАЙ-КА

«Играй-ка». Лендинг магазина игрушек

Одностраничный лендинг магазина детских игрушек: витрина, категории, отзывы и форма заявки.

// проект 2026
Нет изображения

Бот для сбора лидов из Telegram-каналов и RSS

Бот для Telegram: читает каналы и RSS-ленты, фильтрует заказы по ключевым словам с весами и присылает подходящие в личку.

> все проекты

// contact.php

Ну что, работаем?

Опишите задачу — разберусь и предложу решение.