Дашборд
Управление парсером
🧪 Тест парсинга поколений
| Фото | Название (в БД) | Годы | Исходный текст |
|---|---|---|---|
|
—
|
🧪 Тест парсинга комплектаций
| Название | Кузов | Двигатель | Мощность | КПП | Привод | Д×Ш×В |
|---|---|---|---|---|---|---|
📦 Откуда взялись данные? ▼
Данные получены путём парсинга каталога drom.ru — крупнейшего российского автомобильного портала.
Парсинг проходил поэтапно через Puppeteer (управляемый браузер Chrome):
- Собирались все Марки из каталога
- Для каждой марки — все Модели
- Для каждой модели — все Поколения (с годами выпуска)
- Для каждого поколения — все Комплектации с габаритами кузова
Итого: марки → модели → поколения → комплектации. Иерархия сохранена полностью.
🚗 Только легковые автомобили — грузовые автомобили, мотоциклы и спецтехника в базу не включались.
🗂 Что такое «сырые данные» и почему их изменяли? ▼
Сырые данные — это то, что пришло напрямую с drom.ru без каких-либо правок.
Недостатки сырых данных:
- Дубли поколений. Drom хранит одно поколение отдельно для каждого типа кузова. Например, BMW G20 (7-е поколение) — это 5 разных страниц: Седан, Универсал, Лифтбек и т.д. Парсер создаёт 5 одинаково выглядящих строк.
- Технические названия. Названия поколений с drom.ru содержат служебные суффиксы и не подходят для показа клиенту.
- Нет агрегации кузовов. Нельзя показать клиенту «G20 · Седан, Универсал» — типы кузовов разбросаны по отдельным строкам.
Для решения этих проблем были созданы этапы нормализации, переименования и дедупликации поколений.
🏗 Данные для ERP ClientBase ▼
ERP-система ClientBase использует фиксированную структуру таблиц для автомобильного каталога. Данные подготовлены под эту структуру:
| Таблица | Название | Источник | Ссылка на поля |
|---|---|---|---|
| 1200 | Марки | Марки (сырые данные) | fields.php?table=1200 |
| 1210 | Модели | Модели (сырые данные) | fields.php?table=1210 |
| 1220 | Поколения | Уникальные поколения (ERP) | fields.php?table=1220 |
| 1230 | Серии | Кузова / комплектации (ERP) | fields.php?table=1230 |
⚠️ Эти данные пока не импортированы в ClientBase
✅ Качество данных значительно выше: новая база содержит на +4 705 поколений больше (+50%). Все поколения дедуплицированы, названия нормализованы, для каждого поколения агрегированы типы кузовов. Данные актуальны на момент парсинга.
Планируемая схема интеграции:
-
Текущие записи в ClientBase получат
status = 1(архив) — данные сохранятся, но станут неактивными -
Новые данные из этого парсера будут импортированы со
status = 0(активные)
🔍 Вкладки «Пример формы» и «Форма v2» ▼
🔍 Пример формы
Форма на сырых данных —
поколения берутся напрямую из таблицы
generations. Видна
проблема: одно поколение дублируется несколько раз (по числу типов
кузовов). Клиент видит, например, 5 одинаковых «G20 7 поколение,
рестайлинг» — неудобно.
🔎 Форма v2
Форма на
дедуплицированных данных —
итоговый вид, который будет на сайте перевозки автовозами. Поколения
берутся из таблицы
unique_generations —
без дублей. Обратите внимание на
селект кузовов: он
подтягивает агрегированные типы кузовов для выбранного поколения.
Лог
Экспорт / Импорт
💾 Полный дамп базы данных
Экспорт / импорт всех таблиц одним JSON-файлом
Скачать дамп всех таблиц в JSON
Восстановить БД из JSON-файла (все данные будут заменены)
📦 Экспорт / Импорт для ERP
Включает: Марки → Модели → Уникальные поколения → Кузова (только серии, привязанные к уникальным поколениям)
Скачать весь ERP-пакет одним файлом
Импорт таблиц по отдельности
📋 Экспорт / Импорт таблиц
Выберите таблицу — экспорт скачает JSON, импорт обновит данные (upsert по ID, без каскадного удаления)
✨ Нормализация поколений
Поиск и исправление «мусорных» названий в базе данных (рекламные бейджи, даты, коды кузова и т.д.)
| ID | Марка / Модель | Текущее название | → | Нормализованное | ||
|---|---|---|---|---|---|---|
| / | → |
| { if(!normIsSelected(c.id)) normToggle(c.id) }) : norm.results?.changes?.forEach(c => { if(normIsSelected(c.id)) normToggle(c.id) })" /> | ID | Марка / Модель (до нормализации) | Было | → | Стало | |
|---|---|---|---|---|---|---|
| → |
🏷️ Переименование поколений
Получает H1 страницы поколения на drom.ru и извлекает из него код/название поколения + рестайлинг
🔬 Тест — проверить один URL
🚀 Полный прогон
Обходит каждую строку в таблице поколений, загружает страницу и обновляет название
| ID | Было | → | Стало | ||
|---|---|---|---|---|---|
| → |
Поколения
| ID | Фото | Марка | Модель | Поколение | Годы | URL |
|---|---|---|---|---|---|---|
|
—
|
Открыть ↗ | |||||
| Нет данных | ||||||
Комплектации
| ID | Марка | Модель | Поколение | Комплектация | Кузов | Объём | Мощность | КПП | Привод | Д×Ш×В |
|---|---|---|---|---|---|---|---|---|---|---|
| Нет данных | ||||||||||
Пример формы
Выберите марку, модель, поколение и комплектацию
Выбрано
/ / / /
Фото поколения
Пример формы v2
Поколения без дублей — одно поколение объединяет все типы кузовов
Выбрано
/ / /
📐 Кузова поколений
| Марка | Модель | Поколение | Годы | Тип кузова | Д × Ш × В, мм | Источн. | Обновлено |
|---|---|---|---|---|---|---|---|
|
Загрузка…
|
|||||||
| Нет данных. Нажмите «Вычислить всё» для заполнения таблицы. | |||||||
Лейблы кузовов
Таблица
generation_body_summary
хранит предвычисленную строку кузовов для каждого поколения (например:
«Седан, Туринг»).
Эти данные используются в дропдаунах поколений, чтобы различать записи с одинаковым названием (например несколько кузовов BMW G20).
Источник: таблица
generation_bodies
(должна быть предварительно вычислена на странице «Кузова»).
Вычислить лейблы
Группирует все записи из
generation_bodies
по поколению и сохраняет строку кузовов («Седан, Туринг, Лифтбек» и
т.д.) в таблицу-кэш.
Уникальные поколения
Дедуплицированный список поколений для формы сайта и ERP. Одна строка = одно поколение, без разбивки по кузовам.
Кузова сгруппированы из таблицы «Лейблы кузовов». Поколения без комплектаций переносятся как есть. Исходные данные в таблице «Поколения» не изменяются.
| ID | Марка | Модель | Поколение | Кузова | Годы | Источников |
|---|---|---|---|---|---|---|
| Загрузка… | ||||||
| Нет данных — нажмите «Пересчитать» | ||||||