Resumen de ejecución
Sitios escaneados
5
✓ 5 OK · 0 errores
Registros extraídos
47
Planes y precios capturados
Tiempo total
1m 42s
⚡ Imágenes bloqueadas (-68% t.)
Cambios detectados
3
⚠ Vs. semana anterior
💰 Precios extraídos — Plan Profesional
lunes 07:04 AM
| Competidor | Plan | Precio / mes | Anual | ∆ vs anterior | Estado |
|---|---|---|---|---|---|
|
EtiquetoFacil.com
|
Pro |
89 €
|
890 €/año |
↑ +9€ (+11%) | ⚠ |
|
NutriCalc.es
|
Pro |
69 €
|
690 €/año |
→ sin cambio | ✓ |
|
LabelMaster.io
|
Biz |
149 €
|
1.490 €/año |
↓ -10€ (-6%) | ⚠ |
|
FoodLabel360.com
|
Pro |
95 €
|
950 €/año |
→ sin cambio | ✓ |
|
EtiketasPro.es
|
Std |
49 €
|
499 €/año |
↑ +4€ (+9%) | ↑ |
📋 Log de ejecución
07:00
Puppeteer lanzado (stealth mode, no-sandbox)
0.8s
07:00
Intercepción activada: image, font, stylesheet bloqueados
—
07:01
EtiquetoFacil.com — 9 registros
18s
07:01
NutriCalc.es — 7 registros
14s
07:02
LabelMaster.io — 12 registros
21s
07:03
FoodLabel360.com — 11 registros
22s
07:04
EtiketasPro.es — 8 registros
16s
07:04
Guardado: competidores_2026-06-16.json
0.1s
07:04
Browser cerrado. 3 cambios detectados
1m42s
⚡ Script generado — monitor_competidores.js
📄 monitor_competidores.js
Node.js · Puppeteer
// monitor_competidores.js — NutriBrand // Scraping semanal de precios de competidores import puppeteer from 'puppeteer-extra' import StealthPlugin from 'puppeteer-extra-plugin-stealth' import fs from 'fs/promises' puppeteer.use(StealthPlugin()) const TARGETS = [ { name: 'EtiquetoFacil', url: 'https://etiquetoFacil.com/pricing', selector: '.pricing-card' }, { name: 'NutriCalc', url: 'https://nutriCalc.es/planes', selector: '.plan-item' }, { name: 'LabelMaster', url: 'https://labelMaster.io/pricing', selector: '.tier-card' }, ] async function scrapeSite(page, target) { await page.setRequestInterception(true) page.on('request', req => { const blocked = ['image', 'font', 'stylesheet'] blocked.includes(req.resourceType()) ? req.abort() : req.continue() }) await page.goto(target.url, { waitUntil: 'networkidle2', timeout: 30000 }) return page.evaluate((sel) => { return [...document.querySelectorAll(sel)].map(card => ({ plan: card.querySelector('h3')?.textContent?.trim(), price: card.querySelector('.price')?.textContent?.trim(), features: [...card.querySelectorAll('.feature')] .map(f => f.textContent?.trim()), })) }, target.selector) } async function main() { const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-setuid-sandbox'] }) const results = {} for (const target of TARGETS) { const page = await browser.newPage() results[target.name] = await scrapeSite(page, target) await page.close() await new Promise(r => setTimeout(r, 2000)) } await browser.close() const date = new Date().toISOString().slice(0,10) await fs.writeFile( `/data/competidores_${date}.json`, JSON.stringify({ scrapedAt: date, results }, null, 2) ) console.log('✓ Scraping completado', date) } main().catch(console.error)
🔍 Features — Plan Pro comparado
Feature
Etiqueto
Nutri
Label
Food360
Etike
Etiquetas ilimitadas
✓
✗
✓
✓
✗
API REST
✓
✓
✓
±
✗
Exportar PDF
✓
✓
✓
✓
±
Soporte prioritario
✗
✓
✓
✗
✗
Multi-marca
±
✗
✓
✓
✗
Cálculo nutricional
✓
✓
✓
✓
✓
📊 Posicionamiento de precio/mes
NutriBrand queda posicionado en el percentil 53 — precio competitivo con mas features que EtiketasPro y NutriCalc.
💾 Output JSON — competidores_2026-06-16.json (extracto)
📄 competidores_2026-06-16.json
JSON · 47 registros
{
"scrapedAt": "2026-06-16",
"results": {
"EtiquetoFacil": [
{
"plan": "Starter",
"price": "29 €/mes",
"features": ["50 etiquetas/mes",
"Exportar PDF", "Soporte email"]
},
{
"plan": "Pro",
"price": "89 €/mes",
"features": ["Etiquetas ilimitadas",
"API REST", "Exportar PDF",
"Multi-marca (±)"]
}
],
"NutriCalc": [
{
"plan": "Básico",
"price": "35 €/mes",
"features": ["30 etiquetas/mes"]
},
{
"plan": "Pro",
"price": "69 €/mes",
"features": ["API REST",
"Exportar PDF", "Soporte prioritario"]
}
]
// ... 3 competidores más
}
}
🛠 Stack y configuración Puppeteer
Técnicas aplicadas en este pipeline de monitorización de competencia:
🥷
Stealth Mode
puppeteer-extra-plugin-stealth evita detección como bot en SPAs con Cloudflare/hCaptcha
🚫
Request Interception
Bloquea imágenes, fuentes y CSS — reduce tiempo de carga un 68% (1m42s vs ~5m sin bloquear)
⏳
networkidle2
Espera a que el SPA termine todas las llamadas AJAX antes de evaluar el DOM
⏱
Delay cortés (2s)
2 segundos entre peticiones para no saturar servidores y evitar rate-limiting
🐳
Docker-ready
--no-sandbox + --disable-setuid-sandbox para entornos Docker/CI sin privilegios de kernel
🔄
Cron semanal
0 7 * * 1 — cada lunes a las 7:00 AM con output en /data/competidores_YYYY-MM-DD.json