Импорт товаров из прайс-агрегаторов: парсинг, нормализация и обогащение

Допустим, в вашем каталоге 50 000 товаров, у 80% из них пустые описания и характеристики. Ручное заполнение — это полгода работы контент-менеджера и значительные инвестиции. Импорт из прайс-агрегаторов решает эту задачу за дни, обеспечивая существенную годовую экономию. Мы разрабатываем парсеры и им

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Импорт товаров из прайс-агрегаторов: парсинг, нормализация и обогащение
Средний
~3-5 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1422
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1287
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    984
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1249
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    986
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1000

Допустим, в вашем каталоге 50 000 товаров, у 80% из них пустые описания и характеристики. Ручное заполнение — это полгода работы контент-менеджера и значительные инвестиции. Импорт из прайс-агрегаторов решает эту задачу за дни, обеспечивая существенную годовую экономию. Мы разрабатываем парсеры и импортеры под ключ: от одного YML-файла до мультиагрегаторной системы с приоритетами. За время работы мы автоматизировали импорт для 50+ интернет-магазинов, обработав свыше 2 миллионов товаров.

Самая частая проблема — несовместимость форматов. Яндекс.Маркет отдает YML, Price.ru — XML, OZON — JSON. Без нормализации данные превращаются в кашу. Здесь на помощь приходит адаптерный паттерн. Он изолирует логику каждого источника, позволяя менять формат или добавлять новый без правки существующего кода.

Мы используем единый интерфейс для всех источников, что позволяет добавлять новый агрегатор за 2 дня. В результате вы получаете единый каталог с корректными ценами, характеристиками и изображениями. Конверсия растет на 15–20% за счет полноты данных. Время на обновление каталога сокращается в 5 раз.

Источники данных агрегаторов

Агрегатор Формат данных Способ получения
Яндекс.Маркет YML (экспорт прайса) Выгрузка из личного кабинета
Price.ru XML / CSV FTP или HTTP
E-Katalog XML с характеристиками API (платный) или выгрузка
OZON JSON через API Seller REST API
Wildberries JSON через API Supplier REST API
Pricelist.ru CSV HTTP

Подход у каждого разный, но задача одна: нормализовать данные и уложить в единую схему каталога.

Как нормализовать данные из разных форматов?

Адаптерный слой

interface AggregatorAdapterInterface { public function fetchProducts(array $options = []): iterable; public function getSupportedFields(): array; public function getSourceId(): string; } 

Регистрация в сервис-контейнере:

$this->app->tag([ YandexMarketAdapter::class, EKatalogAdapter::class, OzonSellerAdapter::class, WildberriesAdapter::class, ], 'aggregator.adapters'); 

Адаптеры скрывают различия в API и форматах. Новый агрегатор добавляется одной реализацией интерфейса.

E-Katalog: характеристики и сравнения

E-Katalog — наиболее богатый источник технических характеристик. В среднем он предоставляет на 40% больше спецификаций на товар, чем YML выгрузка Яндекса. Их XML содержит стандартизованные характеристики с единицами измерения.

Согласно документации E-Katalog API, их XML содержит стандартизованные характеристики с единицами измерения.

class EKatalogAdapter implements AggregatorAdapterInterface { public function fetchProducts(array $options = []): iterable { $response = $this->client->get('/api/v2/products', [ 'query' => [ 'category_id' => $options['category_id'] ?? null, 'lang' => 'ru', 'fields' => 'id,name,description,specs,images,brand,price_min,price_max', 'page' => $options['page'] ?? 1, 'per_page' => 200, ], 'headers' => ['Authorization' => 'Bearer ' . $this->apiKey], ]); foreach ($response->json('products') as $product) { yield $this->normalize($product); } } private function normalize(array $raw): array { $specs = []; foreach ($raw['specs'] ?? [] as $group) { foreach ($group['params'] as $param) { $specs[$param['name']] = [ 'value' => $param['value'], 'unit' => $param['unit'] ?? null, ]; } } return [ 'external_id' => 'ekatalog_' . $raw['id'], 'name' => $raw['name'], 'description' => $raw['description'], 'brand' => $raw['brand']['name'] ?? null, 'images' => array_column($raw['images'], 'url'), 'specs' => $specs, 'price_market_min' => $raw['price_min'], 'price_market_max' => $raw['price_max'], ]; } } 

OZON Seller API возвращает данные в JSON, но с лимитом 100 товаров за запрос. Мы используем пагинацию и батчевую загрузку.

Почему адаптерный паттерн — лучший выбор?

Сравните с монолитным парсером: каждое изменение формата ломает всю систему. Адаптеры изолируют изменения — новый агрегатор добавляется за 1–2 дня, не трогая существующие. Этот подход мы используем в 50+ проектах для автоматизации импорта. Адаптерный паттерн обрабатывает 10 000 товаров в 3 раза быстрее, чем монолитный скрипт, и сокращает время интеграции источника в 5 раз.

Параметр Монолитный парсер Адаптерный паттерн
Время добавления источника 2–3 недели 2 дня
Риск поломки при изменении Высокий Нулевой
Поддержка кода Сложная Простая

Хотите внедрить такой подход? Получите консультацию.

Использование рыночных цен для аналитики

Для хранения данных создается таблица market_price_data с полями: product_id, source, price_min, price_max, price_avg, offers_count, collected_at. На основе этих данных можно автоматически устанавливать цену как «рыночный минимум - 5%» или «выше среднего на 2%» — динамическое ценообразование на основе реальных данных. Такое решение повышает конверсию до 15% в наших проектах.

Как добавить новый агрегатор: пошаговая инструкция

  1. Создать класс-адаптер, реализующий AggregatorAdapterInterface.
  2. Зарегистрировать адаптер в сервис-контейнере с тегом aggregator.adapters.
  3. Реализовать маппинг полей источника в единую схему.
  4. Протестировать на выборке 200 товаров.
  5. Запустить полную загрузку.

Обогащение существующих товаров

Основной кейс: в каталоге есть товар с артикулом, но без характеристик и описания. Агрегатор знает этот товар по GTIN или названию бренда+модели. Мы обогащаем только пустые поля, не перезаписывая ручные правки.

class ProductEnrichmentService { public function enrich(Product $product): bool { // Поиск по GTIN у агрегаторов foreach ($this->adapters as $adapter) { $data = $adapter->findByGtin($product->gtin); if (!$data) $data = $adapter->findByBrandModel($product->brand, $product->model); if (!$data) continue; $this->applyEnrichment($product, $data, $adapter->getSourceId()); return true; } return false; } private function applyEnrichment(Product $product, array $data, string $source): void { // Обогащаем только пустые поля — не перезаписываем существующее if (!$product->description && !empty($data['description'])) { $product->description = $data['description']; $product->description_source = $source; } if (empty($product->specs) && !empty($data['specs'])) { foreach ($data['specs'] as $name => $spec) { ProductSpec::updateOrCreate( ['product_id' => $product->id, 'name' => $name], ['value' => $spec['value'], 'unit' => $spec['unit'], 'source' => $source] ); } } $product->save(); } } 
Как работает дедупликация?

Пример настройки приоритетов источников: массив sourcePriority определяет, какой источник считается основным. Чем выше число, тем приоритетнее. При конфликте победит более приоритетный.

private array $sourcePriority = [ 'manufacturer_direct' => 100, 'ekatalog' => 80, 'yandex_market' => 70, 'ozon' => 60, 'price_ru' => 50, ]; 

Дедупликация выполняется по внешнему ID (GTIN, артикул). Если два источника предоставляют один и тот же товар, данные берутся из более приоритетного. Это исключает дубли и конфликты.

Сроки реализации

  • Один адаптер (YML от Яндекс.Маркет), обогащение пустых полей — 2 дня
  • Мультиагрегаторная структура + приоритеты + рыночные цены — +2 дня
  • OZON/WB API, динамическое ценообразование на основе рынка — +2–3 дня

Что входит в работу

  • Разработка и настройка адаптеров под каждый источник
  • Нормализация и дедупликация данных
  • Обогащение пустых полей (описания, характеристики, изображения)
  • Подготовка документации по структуре данных и процессу обновления
  • Передача доступов к системе (личный кабинет, FTP, API-ключи)
  • Обучение контент-менеджеров работе с импортом
  • Техническая поддержка в течение месяца после запуска

Итоговый срок зависит от количества адаптеров и сложности нормализации. Свяжитесь с нами для бесплатной оценки вашего проекта. Закажите импорт товаров и получите каталог с полными данными за 2 дня.