Представьте: интернет-магазин получает прайс-листы от 20 поставщиков в форматах CSV, XML и HTML. Вручную обновлять 50 000 товаров каждый день — ошибки неизбежны, ручной ввод ведёт к дублям и потерянным продажам. Мы решаем это — разрабатываем парсер на PHP, встроенный в 1С-Битрикс, который автоматически забирает данные из любых источников и заливает в инфоблоки. PHP-парсер для Битрикс в 2 раза быстрее Python-решения за счёт прямого доступа к API. Свяжитесь с нами — оценим задачу за один рабочий день.
За пять лет мы реализовали более 20 проектов парсинга для Битрикс. Каждый парсер проектируется под конкретную задачу: будь то загрузка 10 000 товаров из CSV или сбор данных с десятка сайтов-конкурентов. Мы используем PHP, потому что он — родной язык для Битрикс. Парсер может напрямую работать с API инфоблоков, без REST и промежуточных очередей. Это снижает сложность и ускоряет разработку в 2–3 раза по сравнению с гибридными связками. Для задач, не требующих рендеринга JavaScript, PHP — лучший выбор.
Архитектура PHP-парсера
Парсер состоит из четырёх компонентов:
-
Конфигурация источников. Массив или таблица в БД с параметрами каждого источника: URL, тип (RSS, HTML, API), CSS-селекторы для извлечения данных, маппинг полей, частота обновления.
-
HTTP-клиент. Для простых задач — cURL через
CHttpClientиз ядра Битрикс или нативныйcurl_multiдля параллельных запросов. Для сложных — Guzzle с middleware для retry, логирования, ротации прокси. Подробнее о параллельных запросах — в документации 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 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, интегрируем с инфоблоками и внешними системами.
- Тестирование — нагрузочное тестирование на реальных данных, имитация сбоев.
- Документация и передача — описание архитектуры, инструкция по эксплуатации, обучение разработчика.
Что вы получаете
- Работающий парсер, встроенный в вашу копию 1С-Битрикс.
- Полную документацию и комментарии в коде.
- Гарантию на работу парсера в течение 3 месяцев после сдачи проекта.
- Бесплатное постпроектное сопровождение.
Разработка PHP-парсера обходится в 2 раза дешевле, чем гибридное решение на Python+Node.js, а сопровождение — в 3 раза дешевле, так как вся логика в одной системе.
Закажите разработку парсера — мы гарантируем результат и полную документацию. Получите консультацию инженера бесплатно.







