Реалізація автоматичного заповнення сайту з парсера
Автоматичне заповнення — це місток між парсером і CMS: дані, зібрані з зовнішніх джерел, автоматично з'являються на сайті як товари, статті, оголошення або профілі. Завдання включає не тільки імпорт, а й нормалізацію, обробку конфліктів і управління вмістом.
Архітектура системи
Парсер → Сирі дані → Процесор → Нормалізовані дані → Черга імпорту
↓
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 і потребують ручної перевірки.
Стратегії публікації
- Автоматична публікація — вміст з надійних джерел публікується відразу
- Чернетка — вміст створюється, редактор публікує
- Diff-оновлення — коли дані джерела змінюються, оновлюються лише змінені поля, не весь матеріал
Часовий графік
Система автоматичного заповнення для CMS з одним джерелом і базовою валідацією: 5–8 днів. З кількома джерелами, UI для управління маппінгами та системою модерації: 15–20 днів.







