Парсинг товаров с сайтов конкурентов для 1С-Битрикс
Интернет-магазин без актуальных данных о конкурентах теряет позиции по цене и ассортименту. Ручной мониторинг 500+ товарных позиций нерентабелен. Задача решается парсером, который собирает товарные данные с сайтов конкурентов и загружает их в инфоблок Битрикса для последующего анализа или автоматического реагирования.
Архитектура решения
Парсер конкурентов — это отдельный модуль, который не трогает основной каталог напрямую. Типовая схема:
- Сборщик — PHP/Python-скрипт с Guzzle или Symfony HttpClient, обходит страницы конкурента
-
Промежуточное хранилище — отдельный инфоблок
COMPETITORS_CATALOGили таблица в БД -
Аналитическая прослойка — сравнение с
b_catalog_priceсвоего магазина -
Триггер действий — изменение цены через
CCatalogProduct::Update()или уведомление менеджеру
Хранить данные конкурентов прямо в основном каталоге — плохая практика: засоряет b_iblock_element, ломает индексы поиска.
Технические сложности и как их обходить
Защита от парсинга — главное препятствие. Крупные магазины используют Cloudflare, динамическую подгрузку через JS (React/Vue SPA) и капчи. Против статических сайтов работает простой curl с ротацией User-Agent. Против JS-рендеринга нужен headless-браузер: Puppeteer через Node.js или Playwright.
Стек для JS-сайтов:
Playwright → stdout JSON → PHP читает через exec() → CIBlockElement::Add()
Нестабильная структура HTML — конкурент поменял вёрстку, парсер упал. Решение: CSS-селекторы вместо XPath там, где структура плоская, и обязательный мониторинг с алертом при нулевом результате выборки.
Блокировка IP — ротация через прокси-пул (residential proxies). Минимум 10–15 IP в пуле для каталога 1000+ позиций. Частота запросов: не чаще 1 запроса в 3–5 секунд на домен.
Что собираем
Типовой набор данных для парсинга конкурентов:
- Название товара и артикул
- Текущая цена (основная + скидочная)
- Наличие / количество
- Ссылка на товар-источник
- Дата последнего обновления
В Битриксе это мапируется на свойства инфоблока. Рекомендую добавить свойство COMPETITOR_URL типа «Строка» и COMPETITOR_PRICE_DATE типа «Дата» — для отслеживания актуальности данных.
Кейс: магазин электроники, 3 конкурента
Задача: отслеживать цены 2400 SKU у трёх конкурентов, обновлять данные раз в 6 часов.
Реализация:
- Парсер на PHP + Guzzle для двух конкурентов со статическим HTML
- Puppeteer для третьего (JS-SPA на Vue)
- Cron каждые 6 часов, поочерёдный запуск по конкурентам с паузой 2 часа между ними
- Инфоблок
COMPETITORS_PRICESс привязкой к основному каталогу черезXML_ID - Агент Битрикса запускает сравнение и формирует отчёт в Highload-блок
Результат: время реакции на изменение цены конкурента — 6 часов вместо ручного мониторинга раз в неделю. Менеджер получает сводку отклонений > 5% на email через модуль \Bitrix\Main\Mail\Event.
Таймлайн работ
| Этап | Срок |
|---|---|
| Анализ сайтов конкурентов, выбор технологии | 4–8 часов |
| Разработка парсера (1 конкурент, статический HTML) | 1–2 дня |
| Разработка парсера с headless-браузером | 2–3 дня |
| Интеграция с инфоблоком Битрикса | 1 день |
| Настройка cron, мониторинг, алерты | 4–6 часов |
| Тестирование на реальных данных | 1 день |
Итого на 3 конкурентов с разными технологиями — 5–8 рабочих дней. Поддержка парсера после запуска обязательна: верстка конкурентов меняется.







