131 lines
3.5 KiB
Markdown
131 lines
3.5 KiB
Markdown
# Supermarket Scraper - Magnit API
|
||
|
||
Система скрапинга товаров из магазинов Магнит через API.
|
||
|
||
## Требования
|
||
|
||
- Node.js 18+
|
||
- pnpm
|
||
- Docker и Docker Compose (для PostgreSQL)
|
||
|
||
## Установка
|
||
|
||
1. Установите зависимости:
|
||
```bash
|
||
pnpm install
|
||
```
|
||
|
||
2. Установите браузеры для Playwright:
|
||
```bash
|
||
pnpm exec playwright install chromium
|
||
```
|
||
|
||
3. Настройте переменные окружения:
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
Отредактируйте `.env` и укажите:
|
||
- `DATABASE_URL` - строка подключения к PostgreSQL
|
||
- `MAGNIT_STORE_CODE` - код магазина для скрапинга (например, "992301")
|
||
|
||
4. Запустите PostgreSQL через Docker:
|
||
```bash
|
||
docker-compose up -d
|
||
```
|
||
|
||
5. Сгенерируйте Prisma Client:
|
||
```bash
|
||
pnpm prisma:generate
|
||
```
|
||
|
||
6. Создайте миграции Prisma:
|
||
```bash
|
||
pnpm prisma:migrate
|
||
```
|
||
|
||
## Использование
|
||
|
||
### Тестирование подключения к БД
|
||
|
||
```bash
|
||
pnpm test-db
|
||
```
|
||
|
||
### Запуск скрапинга
|
||
|
||
```bash
|
||
pnpm dev
|
||
```
|
||
|
||
Или с указанием кода магазина:
|
||
```bash
|
||
MAGNIT_STORE_CODE=992301 pnpm dev
|
||
```
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
supermarket/
|
||
├── src/
|
||
│ ├── config/ # Конфигурация
|
||
│ ├── database/ # Prisma схема и клиент
|
||
│ ├── scrapers/ # Скраперы API
|
||
│ ├── services/ # Сервисы (Product, Parser)
|
||
│ ├── scripts/ # CLI скрипты
|
||
│ └── utils/ # Утилиты (Logger, Errors)
|
||
├── docker-compose.yml # PostgreSQL контейнер
|
||
└── package.json
|
||
```
|
||
|
||
## API Магнита
|
||
|
||
- **Endpoint**: `POST /webgate/v2/goods/search`
|
||
- **Защита**: Запрос на каталог работает без защиты, но для детальной информации требуется Playwright сессия
|
||
|
||
## База данных
|
||
|
||
Используется PostgreSQL с расширением pgvector (для будущих embeddings).
|
||
|
||
Модели:
|
||
- `Store` - магазины
|
||
- `Category` - категории товаров
|
||
- `Product` - товары со всеми полями из API
|
||
- `ScrapingSession` - сессии скрапинга
|
||
|
||
## Разработка
|
||
|
||
### Prisma команды
|
||
|
||
```bash
|
||
# Генерация клиента
|
||
pnpm prisma:generate
|
||
|
||
# Создание миграции
|
||
pnpm prisma:migrate
|
||
|
||
# Открыть Prisma Studio
|
||
pnpm prisma:studio
|
||
```
|
||
|
||
### Сборка
|
||
|
||
```bash
|
||
pnpm build
|
||
```
|
||
|
||
## Важные моменты
|
||
|
||
1. Запрос на каталог работает без защиты - можно использовать обычный HTTP запрос
|
||
2. Для получения детальной информации о товарах требуется инициализация сессии через Playwright
|
||
3. Все товары получаются без фильтрации по категориям (пустой массив `categories: []`)
|
||
4. Rate limiting: задержка 300ms между запросами
|
||
|
||
## Записки
|
||
|
||
### Интеграция Requestly с Cursor
|
||
Написал нейросеткой по быстрому правило по статье https://requestly.com/blog/how-to-use-cursor-to-generate-api-testcases-in-requestly/
|
||
Может быть кривое правило
|
||
|
||
## todos
|