Парсинг статей и контента для автонаполнения 1С-Битрикс
Контентные разделы сайта — блог, база знаний, каталог статей — требуют регулярного обновления. Ручное наполнение стоит дорого и масштабируется плохо. Парсинг статей из внешних источников позволяет поддерживать частоту публикаций, но отличается от парсинга товаров: здесь важнее качество текста, сохранение структуры и форматирования, чем скорость обработки.
Отличие от парсинга новостей
Новостной парсер работает с RSS-фидами — структурированными, предсказуемыми данными. Парсинг статей — это работа с произвольными HTML-страницами, где каждый сайт-источник имеет свою вёрстку, структуру навигации и способ представления контента.
Ключевые отличия:
- Нет единого формата — каждый источник требует индивидуального парсера или универсального экстрактора.
- Сложная структура контента — статья содержит заголовки, списки, таблицы, встроенные медиа, блоки кода. Всё это нужно сохранить.
- Объём текста — статья в 5 000–10 000 символов против 500-символьной новости. Больше данных — больше точек отказа.
- Частота обновления — статьи публикуются реже новостей, но каждая единица контента ценнее.
Извлечение контента из HTML
Основная задача — отделить текст статьи от навигации, сайдбаров, рекламы, комментариев и футера. Три подхода:
1. CSS-селекторы под конкретный сайт. Для каждого источника определяется селектор основного контента: article.post-content, div#main-text, .entry-body. Надёжно работает для ограниченного набора источников, ломается при редизайне.
2. Алгоритмы извлечения контента. Библиотеки типа Readability (порт Mozilla Readability на PHP — andreskrey/readability.php) анализируют DOM и выделяют основной контент по эвристикам: плотность текста, соотношение ссылок к тексту, семантические теги <article>, <main>.
3. Гибридный подход. Readability для первичного извлечения + кастомные правила для конкретных источников, где автоматика ошибается.
На практике гибридный подход — единственный, который работает для 10+ источников. Чистая автоматика теряет важные блоки (таблицы, списки), чистые селекторы не масштабируются.
Сохранение структуры и форматирования
После извлечения HTML нужно привести его к формату, пригодному для хранения в DETAIL_TEXT инфоблока Битрикс:
-
Очистка — удаление
<script>,<style>,<iframe>, inline-стилей, data-атрибутов. ИспользуйтеHTMLPurifierс кастомной конфигурацией, разрешающей<h2>–<h4>,<p>,<ul>,<ol>,<li>,<table>,<img>,<a>,<strong>,<em>,<blockquote>,<pre>,<code>. -
Нормализация заголовков — исходный
<h1>статьи становится<h2>в контексте страницы Битрикс (где<h1>— заголовок элемента). -
Локализация изображений — скачивание внешних картинок в
/upload/, замена URL в HTML. Без этого изображения пропадут при блокировке источника или смене URL. -
Ленивая загрузка — многие сайты используют
data-srcвместоsrcдля картинок. Парсер должен это учитывать.
Маппинг в инфоблок
| Извлечённые данные | Поле инфоблока | Обработка |
|---|---|---|
Заголовок <h1> / <title> |
NAME |
Обрезка до 255 символов, очистка HTML |
| Первые 300 символов текста | PREVIEW_TEXT |
strip_tags() + обрезка по границе предложения |
| Полный HTML статьи | DETAIL_TEXT |
Очистка через HTMLPurifier |
| Первое изображение | PREVIEW_PICTURE |
Скачивание + ресайз |
| URL источника | PROPERTY_SOURCE_URL |
Без изменений |
| Дата публикации | ACTIVE_FROM |
Парсинг через strtotime() |
| md5(url) | XML_ID |
Для дедупликации |
| Автор | PROPERTY_AUTHOR |
Извлечение из meta или byline |
| Теги / ключевые слова | PROPERTY_TAGS |
Множественное свойство типа «строка» |
Пошаговый процесс парсинга
Шаг 1. Сбор URL. Парсер обходит страницы-списки (пагинация, категории, sitemap.xml) и собирает URL статей. Сохраняет в очередь — таблицу parser_queue с полями url, status, created_at.
Шаг 2. Загрузка и извлечение. Для каждого URL из очереди: загрузка HTML, извлечение контента, парсинг метаданных. Результат — структурированный массив, сохраняемый в промежуточную таблицу parser_articles.
Шаг 3. Модерация (опционально). Администратор просматривает спарсенные статьи в интерфейсе, одобряет или отклоняет. Для полной автоматизации этот шаг заменяется фильтрацией по правилам.
Шаг 4. Импорт. Одобренные статьи загружаются в инфоблок через CIBlockElement::Add(). Изображения сохраняются через CFile::MakeFileArray().
Работа с защитой от парсинга
Контентные сайты защищаются слабее, чем маркетплейсы, но базовые меры присутствуют:
-
robots.txt — проверяйте
Disallowдля парсируемых разделов. Игнорирование robots.txt — дополнительный юридический риск. - Rate limiting — 1–2 запроса в секунду безопасны для большинства сайтов. Агрессивный парсинг (10+ rps) приведёт к блокировке.
- JavaScript-рендеринг — SPA-сайты требуют headless-браузера. Для статичных сайтов достаточно cURL.
- Cloudflare / WAF — определяют ботов по fingerprint. Решается через headless-браузер с реалистичными заголовками.
Автоматизация в cron
Рекомендуемая структура cron-задач:
# Сбор новых URL из источников — раз в сутки
0 2 * * * php /home/bitrix/parsers/collect_urls.php
# Парсинг статей из очереди — каждые 2 часа
0 */2 * * * php /home/bitrix/parsers/parse_articles.php --limit=50
# Импорт в инфоблок — каждый час
0 * * * * php /home/bitrix/parsers/import_articles.php
Разделение на три задачи позволяет контролировать каждый этап независимо и быстро локализовать проблему при сбое.







