Парсинг изображений (GBStore)
Многие товары приходят из mphone без изображений. Чтобы наполнить каталог картинками, DM Shop скрейпит их со страниц товаров у поставщика (GBStore): товар ставится в очередь, фоновая задача открывает страницу, извлекает ссылки на изображения, скачивает их и сохраняет в S3.
Код — в back/.../sync/ (GbstoreScrapeEnqueuer, GbstoreImageScrapeJob, GbstoreImageProcessor). Настройки — группа gbstore.scraping.* (enabled, delay-ms, user-agent, job-delay-ms).
Очередь скрейпинга
Каждому товару соответствует задача в gbstore_scrape_queue:
| Поле | Описание |
|---|---|
product_id | Товар |
product_page_url | URL страницы товара у поставщика |
status | PENDING / IN_PROGRESS / DONE / FAILED |
attempts | Число попыток |
error_message | Текст последней ошибки |
Задача GbstoreImageScrapeJob (@Scheduled(fixedDelay = 60 с), флаг gbstore.scraping.enabled) забирает порцию задач со статусом PENDING, парсит страницу через Jsoup, скачивает картинки и сохраняет их в S3 (GbstoreImageProcessor → gbstore_image_staging → таблица images), затем привязывает к товару.
Лог загрузок
Каждая попытка скачать конкретное изображение фиксируется в gbstore_image_download_log:
| Поле | Описание |
|---|---|
product_id | Товар |
image_url | URL изображения |
status | SUCCESS / FAILED |
attempts | Число попыток |
error_message | Причина ошибки |
first_seen_at / last_attempt_at | Время первой и последней попытки |
Это позволяет точечно разбираться, почему у товара не появилась картинка, и повторять только неудачные загрузки.
API (роль ADMIN / SUPER_ADMIN)
Управление очередью:
GET /api/v1/admin/scrape-queue/stats # статистика очереди
GET /api/v1/admin/scrape-queue # список (фильтры: статус, поиск, страница)
POST /api/v1/admin/scrape-queue/{id}/retry # повторить задачу
POST /api/v1/admin/scrape-queue/enqueue-active-without-images # поставить в очередь активные товары без картинок
POST /api/v1/admin/scrape-queue/retry-failed # повторить все неудачные
По конкретному товару:
GET /api/v1/admin/scrape-queue/product/{productId} # статус скрейпинга
GET /api/v1/admin/scrape-queue/product/{productId}/image-log # лог загрузок по товару
POST /api/v1/admin/scrape-queue/product/{productId}/enqueue # поставить товар в очередь (можно указать pageUrl)
Лог загрузок:
GET /api/v1/admin/scrape-queue/image-log/stats # статистика загрузок
GET /api/v1/admin/scrape-queue/image-log # список (фильтры: статус, поиск, страница)
POST /api/v1/admin/scrape-queue/image-log/{id}/retry
POST /api/v1/admin/scrape-queue/image-log/backfill # заполнить лог по уже существующим картинкам
POST /api/v1/admin/scrape-queue/image-log/retry-failed
POST /api/v1/admin/scrape-queue/manual-import # ручной импорт картинок по URL
Связь с XML-пайплайном
Постановка товаров в очередь происходит на этапе IMAGE_QUEUE XML-пайплайна. Перед скачиванием учитываются ручные переопределения картинок (REPLACE / APPEND).
Админ-интерфейс
Раздел Каталог → Очередь картинок (/admin/image-queue) показывает статистику очереди и лога, позволяет ставить товары в очередь и повторять неудачные загрузки. Статус по конкретному товару виден также в его карточке.
