Парсери та автонаповнення для 1С-Бітрікс
XMLReader, а не SimpleXML — ось з чого починається робота з каталогом постачальника на 800 МБ. SimpleXML підтягне весь файл у пам'ять, PHP впаде з fatal error на ліміті 512 МБ. XMLReader читає потоково, node за node, споживаючи 20-30 МБ на будь-якому обсязі. З цієї деталі стартує будь-який наш проєкт з автонаповнення каталогу на Бітрікс.
Що реально робить парсинг
- Первинне наповнення каталогу — 15 000 карток з описами, характеристиками, фото. Вручну це три місяці контент-менеджера; парсер — тиждень з налагодженням.
- Моніторинг цін конкурентів — збір даних з Ozon, Wildberries, сайтів конкурентів. Конкурент знизив ціну на ходову позицію — дізнаєтесь через дві години, а не через два тижні.
- Агрегація постачальників — п'ять прайсів у різних форматах (CSV з CP1251, XML у CommerceML, Excel з об'єднаними комірками) перетворюються на єдиний каталог зі спільною системою властивостей інфоблоку.
- Збагачення карток — підтягуємо характеристики, інструкції, 3D-моделі з сайтів виробників. Без цього картка товару — порожнє місце для SEO.
-
Оновлення асортименту — товари, що зникли з фіду постачальника, деактивуються через
CIBlockElement::Update($ID, ['ACTIVE' => 'N']). Нові — створюються. Каталог синхронізований.
Джерела та інструменти
Статичні сайти — PHP (Goutte, Symfony DomCrawler) або Python (Scrapy, lxml). Швидкість: 50-100 сторінок/сек. Вистачає для каталогів без JS-рендерингу.
SPA та динамічні сайти — Puppeteer або Playwright. Нескінченний скрол, AJAX-фільтри, lazy-load зображень — headless-браузер усе це обробить. Швидкість падає до 1-10 сторінок/сек, але альтернативи немає: дані існують лише після виконання JavaScript.
Файли постачальників:
- Excel (XLS, XLSX) — PhpSpreadsheet. Обережно з об'єднаними комірками та формулами — вони ламають автоматичний маппінг.
- CSV —
fgetcsv()з правильним кодуванням. Постачальники люблять CP1251, BOM у UTF-8 і крапку з комою замість коми. Усе це потрібно детектити й обробляти. - XML/YML — XMLReader для великих файлів, SimpleXML для фідів до 50 МБ.
- CommerceML — стандартний формат обміну з 1С. Розбираємо
import.xmlтаoffers.xml, маппимо на структуру інфоблоків.
API — REST-ендпоінти постачальників, API маркетплейсів (Ozon Seller API, Wildberries API). Працюємо в межах rate limits, обробляємо пагінацію.
Пайплайн автонаповнення
Чотири етапи. Кожен може зламатися по-своєму.
1. Збір. Парсер обходить джерела за cron-розкладом. Сирі дані пишемо у проміжну таблицю — не одразу в b_iblock_element. Логуємо все: скільки сторінок обійшли, скільки елементів розпарсили, де отримали 403 або timeout. Без логів налагодження парсера — ворожіння на кавовій гущі.
2. Нормалізація. Тут основна робота:
- Очищення HTML-тегів, зайвих пробілів, Unicode-сміття
- Одиниці виміру: «мм» → «мм», «millimeters» → «мм», «міліметр» → «мм»
- Маппінг категорій постачальника → розділи інфоблоку Бітрікс. В одного постачальника «Ноутбуки», в іншого «Ноутбуки і планшети», у третього «Laptops» — усе в одну секцію
- Дедуплікація за артикулом, EAN/GTIN. Один товар від трьох постачальників не повинен з'явитися тричі
3. Завантаження у Бітрікс. Через CIBlockElement::Add() для нових елементів, CIBlockElement::Update() для наявних. Зображення: завантажуємо, ресайзимо через CFile::ResizeImageGet(), конвертуємо у WebP. Властивості — через CIBlockElement::SetPropertyValuesEx(). SEO-мета через \Bitrix\Iblock\InheritedProperty\ElementValues. ЧПУ генеруємо з транслітерації назви.
4. Оновлення. Ключовий момент — не затерти ручні правки контент-менеджера. Оновлюємо лише ціну, залишки, активність. Опис і фото, доопрацьовані вручну, позначаємо прапорцем UF_MANUAL_EDIT у властивостях елемента й пропускаємо при імпорті. Товари, що зникли з фіду — деактивуємо, але не видаляємо.
Моніторинг цін конкурентів
Окрема підсистема зі своєю специфікою:
| Параметр | Як влаштовано |
|---|---|
| Частота | Від разу на день до кожних 2 годин — залежить від волатильності ринку |
| Зіставлення | За артикулом, EAN, нечітке порівняння назв через відстань Левенштейна |
| Зберігання | Власна таблиця vendor_price_monitor з історією, не інфоблоки |
| Алерти | Telegram/email при відхиленні ціни конкурента більш ніж на X% |
| Автоправила | «Тримати ціну на 3% нижче мінімальної серед конкурентів, але не нижче собівартості + 15%» |
Результат — дашборд: ваш товар vs конкуренти, історія цін, тренди. Менеджер бачить, де можна підняти ціну без втрати позиції, а де потрібно реагувати.
Модуль імпорту CSV/XML
Для файлів від постачальників — кастомний модуль з адмінкою:
- Налаштовуваний маппінг: «колонка B у файлі → властивість BRAND інфоблоку»
- Автодетект кодування (CP1251, UTF-8, UTF-16) через
mb_detect_encoding()з перевіркою - Завантаження зображень за URL з чергою — щоб не забити канал
- Інкрементальне оновлення за хешем рядка: змінився рядок — оновлюємо, ні — пропускаємо
- Cron-розклад, звіт: створено 145, оновлено 892, помилок 3 (з деталями)
Великі файли: CSV обробляємо батчами по 1000 рядків через fgetcsv(), XML потоково через XMLReader, фонове виконання через чергу агентів Бітрікс — жодних PHP-таймаутів.
Правова сторона
-
robots.txt— поважаємо. Crawl-delay — дотримуємося - Частота запитів — 1-2 на секунду, не більше. Не потрібно DDoS-ити чужий сайт
- Контент виробників — використовуємо. Унікальні авторські тексти — не копіюємо
- Персональні дані — не збираємо
Наш процес
- Прототип — парсер для 1-2 джерел за 2-3 дні. Оцінюємо якість даних, підводні камені (захист Cloudflare, капча, динамічне підвантаження).
- Розробка — повний пайплайн: парсер → нормалізація → імпорт у Бітрікс → адмінка для керування.
- Тестування — проганяємо на повному обсязі каталогу, перевіряємо edge-кейси (порожні поля, кривий HTML, биті зображення).
- Запуск — налаштовуємо cron, моніторинг помилок через Telegram-бот.
- Підтримка — конкурент переробив верстку? Оновлюємо CSS-селектори у парсері.
Терміни
| Задача | Терміни |
|---|---|
| Парсер одного сайту (статичний HTML) | 3-5 днів |
| Парсер SPA-сайту (Puppeteer/Playwright, обхід захисту) | 1-2 тижні |
| Модуль імпорту CSV/XML у Бітрікс | 1-2 тижні |
| Система моніторингу цін (5-10 конкурентів) | 2-4 тижні |
| Комплексна система автонаповнення | 4-8 тижнів |
| Підтримка та адаптація парсерів | за підпискою |







