Перейти к основному содержимому

Парсинг изображений (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_urlURL страницы товара у поставщика
statusPENDING / IN_PROGRESS / DONE / FAILED
attemptsЧисло попыток
error_messageТекст последней ошибки

Задача GbstoreImageScrapeJob (@Scheduled(fixedDelay = 60 с), флаг gbstore.scraping.enabled) забирает порцию задач со статусом PENDING, парсит страницу через Jsoup, скачивает картинки и сохраняет их в S3 (GbstoreImageProcessorgbstore_image_staging → таблица images), затем привязывает к товару.


Лог загрузок

Каждая попытка скачать конкретное изображение фиксируется в gbstore_image_download_log:

ПолеОписание
product_idТовар
image_urlURL изображения
statusSUCCESS / 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) показывает статистику очереди и лога, позволяет ставить товары в очередь и повторять неудачные загрузки. Статус по конкретному товару виден также в его карточке.

Очередь картинок