Уявіть: інтернет-магазин отримує прайс-листи від 20 постачальників у форматах CSV, XML та HTML. Вручну оновлювати 50 000 товарів щодня — помилки неминучі, ручне введення веде до дублів та втрачених продажів. Ми вирішуємо це — розробляємо парсер на PHP, вбудований в 1С-Бітрікс, який автоматично забирає дані з будь-яких джерел і заливає в інфоблоки. PHP-парсер для Бітрікс у 2 рази швидший за Python-рішення, а вартість розробки простого парсера — від 500 доларів, складного — від 3000 доларів. Зв'яжіться з нами — оцінимо задачу за один робочий день.
За п'ять років ми реалізували більше 20 проектів парсингу для Бітрікс. Кожен парсер проектується під конкретне завдання: чи то завантаження 10 000 товарів із CSV, чи збір даних з десятка сайтів-конкурентів. Ми використовуємо PHP, тому що це рідна мова для Бітрікс. Парсер може напряму працювати з API інфоблоків, без REST та проміжних черг. Це знижує складність і прискорює розробку в 2–3 рази порівняно з гібридними зв'язками. Для задач, що не потребують рендерингу JavaScript, PHP — найкращий вибір. Парсер на PHP для Бітрікс кращий за гібридні рішення в 2-3 рази за швидкістю впровадження та в 2 рази дешевший.
Як автоматизувати імпорт товарів у Бітрікс?
Архітектура PHP-парсера
Парсер складається з чотирьох компонентів:
-
Конфігурація джерел. Масив або таблиця в БД з параметрами кожного джерела: URL, тип (RSS, HTML, API), CSS-селектори для вилучення даних, мапінг полів, частота оновлення.
-
HTTP-клієнт. Для простих завдань — cURL через
CHttpClientз ядра Бітрікс або нативнийcurl_multiдля паралельних запитів. Для складних — Guzzle з middleware для retry, логування, ротації проксі. Guzzle підтримує PSR-7 та middleware. Детальніше про паралельні запити — в документації PHP. -
Парсер HTML/XML.
DOMDocument+DOMXPathдля точної навігації по DOM. Для CSS-селекторів — бібліотекаSymfony\Component\DomCrawler. Для RSS —SimpleXMLElement. -
Імпортер. Шар запису даних в інфоблоки Бітрікс через D7 API або старий API (
CIBlockElement).
Як прискорити парсинг у 10 разів?
Головне вузьке місце PHP-парсера — послідовність запитів. Завантаження 1 000 сторінок по 2 секунди кожна = 33 хвилини. З curl_multi можна обробляти 10–20 запитів паралельно:
$multiHandle = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_multi_add_handle($multiHandle, $ch);
$handles[$i] = $ch;
}
do {
$status = curl_multi_exec($multiHandle, $active);
curl_multi_select($multiHandle);
} while ($active > 0);
Обмеження: більше 50 паралельних з'єднань — і PHP починає споживати занадто багато пам'яті. Для масштабного парсингу (10 000+ URL) розбивайте на батчі по 20–30 з'єднань.
Інтеграція з ядром Бітрікс
Перевага PHP-парсера — прямий доступ до API. Не потрібен REST, не потрібна проміжна база. Імпорт в інфоблоки:
$element = new CIBlockElement();
$elementId = $element->Add([
'IBLOCK_ID' => IBLOCK_CATALOG,
'NAME' => $parsedData['title'],
'XML_ID' => $parsedData['external_id'],
'ACTIVE' => 'Y',
'PREVIEW_TEXT' => $parsedData['description'],
'DETAIL_TEXT' => $parsedData['content'],
'DETAIL_TEXT_TYPE' => 'html',
'PREVIEW_PICTURE' => CFile::MakeFileArray($parsedData['image_path']),
]);
if ($elementId) {
CIBlockElement::SetPropertyValuesEx($elementId, IBLOCK_CATALOG, [
'SOURCE_URL' => $parsedData['url'],
'ARTICLE' => $parsedData['sku'],
]);
}
Важно: при масовому імпорті вимикайте пошук та оновлення URL:
CIBlockElement::DisableEvents(); // Вимикає обробники подій
Без цього кожен Add() запускає переіндексацію пошуку, оновлення фасетного індексу та інші обробники — імпорт 10 000 товарів розтягнеться на години.
Детальніше про роботу з подіями.
Як забезпечити стійкість парсера?
Обробка помилок та стійкість
PHP-парсер у продакшні повинен обробляти:
- Тайм-аути — сервер не відповідає, з'єднання зависло. Встановлюйте
CURLOPT_TIMEOUTтаCURLOPT_CONNECTTIMEOUT. - HTTP-помилки — 403, 429, 503. Для 429 (rate limit) — збільште затримку. Для 403 — змініть проксі. Для 503 — повторіть пізніше.
- Некоректний HTML —
DOMDocument::loadHTMLгенерує warnings. Приглушуйте через@абоlibxml_use_internal_errors(true), але логуйте проблемні URL. - Вичерпання пам'яті — великі HTML-сторінки (5+ МБ) з'їдають пам'ять. Встановлюйте
memory_limitадекватно та звільняйте DOM після обробки:unset($dom).
Паттерн retry з експоненційною затримкою:
function fetchWithRetry(string $url, int $maxRetries = 3): ?string
{
for ($i = 0; $i < $maxRetries; $i++) {
$response = @file_get_contents($url);
if ($response !== false) {
return $response;
}
sleep(pow(2, $i)); // 1, 2, 4 секунди
}
return null;
}
Типові помилки та стратегії їх обробки
| Тип помилки | Стратегія |
|---|---|
| Тайм-аут з'єднання | Повтор через 5 секунд, до 3 спроб |
| HTTP 429 (Too Many Requests) | Збільшити затримку між запитами, використовувати проксі |
| HTTP 403 (Forbidden) | Змінити User-Agent, проксі, авторизацію |
| HTTP 503 (Service Unavailable) | Повтор з експоненційною затримкою |
| Некоректний HTML | Використовувати libxml_use_internal_errors, логувати URL |
| Перевищення memory_limit | Розбити на батчі, звільняти DOM |
Логування
Без логів налагодження парсера неможливе. Мінімальний набір подій для запису:
- Початок та завершення сесії парсингу (час, кількість оброблених URL).
- Кожен HTTP-запит: URL, статус відповіді, час завантаження.
- Помилки парсингу: URL, тип помилки, контекст.
- Результат імпорту: створено, оновлено, пропущено (дублі), помилки.
Використовуйте \Bitrix\Main\Diag\Logger з D7 або пишіть в окрему таблицю parser_log.
PHP чи Python: що краще для парсингу в Бітрікс?
Порівняння: PHP vs Python для парсингу
| Критерій | PHP-парсер | Python-парсер |
|---|---|---|
| Інтеграція з Бітрікс | Прямий виклик API (без REST) | Через REST — нижча швидкість на 20-30% |
| Рендеринг JS | Ні (тільки HTML) | Так (Puppeteer, Playwright) |
| Максимальний обсяг за сесію | до 50 000 сторінок | до 500 000 (асинхронний) |
| Швидкість розробки з нуля | 5-10 днів | 7-14 днів (зв'язка двох систем) |
Коли PHP недостатньо
PHP-парсер не підходить, якщо:
- Потрібен рендеринг JavaScript — SPA-сайти, динамічне підвантаження контенту. Тут потрібен headless-браузер (Puppeteer/Playwright), а це Node.js або Python.
- Обсяг парсингу перевищує 50 000 сторінок за сесію — PHP впирається в однопотоковість та споживання пам'яті.
- Потрібна складна обробка тексту (NLP, класифікація, вилучення сутностей) — екосистема Python значно багатша.
У цих випадках розгляньте гібридний підхід: Python/Node.js для збору даних, PHP для імпорту в Бітрікс.
Етапи розробки парсера
- Аналіз джерел — визначаємо структуру даних, формат, частоту оновлення.
- Проектування архітектури — обираємо схему парсингу, паралелізацію, стратегію обробки помилок.
- Реалізація — пишемо код на PHP, інтегруємо з інфоблоками та зовнішніми системами. Розробка на Бітрікс вимагає знання API інфоблоків і компонентів. Синхронізація товарів Бітрікс з зовнішніми системами відбувається через парсер API Бітрікс. PHP-парсер для каталогу товарів дозволяє автоматично оновлювати ціни та залишки.
- Тестування — навантажувальне тестування на реальних даних, імітація збоїв.
- Документація та передача — опис архітектури, інструкція з експлуатації, навчання розробника.
Що входить у роботу
- Працюючий парсер, вбудований у вашу копію 1С-Бітрікс.
- Повну документацію та коментарі в коді.
- Доступ до логів та адміністрування парсера.
- Навчання вашого розробника (при необхідності).
- Гарантію на роботу парсера протягом 3 місяців після здачі проекту.
- Безкоштовний післяпроектний супровід.
Розробка PHP-парсера обходиться у 2 рази дешевше, ніж гібридне рішення на Python+Node.js, а супровід — у 3 рази дешевше, оскільки вся логіка в одній системі.
Замовте розробку парсера — ми гарантуємо результат і повну документацію. Отримайте консультацію інженера безкоштовно.







