# 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