import axios from 'axios'; const API_URL = process.env.PARAPHARMACY_API_URL || 'http://localhost:3002'; const QUERIES = ['crema hidratante', 'protector solar', 'vitaminas', 'capricare']; const SOURCES = { promofarma: (q) => `https://www.promofarma.com/es/search?q=${encodeURIComponent(q)}`, pharmarket: (q) => `https://www.pharmarket.es/catalogsearch/result/?q=${encodeURIComponent(q)}`, }; async function scrapeSource(source, url) { try { console.log(` šŸ” Scraping ${source}: ${url}`); const response = await axios.get(url, { timeout: 15000, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } }); return response.data; } catch (error) { console.error(` āŒ Error scraping ${source}: ${error.message}`); return null; } } function extractProducts(html, source) { const products = []; // Try multiple patterns const patterns = [ // Promofarma patterns /]*class="[^"]*product-card[^"]*"[^>]*>([\s\S]*?)<\/div>\s*<\/div>/gi, /]*class="[^"]*product[^"]*"[^>]*>([\s\S]*?)<\/article>/gi, // Generic patterns /<(?:div|li)[^>]*class="[^"]*(?:product|item)[^"]*"[^>]*>([\s\S]*?)<\/(?:div|li)>/gi, ]; const namePatterns = [ /]*>([^<]+)<\/h[23]>/i, /class="[^"]*(?:name|title)[^"]*"[^>]*>([^<]+)]*>([^<]*\d+[.,]\d+[^<]*) 3 && name.length < 200 && price > 0 && price < 1000) { products.push({ name: name.substring(0, 200), price, source, source_product_id: `${source}_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`, source_url: `https://www.${source}.com`, brand: '', category: 'parapharmacy', available: true, scraped_at: new Date().toISOString() }); } } } // Deduplicate const seen = new Set(); return products.filter(p => { const key = `${source}:${p.name.toLowerCase()}`; if (seen.has(key)) return false; seen.add(key); return true; }).slice(0, 5); } async function main() { console.log('šŸš€ Starting parapharmacy scraper...\n'); let totalProducts = 0; for (const query of QUERIES) { console.log(`\nšŸ“‹ Query: "${query}"`); for (const [source, urlFn] of Object.entries(SOURCES)) { const url = urlFn(query); const html = await scrapeSource(source, url); if (html) { const products = extractProducts(html, source); console.log(` āœ… Found ${products.length} products`); if (products.length > 0) { try { await axios.post(`${API_URL}/api/products/bulk`, { products }); totalProducts += products.length; } catch (error) { console.error(` āŒ Error sending to API: ${error.message}`); } } } } } console.log(`\nšŸ“Š Scraping completed. Total products: ${totalProducts}`); } main().catch(error => { console.error('āŒ Scraper failed:', error.message); process.exit(1); });