Парсинг статей та контенту для автозаповнення 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 — додатковий юридичний ризик. - Обмеження частоти — 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
Розділення на три задачі дозволяє контролювати кожен етап незалежно та швидко локалізувати проблему при збої.







