feat: add product detail enrichment for Magnit products

- Add isDetailsFetched field to Product model
- Add fetchProductDetails() and fetchProductObjectInfo() methods to MagnitApiScraper
- Add ProductParser methods for detail parsing
- Add ProductService methods: getProductsNeedingDetails(), updateProductDetails(), markAsDetailsFetched()
- Add enrich-product-details.ts script with statistics tracking
- Update package.json with "enrich" script command
- Add E2E_GUIDE.md documentation
- Exclude debug scripts from tsconfig type-check (temporary)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-01-22 01:52:50 +05:00
parent 5a763a4e13
commit 3299cca574
11 changed files with 795 additions and 88 deletions

158
E2E_GUIDE.md Normal file
View File

@@ -0,0 +1,158 @@
# Руководство по скрапингу товаров Магнит
## 📋 Обзор
Процесс состоит из двух этапов:
1. **Базовый скрапинг** - получение списка товаров через API поиска
2. **Обогащение деталями** - получение бренда, описания, веса для каждого товара
---
## 🚀 Этап 1: Базовый скрапинг
### Что делает:
- Сканирует каталог товаров через API поиска
- Сохраняет базовую информацию: название, цена, рейтинг, изображение
- Сохраняет товары в базу данных с `isDetailsFetched = false`
### Запуск:
```bash
pnpm dev
```
### Опционально: указать магазин
```bash
MAGNIT_STORE_CODE=992301 pnpm dev
```
### Результат:
- В таблице `Product` появляются записи с базовыми данными
- Поля `brand`, `description`, `weight`, `unit` пустые
- `isDetailsFetched = false`
---
## ✨ Этап 2: Обогащение деталями
### Что делает:
- Получает товары с `isDetailsFetched = false`
- Для каждого товара запрашивает детали через специальный API endpoint
- Обновляет: бренд, описание, вес, единицу измерения
- Ставит `isDetailsFetched = true`
### Запуск:
```bash
pnpm enrich
```
### Опционально: указать магазин
```bash
MAGNIT_STORE_CODE=992301 pnpm enrich
```
### Результат:
- Поля `brand`, `description`, `weight`, `unit` заполнены
- Все товары имеют `isDetailsFetched = true`
---
## 🔄 Полный цикл (последовательный)
```bash
# 1. Базовый скрапинг
pnpm dev
# 2. Обогащение деталями
pnpm enrich
```
---
## 🧪 Тестирование
### Проверить соединение с БД:
```bash
pnpm test-db
```
### Проверить detail endpoint:
```bash
pnpm test-detail-endpoint
```
---
## 📊 Проверка результатов
### Через SQL:
```sql
-- Количество товаров
SELECT COUNT(*) FROM "Product";
-- Сколько обогащено
SELECT
COUNT(*) FILTER (WHERE "isDetailsFetched" = true) as enriched,
COUNT(*) FILTER (WHERE "isDetailsFetched" = false) as pending
FROM "Product";
-- Процент NULL полей
SELECT
'brand' as field,
ROUND(100.0 * SUM(CASE WHEN brand IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2) as null_percent
FROM "Product"
UNION ALL
SELECT 'description', ROUND(100.0 * SUM(CASE WHEN description IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2) FROM "Product"
UNION ALL
SELECT 'weight', ROUND(100.0 * SUM(CASE WHEN weight IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2) FROM "Product"
UNION ALL
SELECT 'unit', ROUND(100.0 * SUM(CASE WHEN unit IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2) FROM "Product";
```
---
## 🛠️ Управление миграциями
### Создать и применить миграцию:
```bash
pnpm prisma:migrate --name название_миграции
```
### Пересоздать Prisma Client:
```bash
pnpm prisma:generate
```
### Открыть Prisma Studio:
```bash
pnpm prisma:studio
```
---
## ⚠️ Возможные проблемы
### Advisory lock при миграции
Если при миграции возникает `P1002` error:
```bash
# Перезапустить PostgreSQL контейнер
docker restart supermarket-postgres
```
### 403 Forbidden при скрапинге
Скрапер автоматически переинициализирует сессию. Проверьте логи.
### Пустые результаты
Проверьте, что магазин с указанным `MAGNIT_STORE_CODE` существует.
---
## 📝 Доступные команды
| Команда | Описание |
|---------|----------|
| `pnpm dev` | Базовый скрапинг товаров |
| `pnpm enrich` | Обогащение деталями |
| `pnpm test-db` | Проверка соединения с БД |
| `pnpm test-detail-endpoint` | Тест detail API |
| `pnpm type-check` | Проверка типов TypeScript |
| `pnpm prisma:studio` | GUI для работы с БД |