Парсинг зображень товарів для 1С-Бітрікс
Каталог без зображень не продає. Ми знаємо це не з чуток: на одному з проєктів для інтернет-магазину електроніки потрібно було завантажити 15 000 фото від 50 постачальників. Ручне завантаження зайняло б місяць. Ми написали парсер, який впорався за два дні. Нещодавно до нас звернувся інтернет-магазин запчастин з каталогом у 20 тис. позицій. Постачальник надавав зображення лише через API, але API віддавав посилання з обмеженням за часом. Ми розробили скрипт, який завантажував фото паралельно, обробляв помилки та прив'язував до інфоблоків. Результат — повний каталог із зображеннями за 3 дні. У цій статті розповімо, як автоматизувати завантаження зображень товарів у 1С-Бітрікс, які підводні камені трапляються і як їх обійти.
Як Бітрікс зберігає зображення товарів
Зображення зберігаються в таблиці b_file, фізично — в /upload/iblock/. Як зазначено в офіційній документації по зберіганню файлів, елемент інфоблоку зв'язується із зображенням через поля: Зображення товарів зберігаються в таблиці b_file, а зв'язок з елементами інфоблоку здійснюється через поля PREVIEW_PICTURE та DETAIL_PICTURE.
-
PREVIEW_PICTURE— прев'ю для лістингу (ID запису в b_file) -
DETAIL_PICTURE— основне фото для картки - Властивість типу
F(файл) абоG(галерея) — для додаткових зображень
Для галереї використовується властивість типу F з флагом MULTIPLE = Y. Стандартний компонент bitrix:catalog.element бере зображення з цієї властивості.
Завантаження та збереження: покрокова інструкція
Процес складається з трьох етапів: завантажити файл, зберегти через CFile, прив'язати до елемента.
// Крок 1: завантаження файлу (з таймаутом та повторними спробами) $imageData = file_get_contents($imageUrl); // Крок 2: збереження через CFile::MakeFileArray() $tmpFile = tempnam(sys_get_temp_dir(), 'img_'); file_put_contents($tmpFile, $imageData); $fileArray = CFile::MakeFileArray($tmpFile); $fileArray['name'] = $filename; $fileId = CFile::SaveFile($fileArray, 'iblock'); // Крок 3: прив'язка до властивості галереї CIBlockElement::SetPropertyValuesEx($elementId, $iblockId, [ 'MORE_PHOTO' => ['n0' => ['VALUE' => $fileId]] ]); Для кількох зображень використовуємо індекси n0, n1, n2 і т.д. Важно: при великій кількості файлів використовуйте агенти або queue-обробку, щоб не перевищити ліміти виконання.
Проблеми при завантаженні зображень
Захист від хотлінкінгу. Багато сайтів-джерел перевіряють Referer. Передаємо коректний заголовок:
$client->get($url, ['headers' => ['Referer' => 'https://source-site.com']]); Якість зображень. Не всі знайдені фото придатні для каталогу. Перевіряємо мінімальний розмір перед збереженням:
$imageInfo = getimagesizefromstring($imageData); if ($imageInfo[0] < 300 || $imageInfo[1] < 300) continue; // пропускаємо дрібні Дублікати. Один і той самий URL може зустрічатися на різних сторінках. Кешуємо вже завантажені URL → file_id в пам'яті або в окремій таблиці.
Витяг URL зображень із джерела
Для одного головного фото:
$src = $crawler->filter('.product-image img')->attr('src'); Для галереї — часто зображення в data-атрибутах або всередині JavaScript. Приклад з data-атрибутами:
$crawler->filter('[data-image]')->each(function($node) use (&$urls) { $urls[] = $node->attr('data-image'); }); Якщо масив зображень лежить в JSON-LD, парсимо його стандартним json_decode.
Обробка вже існуючих зображень
Не затираємо фото, завантажені вручну або з 1С. Логіка:
- Перевіряємо
PREVIEW_PICTURE— якщо 0 або пустий, додаємо. - Для галереї — додаємо тільки якщо властивість
MORE_PHOTOпуста. - Помічаємо парсингові фото міткою в імені файлу (
parsed_prefix) для подальшої ідентифікації.
Чому парсинг вигідніший за ручне завантаження?
Парсинг зображень у 10 разів швидший за ручне наповнення і обходиться в 3-5 разів дешевше. Це дозволяє суттєво економити бюджет на наповнення каталогу.
| Параметр | Ручне завантаження | Парсинг |
|---|---|---|
| Час на 10 000 фото | 20–30 робочих днів | 2–4 дні |
| Помилки вводу | Висока ймовірність описок і невідповідностей | Мінімальна (після налагодження скрипту) |
| Вартість | Висока (оплата праці менеджерів) | Низька (одноразова розробка) |
| Масштабованість | Обмежена людськими ресурсами | Легко масштабується на будь-який обсяг |
Парсинг окупається вже на каталозі від 500 товарів. Крім того, автоматизація виключає "людський фактор" — переплутані фото або неправильні прив'язки залишаються в минулому.
Як уникнути дублікатів при парсингу?
Дублікати виникають, коли один і той самий URL завантажується кілька разів. Рішення — вести облік уже оброблених URL. Найпростіший спосіб: зберігати масив url => file_id в пам'яті скрипту або в окремому HL-блоці. При повторній зустрічі URL одразу використовуємо збережений file_id.
Що входить в нашу роботу з парсингу зображень?
- Аналіз джерела — визначення структури сторінок, методів доступу (API, парсинг HTML), оцінка обсягу.
- Розробка парсера — скрипт на PHP, що враховує особливості джерела (AJAX, захист, капча).
- Обробка помилок — retry при тимчасових збоях, логування невдач, сповіщення про проблеми.
- Прив'язка до інфоблоків — створення нових елементів або оновлення існуючих, заповнення PREVIEW_PICTURE, DETAIL_PICTURE та властивостей галереї.
- Тестування — прогін на 100–500 товарах, перевірка якості зображень, відповідність розмірам.
- Документація — опис архітектури скрипту, інструкція з запуску та підтримки.
- Супровід — якщо джерело зміниться, ми адаптуємо парсер (договір на підтримку).
Орієнтовні терміни
| Етап | Термін |
|---|---|
| Аналіз структури джерела | 2–4 години |
| Завантаження, валідація, збереження через CFile | 1–2 дні |
| Прив'язка до елементів інфоблоку (прев'ю + галерея) | 4–8 годин |
| Обробка помилок, retry, логування | 4 години |
| Тестовий прогін на 500 позиціях | 4 години |
| Разом | 3–5 робочих днів |
При каталозі від 10 000 зображень додається 1–2 дні на паралелізацію завантаження. Точні терміни залежать від складності джерела та вимог до якості.
Наш досвід та гарантії
Ми займаємося розробкою на 1С-Бітрікс більше 5 років і реалізували 30+ проєктів з наповнення каталогів. Наші інженери сертифіковані та знають усі тонкощі API. Гарантуємо, що після парсингу всі зображення будуть коректно прив'язані, а дублікати виключені. Зв'яжіться з нами для оцінки вашого проєкту — ми підготуємо пропозицію протягом дня. Отримайте консультацію з автоматизації каталогу.







