Files
FarmaFinder/apps/scraper/src/promofarma.js
T
Antoni Nuñez Romeu 190b3d163d
Run Tests on Branches / Backend Tests (push) Successful in 3m38s
Run Tests on Branches / Frontend Tests (push) Successful in 3m28s
Restructure with Turborepo
2026-07-06 15:51:53 +02:00

52 lines
1.6 KiB
JavaScript

const puppeteer = require('puppeteer-extra');
async function scrapePromofarma(query, browser) {
const page = await browser.newPage();
const url = `https://www.promofarma.com/es/search?q=${encodeURIComponent(query)}`;
try {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
// Fallback/heuristic extraction
const products = await page.evaluate(() => {
const results = [];
const cards = document.querySelectorAll('.product-card, article, [class*="product"]');
cards.forEach(card => {
const titleEl = card.querySelector('h3, h2, [class*="title"], [class*="name"]');
const priceEl = card.querySelector('[class*="price"], .current-price');
const linkEl = card.querySelector('a');
if (titleEl && priceEl && titleEl.innerText.trim().length > 0) {
results.push({
name: titleEl.innerText.trim(),
price: priceEl.innerText.trim(),
link: linkEl ? linkEl.href : null,
source: 'Promofarma'
});
}
});
// Deduplicate keeping the first occurrence
const unique = [];
const names = new Set();
for (const p of results) {
if (!names.has(p.name)) {
names.add(p.name);
unique.push(p);
}
}
return unique.slice(0, 5); // Return top 5
});
return products;
} catch (error) {
console.error(`[Promofarma] Error scraping ${query}:`, error.message);
return [];
} finally {
await page.close();
}
}
module.exports = scrapePromofarma;