Парсинг изображений товаров для наполнения 1С-Битрикс
Каталог без изображений не продаёт. Загрузка фото вручную для 3000+ SKU занимает недели. Парсинг изображений с сайтов производителей или поставщиков закрывает задачу за 1–3 дня — если правильно обработать скачивание, проверку качества и привязку к элементам инфоблока.
Как Битрикс хранит изображения товаров
Изображения хранятся в таблице 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_prefix) для последующей идентификации
Таймлайн работ
| Этап | Срок |
|---|---|
| Анализ структуры изображений на источнике | 2–4 часа |
| Скачивание, валидация, сохранение через CFile | 1–2 дня |
| Привязка к элементам инфоблока (превью + галерея) | 4–8 часов |
| Обработка ошибок, retry, логирование | 4 часа |
| Тестовый прогон на 500 позициях | 4 часа |
Итого: 3–5 рабочих дней. При большом каталоге (10 000+ изображений) добавьте 1–2 дня на оптимизацию скорости скачивания (параллельные воркеры).







