AI-контур каталога: ingest, обработка и выгрузка на Avito

Система автоматической синхронизации 50 000+ товаров для Avito

Заказчик продавал датчики, сенсоры, компоненты Siemens и прочую B2B-номенклатуру. Бутылочное горлышко — не создание объявлений, а ежедневная актуализация цен и остатков с десятков сайтов поставщиков без единого API.

Automation • Avito • B2B • AI

Data-flow · production

sync
Поставщики
Парсеры
Нормализация
AI
Выгрузка
Avito

01 · Бизнес-проблема

Каталог живёт своей жизнью — объявления не успевают за ним

Проблема была не в том, чтобы «создать объявление один раз», а в том, что цены и остатки менялись ежедневно, а источники были разрознены. Ручной контур перестал быть физически воспроизводимым на масштабе.

Цены и остатки менялись ежедневно — ручное обновление десятков тысяч карточек перестало масштабироваться

Товары размазаны по десяткам источников с разной вёрсткой, категориями и логикой наличия

Сухие технические спецификации плохо конкурировали в выдаче Avito без коммерческого текста

Ошибка в одном шаге пайплайна могла массово перезаписать объявления некорректными данными

02 · Почему «просто парсер» не работает

Разные сайты — разные контракты данных, даже для одной номенклатуры

На старте задача выглядела как сбор товаров. В production оказалось, что главный риск — нестабильные источники: вёрстка, форматы цен, логика наличия и скрытые дубли.

  • У каждого поставщика своя структура карточки, форматы цен и вложенность категорий
  • HTML нестабилен: правки вёрстки ломают «универсальный» селекторный подход
  • Единого API не существовало — под каждый источник нужен был отдельный слой парсинга и нормализации
  • Наличие и цены часто живут в разных DOM-ветках и требуют отдельной валидации

03 · Архитектура

Автономный pipeline: сбор → нормализация → enrichment → выгрузка

Система проектировалась как постоянный синхронизатор, а не разовая выгрузка CSV. Модульность по поставщику позволяла чинить один источник, не останавливая весь контур.

Сбор данных

Ежедневный обход десятков сайтов: цена, остаток, характеристики, артикул, категория. Модуль на поставщика — поломка одного не стопорит остальной контур.

Нормализация

Единый внутренний каталог: дедупликация, стандарт полей, согласование категорий и конфликтов цен до выгрузки.

AI-enrichment

Из сухих спецификаций — коммерческие описания под формат площадки. Результат кэшируется: без кэша daily-прогон по 50k SKU был бы и дорогим, и медленным.

Выгрузка

Единый файл/поток для Avito: создание, обновление цен, скрытие отсутствующих SKU, синхронизация наличия — без ручного участия менеджеров.

04 · AI-генерация описаний

Enrichment поверх сухого каталога, а не «GPT ради красоты»

Модель получала структурированные поля после нормализации. Без кэша по версии атрибутов ежедневный прогон по десяткам тысяч SKU съел бы бюджет и время.

  • Вход: структурированные поля из нормализованного SKU — не «голый HTML страницы»
  • Выход: короткое коммерческое описание + сохранение в кэш с ключом по версии атрибутов
  • Политика: без медицинских и юридических заявлений — только продуктовый текст под маркетплейс

Вход · specs

3RG4014-3AA01 · Ue 24V DC · IP67 · -25…60°C
Фотодатчик · дальность 0…6m · PNP

Выход · listing

Промышленный фотодатчик для автоматизации линий: питание 24V DC, защита IP67, стабильная дальность до 6 м. Подходит для монтажа в жёстких условиях — уточняйте совместимость с вашим контроллером.

Черновик стилизован; в проде был кэш по хэшу атрибутов.

05 · Highload pipeline

Очереди, лимиты и идемпотентность — иначе площадка и поставщики взаимно DDoS-ят друг друга

На пике — десятки тысяч SKU и сотни тысяч операций в сутки. Здесь важнее дисциплина исполнения, чем «красивый дашборд».

Очередь воркеров

backpressure on
  • parse:supplier_ff01run120ms p95
  • normalize:batch_418queued
  • ai:enrich_hash_missrun840ms p95
  • emit:avito_chunk_09done2.1s

Плотность апдейтов

Условный профиль суток: реальные графики строились по метрикам воркеров и лагу выгрузки.

tail · orchestrator

[06:00:01] snapshot_start id=snap_2025_05_18T06:00:00Z
[06:00:04] supplier_d46e ok rows=8421 err=0
[06:02:18] normalize merged sku=42811 dup_drop=3
[06:04:02] ai_cache hit=91% miss=9% batch=1200
[06:07:44] avito_emit chunk=09 status=accepted
  • Пик: порядка 50 000 SKU в контуре, десятки источников, 100–110k автоматических действий в сутки
  • Очереди с rate-limit и backoff — иначе парсеры и площадка начинают «стрелять» друг в друга
  • Идемпотентные джобы и версионирование снапшотов — откат битой выгрузки без паники
  • Строгие проверки перед массовым apply: одна ошибка не должна затирать тысячи карточек

Контракт джобы

Упрощённый пример: батч merge+emit с флагами безопасности и идемпотентности — чтобы повторный запуск не удваивал побочные эффекты.

jobs/catalog.merge_and_emit.json
1{
2  "job": "catalog.merge_and_emit",
3  "idempotency_key": "snap_2025_05_18T06:00:00Z",
4  "sources": ["d46e", "a912", "ff01", "c220"],
5  "skuBatch": { "from": 42800, "to": 43200 },
6  "flags": ["skip_ai_if_hash_match", "require_price_sanity", "dry_run_if_anomaly"]
7}

06 · Сложности парсинга

Самая дорогая часть — не Avito, а живые сайты поставщиков

Поломка одного модуля не должна валить весь прогон. Параллельно нужны guardrails: одна ошибка нормализации не должна уезжать в массовую публикацию.

Источники постоянно «едут»: микроразметка, lazy-load, A/B вёрстки

Разные представления «в наличии»: текст, бейдж, отсутствие строки на складе

Дубли и альтернативные артикулы между поставщиками для одной и той же позиции

Защита от «тихих» нулей в цене и от скачков на порядок — guardrails перед merge в каталог

Case DNA · визуалы

Операционный контур и масштаб данных

Визуалы поддерживают нарратив: это production-система с графиками и складской реальностью, а не иллюстрация из стока «для красоты».

Панель аналитики и метрики
Дашборд синхронизации: лаг воркеров, ошибки парсеров, доля AI cache hit.
Склад и промышленная логистика
Физический слой каталога: B2B-номенклатура и оборот, который должен отражаться в карточке честно по остаткам.

07 · Результаты

Каталог стал сопровождать бизнес, а не наоборот

После запуска исчезла ручная «гонка» за ценами. Объявления выглядели как коммерческие карточки, а не как сухой дамп характеристик.

50 000+ товаров в системе

100 000+ автоматических действий в сутки

Полная автоматизация обновления каталога и объявлений

300+ продаж в первый месяц после запуска контура синхронизации

Ручная синхронизация сведена к разовым исключениям, не к операционной норме

08 · Стек и интеграции

Прагматичный контур исполнения

Node.jsCustom parsersQueue workersCaching layerCloud infrastructure
Интеграции: Avito feed export · AI text generation · Cloud storage

Функциональные блоки

Парсинг десятков сайтов поставщиковАвтоматическая синхронизация цен и наличияAI-генерация коммерческих описанийКэширование AI-контентаНормализация каталогаОчереди обновленийМассовое обновление объявленийАвтоматическая выгрузка для AvitoОбработка дублейМодульная архитектура парсеров

09 · CTA

Разрабатываю системы автоматизации для каталогов, маркетплейсов и highload-публикаций.

Если у вас десятки источников, суточные дельты цен и жёсткие лимиты площадки — это про операционную архитектуру, а не про «ещё один скрипт на краулинг».

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

Подборка из портфолио по пересечению стека, интеграций и контекста — без ручной вставки в контент кейса.