MuskatGroup / Продукты
FrutoScraper: отзывы за вложенными тегами
Лаборатория DOM-парсинга: Rust находит поля отзывов и показывает путь к каждому фрагменту.
Задача
Довести незавершённый парсер отзывов до показательной реализации. Исходник включал Python/Selenium и Rust-прототип, зависел от старых классов маркетплейса и количества дочерних узлов. При изменении вложенности часть комментария терялась или попадала в другое поле.
Обход дерева вместо подсчёта тегов
Новый Rust-парсер сначала определяет карточку и контейнер текста по профилю CSS-селекторов. Затем обходит DOM в порядке документа, отслеживает подписи «Комментарий», «Достоинства», «Недостатки» и «Вариант». Дополнительные обёртки не меняют смысл поля, inline-теги не разрывают слова, а блочные элементы разделяют абзацы.
Кнопки, скрытые узлы и размеченные ответы продавца исключаются. Вложенная карточка не становится частью родительского комментария. Отсутствующие значения остаются null; дата и оценка не угадываются. Повторы удаляются только по стабильному ID, а одинаковый текст разных отзывов сохраняется.
Лаборатория
Посетитель выбирает один из четырёх синтетических HTML-примеров, запускает настоящий Rust-парсер и сравнивает разметку с извлечёнными полями. Выбор поля показывает DOM-путь, глубину и правило получения каждого фрагмента. Результат можно выгрузить в JSON или CSV.
Есть русский и английский языки, светлая и тёмная темы, мобильная компоновка и клавиатурная навигация. Ошибка API сохраняет предыдущий результат. Все товары и отзывы в демонстрации вымышлены; публичный сервер не обращается к маркетплейсам.
Локальный инструмент
CLI обрабатывает один HTML-файл или загружает HTTPS-страницу товара. Профили позволяют адаптировать границы карточек при изменении разметки. Для страниц с JavaScript нужно сохранить отрисованный HTML; инструмент не обходит блокировки и не обещает поддержку текущей верстки Ozon. Автоматическая пагинация не входит в эту версию.
Архитектура
Rust, Axum и HTML5 DOM-парсер scraper разделяют HTTP, получение страниц и извлечение данных. OpenAPI генерирует TypeScript-типы React/Vite-интерфейса. Публичный API принимает только ID подготовленного примера. Приложению не нужны база, аккаунты и файловое хранилище.
Отдельный Compose-проект обновляется независимо от остальных демо; API закрыт в приватной сети. Кнопка публичного демо появится после размещения на своём поддомене.