Initial commit: Supermarket scraper MVP
This commit is contained in:
130
README.md
Normal file
130
README.md
Normal 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
|
||||
Reference in New Issue
Block a user