Реализация автонаполнения сайта данными из парсера
Автонаполнение — связующее звено между парсером и CMS: данные, собранные из внешних источников, автоматически попадают на сайт в виде товаров, статей, объявлений или профилей. Задача не только в импорте, но и в нормализации, обработке конфликтов и управлении контентом.
Архитектура системы
Парсер → Сырые данные → Processor → Нормализованные данные → Import Queue
↓
CMS / БД сайта
↓
Статус: черновик / опубликовано
Прямой импорт из парсера в БД сайта — плохая практика. Нужна промежуточная очередь с возможностью проверки данных до публикации.
Маппинг полей
Каждый источник имеет свою структуру. Конфигурация маппинга:
{
"source": "supplier_catalog",
"mappings": {
"title": "$.name",
"description": "$.full_description",
"price": "$.price_rub",
"category": { "field": "$.category_id", "transform": "category_map" },
"images": "$.photos[*].url",
"sku": "$.article"
},
"category_map": {
"1": "electronics",
"2": "clothing",
"15": "home-garden"
}
}
JSONPath-маппинг позволяет адаптировать новый источник без изменения кода — только конфигурация.
Обработка изображений
Картинки из источника скачиваются, оптимизируются и загружаются в собственное хранилище:
async def process_image(url: str, product_id: int) -> str:
async with httpx.AsyncClient() as client:
resp = await client.get(url, timeout=30)
img = Image.open(BytesIO(resp.content))
img = img.convert('RGB')
# ресайз с сохранением пропорций
img.thumbnail((1200, 1200), Image.LANCZOS)
# сохранение в WebP
output = BytesIO()
img.save(output, 'WEBP', quality=85)
# загрузка в S3/MinIO
s3_key = f'products/{product_id}/{uuid4()}.webp'
s3.put_object(Bucket=BUCKET, Key=s3_key, Body=output.getvalue())
return f'https://cdn.example.com/{s3_key}'
Контроль качества
Перед публикацией данные проходят валидацию:
- Обязательные поля заполнены (название, цена, хотя бы одна фотография)
- Цена в допустимом диапазоне (защита от ошибок источника: 0 руб. или 999 999 999 руб.)
- Описание не короче N символов
- Изображения доступны и имеют адекватный размер
Записи, не прошедшие валидацию, попадают в статус review_required и требуют ручной проверки.
Стратегии публикации
- Авто-публикация — контент от доверенных источников публикуется сразу
- Черновик — контент создаётся, публикует редактор
- Дифф-обновление — при изменении данных в источнике обновляется только изменившееся поле, не весь материал
Сроки
Система автонаполнения для CMS с одним источником и базовой валидацией: 5–8 дней. С несколькими источниками, UI для управления маппингами и системой модерации: 15–20 дней.







