Python-парсер для Бітрікс: архітектура та реалізація

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Python-парсер для Бітрікс: архітектура та реалізація
Середній
~1-2 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1368
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    956
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    699
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    848
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    737
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1086

Python-парсер для Бітрікс: архітектура та реалізація

Ви зіткнулися з ситуацією, коли стандартний імпорт через CSV або PHP-скрипт упирається в продуктивність? Наприклад, потрібно зібрати 50 000 товарів із сайту конкурента, але PHP не тягне headless-браузер, а каталог партнера віддає дані тільки через SPA. Ми вирішуємо такі завдання: проєктуємо парсер на Python, який завантажує дані в проміжне сховище, а PHP-імпортер переносить їх в інфоблоки Бітрікс. Понад 5 років досвіду та 40+ реалізованих проектів — від простих RSS-агрегаторів до систем машинного навчання для класифікації контенту.

Багато власників великих каталогів на Бітрікс стикаються з проблемами при оновленні товарів: ручне введення займає дні, імпорт з Excel збиває кодування, а партнери не надають API. Наш підхід — Python для збору, Бітрікс для зберігання та видачі. Це дає економію часу до 70% і повну прозорість процесу. Середня вартість парсера — від $500 до $2000 в залежності від складності.

Чому Python, а не PHP

Конкретні причини, а не абстрактні переваги:

  • Асинхронність. asyncio + aiohttp обробляють 100+ запитів паралельно. PHP curl_multi на практиці дає 20–50 з'єднань.
  • Headless-браузер. Playwright для Python стабільно працює з React-сайтами. PHP-обгортки Puppeteer менш надійні.
  • NLP та ML. Класифікація текстів, вилучення сутностей — бібліотеки spaCy, transformers не мають аналогів у PHP.
  • Бібліотеки. BeautifulSoup, lxml, Scrapy — перевірені інструменти з великою спільнотою.
  • За швидкістю Python краще за PHP у 3-4 рази: Scrapy обробляє 10 000 URL за 5–10 хвилин, а PHP-рішення з curl_multi — за 30–40 хвилин.

Як влаштована архітектура парсера?

Парсер на Python працює як окремий сервіс. Дані проходять через проміжне сховище — таблиці в спільній базі даних або черги RabbitMQ. Python пише сирі дані, PHP-агент забирає їх і пише в інфоблоки за допомогою CIBlockElement::Add.

Варіанти сховища

Спосіб Обсяг даних Особливість
JSON-файли до 1 000 Просто, без залежностей
PostgreSQL/MySQL 1 000–100 000 Індекси, транзакції
REST API Бітрікс будь-який Прямий запис, але HTTP overhead
Redis/RabbitMQ потокова Черги, масштабування

Для більшості проєктів оптимальна спільна база даних: Python пише в проміжну таблицю, PHP імпортує пакетами кожні 5–15 хвилин через cron.

Порівняння підходів: Python vs PHP для парсингу

Критерій Python PHP
Асинхронні запити asyncio + aiohttp (100+ паралельно) curl_multi (20-50)
Headless-браузер Playwright (стабільний) Puppeteer (менш надійний)
NLP/ML spaCy, transformers відсутні
Екосистема парсингу Scrapy (повноцінний фреймворк) Goutte (обмежений)

Приклад реалізації на Scrapy

Код спайдера

Scrapy — фреймворк, який бере на себе черги URL, retry, throttling. Spider для каталогу:

import scrapy

class CatalogSpider(scrapy.Spider):
    name = 'catalog'
    start_urls = ['http://books.toscrape.com/catalogue/']

    def parse(self, response):
        for product in response.css('.product-card'):
            yield {
                'name': product.css('h2::text').get(),
                'price': product.css('.price::text').get(),
                'description': product.css('.desc::text').get(),
                'image': product.css('img::attr(src)').get(),
                'url': product.css('a::attr(href)').get(),
            }
        next_page = response.css('.pagination .next::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)
Pipeline для запису в БД
import psycopg2

class BitrixPipeline:
    def open_spider(self, spider):
        self.conn = psycopg2.connect(
            host='localhost', port=5433,
            dbname='bitrix_db', user='bitrix'
        )

    def process_item(self, item, spider):
        cursor = self.conn.cursor()
        cursor.execute("""
            INSERT INTO parser_staging (name, price, description, image_url, source_url, status)
            VALUES (%s, %s, %s, %s, %s, 'new')
            ON CONFLICT (source_url) DO UPDATE SET
                price = EXCLUDED.price,
                updated_at = NOW()
        """, (item['name'], item['price'], item['description'],
              item['image'], item['url']))
        self.conn.commit()
        return item

Headless-браузер для SPA

Сайти на React або Vue віддають порожній HTML. Playwright вирішує це:

from playwright.async_api import async_playwright

async def parse_spa(url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url, wait_until='networkidle')
        content = await page.content()
        await browser.close()
        return content

Ресурсоємність: кожен екземпляр Chromium споживає 100–300 МБ RAM. Для масового парсингу використовуйте пул із 3–5 екземплярів і чергу завдань.

Як передати дані в Бітрікс?

PHP-скрипт на стороні Бітрікс забирає дані з проміжної таблиці:

$rows = $DB->Query("SELECT * FROM parser_staging WHERE status = 'new' LIMIT 100");
while ($row = $rows->Fetch()) {
    $elementId = (new CIBlockElement())->Add([
        'IBLOCK_ID' => CATALOG_IBLOCK_ID,
        'NAME'      => $row['name'],
        'XML_ID'    => md5($row['source_url']),
        // ...
    ]);
    if ($elementId) {
        $DB->Query("UPDATE parser_staging SET status='imported', bx_id={$elementId} WHERE id={$row['id']}");
    }
}

Скрипт запускається по cron кожні 5–15 хвилин і обробляє нові записи пакетами.

Деплой та моніторинг

Python-парсер деплоїться окремо від Бітрікс. Використовуйте systemd-сервіс або cron для запуску за розкладом. Virtual environment (venv) ізолює залежності. Логування через модуль logging з ротацією. Моніторинг — скрипт перевіряє, що парсер відпрацював за останні N годин, і надсилає алерт при зависанні.

Типовий crontab:

0 1 * * * cd /opt/parsers && /opt/parsers/venv/bin/scrapy crawl catalog 2>> /var/log/parser.log
0 */4 * * * cd /opt/parsers && /opt/parsers/venv/bin/python news_parser.py 2>> /var/log/parser.log

Ми використовуємо custom healthcheck: кожні 4 години перевіряємо, що парсер відпрацював без помилок. Якщо завис — автоматичний перезапуск і повідомлення в Telegram. Для критичних проєктів додаємо систему алертів на базі Prometheus та Grafana.

Коли потрібен Python-парсер?

Якщо джерело — SPA (React/Vue/Angular), обсяг даних перевищує 10 000 елементів, потрібна класифікація контенту або захист від DDoS — Python дає значну перевагу.

Що входить в роботу

  • Аналіз джерела та узгодження архітектури.
  • Розробка павука на Scrapy або асинхронного парсера на aiohttp.
  • Налаштування імпортера для Бітрікс (інфоблоки, HL-блоки, торгові пропозиції).
  • Створення проміжної бази даних та скриптів синхронізації.
  • Деплой на сервер (systemd, cron, моніторинг).
  • Документація з експлуатації та навчання адміністратора.
  • Підтримка після запуску та гарантія стабільної роботи 24/7.

Орієнтовні терміни та вартість

Термін розробки парсера — від 5 до 20 робочих днів залежно від складності джерела та обсягу даних. Середня вартість — від $500 до $2000. Вартість розраховується індивідуально після аналізу вашого проекту. Пропонуємо розробку під ключ: пишіть нам, оцінимо проект протягом дня.

З чого почати розробку парсера для 1С-Бітрікс?

XMLReader, а не SimpleXML — вибір інструмента визначає долю проекту. SimpleXML завантажує весь XML у пам’ять, і при файлі постачальника на 800 МБ PHP впаде з fatal error на ліміті 512 МБ. XMLReader обробляє потоково, node за node, споживаючи 20–30 МБ — в 30 разів ефективніше. З цієї деталі стартує будь-яка розробка парсерів під Бітрікс. Ми робимо такі системи вже понад 10 років, реалізували 50+ проектів, і жоден не обходиться без правильного вибору парсера.

Проблеми, які вирішує парсинг

  • Первинне наповнення каталогу — 15 000 карток з описами, характеристиками, фото. Вручну це три місяці контент-менеджера; парсер — тиждень з налагодженням. Економія часу — до 90%.
  • Моніторинг цін конкурентів — збір даних з Ozon, Wildberries, сайтів конкурентів. Конкурент знизив ціну на ходову позицію — дізнаєтеся через дві години, а не через два тижні. Окупається за 2–3 місяці.
  • Агрегація постачальників — п’ять прайсів у різних форматах (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 з чергою агентів Bitrix — щоб не забити канал
  • Інкрементальне оновлення за хешем рядка: змінився рядок — оновлюємо, ні — пропускаємо
  • Cron-розклад, звіт: створено 145, оновлено 892, помилок 3 (з деталями)

Великі файли: CSV обробляємо батчами по 1000 рядків через fgetcsv(), XML потоково через XMLReader, фонове виконання через чергу агентів Бітрікс — ніяких PHP-таймаутів.

Правова сторона — що важливо врахувати

  • robots.txt — поважаємо. Crawl-delay — дотримуємося.
  • Частота запитів — 1–2 в секунду, не більше. Не потрібно DDoS-ити чужий сайт.
  • Контент виробників — використовуємо. Унікальні авторські тексти — не копіюємо.
  • Персональні дані — не збираємо.

Що входить в розробку парсера під ключ?

Складова Опис
Прототип Парсер 1–2 джерел за 2–3 дні для оцінки якості даних
Основний парсер Повний збір даних з одного джерела (статичний/динамічний)
Модуль імпорту в Бітрікс Нормалізація, завантаження, оновлення, адмінка мапінгу
Моніторинг цін Якщо потрібно – система збору та алертів (до 10 конкурентів)
Документація Опис архітектури, інструкція з оновлення селекторів
Підтримка Гарантія 3 місяці на безперебійну роботу, правка при зміні верстки донора

Скільки часу займає розробка парсера?

Процес і терміни:

  1. Прототип — парсер для 1–2 джерел за 2–3 дні. Оцінюємо якість даних, підводні камені (захист Cloudflare, капча, динамічне підвантаження).
  2. Розробка — повний пайплайн: парсер → нормалізація → імпорт в Бітрікс → адмінка для управління.
  3. Тестування — проганяємо на повному обсязі каталогу, перевіряємо edge-кейси (порожні поля, кривий HTML, биті картинки).
  4. Запуск — налаштовуємо cron, моніторинг помилок через Telegram-бот.
  5. Підтримка — конкурент переробив верстку? Оновлюємо CSS-селектори в парсері.
Орієнтовні терміни для різних типів завдань
Задача Терміни
Парсер одного сайту (статичний HTML) 3–5 днів
Парсер SPA-сайту (Puppeteer/Playwright, обхід захисту) 1–2 тижні
Модуль імпорту CSV/XML в Бітрікс 1–2 тижні
Система моніторингу цін (5–10 конкурентів) 2–4 тижні
Комплексна система автонаповнення 4–8 тижнів
Підтримка та адаптація парсерів за підпискою

Отримайте консультацію: розкажіть про своє джерело даних — ми підберемо оптимальний підхід. Зв’яжіться для оцінки вашого проекту — запропонуємо рішення під ваш бюджет. Гарантуємо стабільну роботу парсерів і повну підтримку.