Парсинг зображень товарів для наповнення 1С-Бітрікс
Каталог без зображень не продає. Завантаження фото вручну для 3000+ SKU займає тижні. Парсинг зображень із сайтів виробників або постачальників закриває завдання за 1–3 дні — якщо правильно обробити завантаження, перевірку якості та прив'язку до елементів інфоблоку.
Як 1С-Бітрікс зберігає зображення товарів
Зображення зберігаються в таблиці b_file, фізично — в /upload/iblock/. Елемент інфоблоку зв'язується із зображенням через поля:
-
PREVIEW_PICTURE— прев'ю для лістингу (ID запису в b_file) -
DETAIL_PICTURE— основне фото для картки - Властивість типу
F(файл) абоG(галерея) — для додаткових зображень
Для галереї використовується властивість типу F з прапорцем MULTIPLE = Y. Стандартний компонент bitrix:catalog.element бере зображення з цієї властивості.
Завантаження та збереження зображень
Крок 1: завантажити файл
$imageData = file_get_contents($imageUrl);
// або через Guzzle з таймаутом та retry
Крок 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 тощо.
Проблеми при завантаженні зображень
Права на зображення — юридично необхідно переконатись у праві використання фото. Зображення виробника, як правило, можна використовувати для продажу його товарів — але уточнюйте умови.
Захист від хотлінкінгу — сайти-джерела можуть перевіряти 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-атрибутах:
$crawler->filter('[data-image]')->each(function($node) use (&$urls) {
$urls[] = $node->attr('data-image');
});
Іноді масив зображень знаходиться в JS: productImages: ["url1", "url2"] — парсимо regex'ом або через JSON-LD.
Обробка вже наявних зображень
Не затираємо фото, завантажені вручну або з 1С. Логіка:
- Перевіряємо
PREVIEW_PICTURE— якщо 0 або порожній, додаємо - Для галереї — додаємо лише якщо властивість
MORE_PHOTOпорожня - Позначаємо парсингові фото міткою в імені файлу (префікс
parsed_) для подальшої ідентифікації
Часові рамки робіт
| Етап | Термін |
|---|---|
| Аналіз структури зображень на джерелі | 2–4 години |
| Завантаження, валідація, збереження через CFile | 1–2 дні |
| Прив'язка до елементів інфоблоку (прев'ю + галерея) | 4–8 годин |
| Обробка помилок, retry, логування | 4 години |
| Тестовий запуск на 500 позиціях | 4 години |
Разом: 3–5 робочих днів. При великому каталозі (10 000+ зображень) додайте 1–2 дні на оптимізацію швидкості завантаження (паралельні воркери).







