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

View File

@@ -0,0 +1,56 @@
import 'dotenv/config';
import { MagnitApiScraper } from '../scrapers/api/magnit/MagnitApiScraper.js';
import { connectDatabase, disconnectDatabase, prisma } from '../config/database.js';
import { Logger } from '../utils/logger.js';
async function main() {
const storeCode = process.env.MAGNIT_STORE_CODE || process.argv[2];
if (!storeCode) {
Logger.error('Не указан код магазина. Используйте переменную окружения MAGNIT_STORE_CODE или передайте как аргумент');
process.exit(1);
}
Logger.info(`🚀 Запуск скрапинга для магазина: ${storeCode}`);
const scraper = new MagnitApiScraper({
storeCode,
storeType: process.env.MAGNIT_STORE_TYPE || '6',
catalogType: process.env.MAGNIT_CATALOG_TYPE || '1',
headless: true,
});
try {
// Подключение к БД
await connectDatabase();
// Инициализация скрапера
await scraper.initialize();
// Получение всех товаров
const products = await scraper.scrapeAllProducts(100);
Logger.info(`📦 Получено товаров: ${products.length}`);
if (products.length > 0) {
// Сохранение в БД
const saved = await scraper.saveToDatabase(products, prisma);
Logger.info(`✅ Успешно сохранено товаров: ${saved}`);
} else {
Logger.warn('⚠️ Товары не найдены');
}
Logger.info('✅ Скрапинг завершен успешно');
} catch (error) {
Logger.error('❌ Ошибка при скрапинге:', error);
process.exit(1);
} finally {
// Закрытие браузера
await scraper.close();
// Отключение от БД
await disconnectDatabase();
}
}
main();

View File

@@ -0,0 +1,18 @@
import 'dotenv/config';
import { connectDatabase, disconnectDatabase } from '../config/database.js';
async function testConnection() {
try {
console.log('🔌 Тестирование подключения к базе данных...');
await connectDatabase();
console.log('✅ Подключение успешно!');
} catch (error) {
console.error('❌ Ошибка подключения:', error);
process.exit(1);
} finally {
await disconnectDatabase();
}
}
testConnection();