Initial commit: Supermarket scraper MVP

This commit is contained in:
2025-12-28 23:29:30 +05:00
commit 19c0426cdc
30 changed files with 4839 additions and 0 deletions

130
README.md Normal file
View File

@@ -0,0 +1,130 @@
# 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