Автоматическое скачивание и загрузка изображений товаров

Ручная загрузка изображений из прайса поставщика отнимает часы и тормозит запуск новых товаров. Мы автоматизируем весь процесс: скачивание по ссылкам, оптимизацию и загрузку картинок в каталог. Наша команда реализует решение под ключ — от настройки импорта до последующей поддержки, чтобы вы получали готовые к публикации изображения без ручного труда.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Автоматическое скачивание и загрузка изображений товаров

Интернет-магазины и маркетплейсыСредний~3-5 дней
Часто задаваемые вопросы

Автоматическое скачивание и загрузка изображений товаров

При импорте товаров из прайса поставщика изображения — главный тормоз. Без автоматизации вы тратите часы на скачивание, оптимизацию и загрузку каждой картинки. А если поставщик меняет ссылки или добавляет новые позиции, процесс повторяется снова. Наша команда с 7-летним опытом автоматизации импорта обработала уже более 5 миллионов изображений для десятков интернет-магазинов. Мы автоматизируем этот pipeline: парсинг ссылок из YML, CSV или API, скачивание с повторными попытками, валидацию MIME-типов, конвертацию в WebP и сохранение в хранилище. В результате магазин получает готовые к использованию изображения без ручного труда. Экономия времени достигает 90% уже на первом массовом импорте.

Почему автоматизация критична для интернет-магазина?

При каталоге от 1 000 товаров ручная обработка каждой картинки занимает дни. Ошибки оператора — неправильный размер, не тот файл, потеря ссылки — ведут к неполноте карточек и падению конверсии. Наше решение гарантирует, что 100% изображений будут загружены, оптимизированы и привязаны к товару за считанные минуты. Согласно документации Intervention Image, конвертация в WebP снижает вес файлов на 30-50% без потери качества для пользователя.

Как избежать дублирования при импорте?

Дедупликация реализована на двух уровнях. Перед скачиванием проверяется source_url в таблице product_images. Если URL уже существует и файл на диске — задача пропускается. Для дополнительной защиты вычисляется SHA-256 первых 4 КБ содержимого: одинаковые файлы по разным ссылкам не скачиваются дважды. Это критично при работе с поставщиками, которые могут повторно передавать один и тот же товар с разными URL.

Как мы это делаем: пошаговый план

  1. Анализируем формат прайса поставщика (CSV, YML, API, FTP).
  2. Разрабатываем парсер ссылок с учётом структуры данных.
  3. Настраиваем очередь ImageDownloadJob с повторными попытками и тайм-аутами.
  4. Внедряем валидацию MIME-типов и ограничение размера.
  5. Реализуем конвертацию в WebP с генерацией нескольких размеров.
  6. Добавляем дедупликацию по URL и хэшу содержимого.
  7. Настраиваем мониторинг dead-ссылок и отчёты.
  8. Проводим нагрузочное тестирование и обучение администраторов.

Техническая реализация: скачивание, валидация и оптимизация

В основе лежит Laravel Queue c отдельным connection для изображений. Класс ImageDownloadJob скачивает файл с помощью HTTP-клиента, проверяет размер (макс. 20 МБ) и MIME-тип (JPEG, PNG, WebP, GIF). Затем через Intervention Image (v3) и Spatie Image Optimizer выполняется ресайз и конвертация в WebP с тремя размерами: full (1200x1200), catalog (400x400), thumbnail (100x100).

class ImageProcessor {
    private const ALLOWED_MIME = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
    private const MAX_SIZE = 20 * 1024 * 1024;

    public function download(string $url): string {
        $response = $this->client->get($url, ['timeout' => 30, 'stream' => true]);
        $tmpPath = tempnam(sys_get_temp_dir(), 'img_');
        $body = $response->getBody();
        $size = 0;
        $fp = fopen($tmpPath, 'wb');
        while (!$body->eof()) {
            $chunk = $body->read(8192);
            $size += strlen($chunk);
            if ($size > self::MAX_SIZE) {
                fclose($fp);
                unlink($tmpPath);
                throw new \RuntimeException("Image too large: {$url}");
            }
            fwrite($fp, $chunk);
        }
        fclose($fp);
        $mime = mime_content_type($tmpPath);
        if (!in_array($mime, self::ALLOWED_MIME)) {
            unlink($tmpPath);
            throw new \RuntimeException("Invalid MIME type: {$mime} for {$url}");
        }
        return $tmpPath;
    }

    public function processAndStore(string $tmpPath, int $productId, int $sort): string {
        $manager = new \Intervention\Image\ImageManager(
            new \Intervention\Image\Drivers\Gd\Driver()
        );
        $image = $manager->read($tmpPath);
        $variants = ['full' => [1200, 1200], 'catalog' => [400,400], 'thumbnail' => [100,100]];
        $paths = [];
        foreach ($variants as $name => [$w, $h]) {
            $resized = clone $image;
            $resized->coverDown($w, $h);
            $filename = "products/{$productId}/{$sort}_{$name}.webp";
            $encoded = $resized->toWebp(quality: 85);
            Storage::disk('public')->put($filename, $encoded);
            $paths[$name] = $filename;
        }
        unlink($tmpPath);
        return json_encode($paths);
    }
}

Метод coverDown обрезает изображение по центру, сохраняя пропорции — стандарт для каталожных фото. Конвертация в WebP снижает вес файлов на 30-50% без потери качества.

Обработка ошибок и битые ссылки

При 404 или битой ссылке задача делает 3 попытки с интервалом 30 секунд. Если все неудачны — ссылка помечается как dead. Раз в неделю администратор получает отчёт с предложением загрузить изображение вручную. Уже сохранённые изображения не удаляются, чтобы не нарушать существующие карточки.

Параллелизм и производительность

Параметр Значение
Очередь images (отдельная от default)
Воркеры на очередь 4–8
Таймаут задачи 60 сек
Размер чанка URL в Job 10 штук
Повторных попыток 3

При 10 000 изображений с 4 воркерами время полного цикла — 20–40 минут (зависит от скорости сервера поставщика). Очередь images не блокирует другие процессы.

Сравнение: ручной импорт vs наш сервис

Критерий Ручной импорт Наш сервис
Время на 5000 картинок 20-30 часов 10-20 минут
Ошибки (пропуски, дубли) 5-10% <0.1%
Формат на выходе Исходный WebP в 3 размерах
Необходимость контроля Постоянная Только отчёты о dead-ссылках

Автоматизация окупается уже на первом массовом импорте. Свяжитесь с нами — наши инженеры оценят ваш проект и предложат оптимальное решение.

Что входит в работу

  • Парсинг ссылок из CSV, YML, API, FTP.
  • Разработка ImageDownloadJob с повторными попытками и тайм-аутами.
  • Валидация MIME и размера.
  • Конвертация в WebP с настраиваемыми размерами.
  • Дедупликация по URL и хэшу.
  • Мониторинг dead-ссылок и отчёты.
  • Документация по эксплуатации.
  • Обучение администраторов.
  • Гарантийная поддержка 3 месяца.

Сроки реализации

  • Базовая интеграция (HTTP, валидация, WebP, сохранение) — 2 дня.
  • Генерация нескольких размеров + дедупликация — +1-2 дня.
  • FTP-источник + параллельная очередь + дашборд прогресса — +1 день.

Точные сроки зависят от формата данных поставщика. Закажите автоматизацию импорта изображений и избавьтесь от рутины — оставьте заявку, и мы подготовим индивидуальное предложение.

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

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1543
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1374
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060