🐾

NutriPaw — Inteligencia Competitiva

Pipeline ETL · Web Scraper con deduplicación y carga en Supabase

Ejecución: 2026-06-16 06:02:17 UTC
Frecuencia: diaria · cron 0 6 * * *
Pipeline completado
Productos scrapeados
142
3 competidores · 5 páginas
+12 nuevos hoy
Cargados en Supabase
138
4 duplicados descartados
97.2% tasa de éxito
Cambios de precio
7
vs. ejecución anterior
ZooPetFood bajó 3 SKUs
Tiempo total ETL
48s
Extract 31s · Load 17s
-12s vs. media
Pipeline ETL — Estado de la ejecución
1
Fetch
BeautifulSoup + Playwright + Proxy
31.2s · 142 páginas
2
Extract
CSS selectors · 9 campos
0.8s · 142 items
3
Transform
Normalizar precios · Deduplicar
0.3s · 4 dupes dropped
4
Validate
Required fields · Price range
0.1s · 138 válidos
5
Load
Supabase upsert · 2 batches
16.8s · 138 upserted
6
Alert
Slack · 7 price changes
0.4s · notif enviada
ZooPetFood.es — Top Productos
zoopetfood.es/perros/pienso
Static HTML
Producto Precio Valoración Stock
Royal Canin Medium Adult 15kg
Royal Canin
64,90 €
4,33 €/kg
★★★★☆
4.2 (312)
En stock
Orijen Original Dog 11.4kg
Orijen
89,50 €
7,85 €/kg
★★★★★
4.8 (87)
En stock
Acana Pacifica 17kg
Acana
79,99 €
4,71 €/kg
★★★★☆
4.5 (203)
En stock
Brit Care Grain-Free 12kg
Brit
42,30 €
3,53 €/kg
★★★★☆
4.1 (156)
Agotado
Hill's Science Plan Adult L 14kg
Hill's
71,20 €
5,09 €/kg
★★★★☆
4.3 (445)
En stock
NaturalMascota.com — Top Productos
naturalmascota.com/alimentos/perros
JS / Playwright
Producto Precio Valoración Stock
Taste of the Wild High Prairie 12kg
Taste of the Wild
55,90 €
4,66 €/kg
★★★★★
4.7 (521)
En stock
Purizon Grain-Free Adult 12kg
Purizon
39,95 €
3,33 €/kg
★★★★☆
4.0 (98)
En stock
Farmina N&D Grain Free 10kg
Farmina
93,20 €
9,32 €/kg
★★★★★
4.9 (44)
En stock
Carnilove Adult Salmon 12kg
Carnilove
48,70 €
4,06 €/kg
★★★★☆
4.2 (167)
En stock
Vet's Kitchen Fresh Adult 6kg
Vet's Kitchen
29,80 €
4,97 €/kg
★★★☆☆
3.8 (22)
Agotado
PatasMilanesas.es — Top Productos
patasmilanesas.es/catalogo?cat=perros · Bright Data Proxy
Bot-Protected
Producto Precio Valoración Stock
Josera Dog Lamm & Reis 15kg
Josera
47,50 €
3,17 €/kg
★★★★☆
4.1 (89)
En stock
Eukanuba Adult Medium 15kg
Eukanuba
58,90 €
3,93 €/kg
★★★★☆
4.3 (274)
En stock
Pro Plan Sensitive Skin 14kg
Purina Pro Plan
62,45 €
4,46 €/kg
★★★★★
4.6 (388)
En stock
NutriPaw Immunity+ 10kg ⬅ nuestro
NutriPaw
54,90 €
5,49 €/kg
★★★★★
4.8 (61)
En stock
Butcher's Original Adult 12kg
Butcher's
36,20 €
3,02 €/kg
★★★☆☆
3.7 (51)
En stock
Análisis de precios por kg — Segmento Premium
Precio medio competencia
5,21 €
€/kg · segmento premium
Precio medio NutriPaw
5,49 €
€/kg · +5.4% vs media
Oportunidad de ajuste
-0,28€
€/kg para igualar media
ZooPetFood (media €/kg) 4,87 €
NaturalMascota (media €/kg) 5,27 €
PatasMilanesas (media €/kg) 5,49 €
NutriPaw Immunity+ (€/kg) 5,49 €
Cambios de precio detectados hoy
▼ ZooPetFood · Royal Canin Medium 15kg: 67,90€64,90€ (-4.4%)
▼ ZooPetFood · Hill's Science Plan 14kg: 74,50€71,20€ (-4.4%)
▲ NaturalMascota · Farmina N&D 10kg: 88,00€93,20€ (+5.9%)
= PatasMilanesas · Sin cambios (4 SKUs)
Script generado — scraper_nutripaw.py
scraper_nutripaw.py
# scraper_nutripaw.py — Generado por CULTIVA IA · Skill: scraper-web-extraccion-datos
# NutriPaw España · Monitorización de precios competidores · v1.0.0

import requests, csv, json, hashlib, time
from datetime import datetime
from bs4 import BeautifulSoup
from playwright.sync_api import sync_playwright
from supabase import create_client

TARGETS = [
    {"name": "ZooPetFood",    "url": "https://zoopetfood.es/perros/pienso",     "mode": "static"},
    {"name": "NaturalMascota", "url": "https://naturalmascota.com/alimentos/perros", "mode": "js"},
    {"name": "PatasMilanesas", "url": "https://patasmilanesas.es/catalogo?cat=perros", "mode": "proxy"},
]

SELECTORS = {
    "container": "div.product-card",
    "fields": {
        "nombre": "h3.product-title", "marca": "span.brand",
        "precio_eur": "span.price",       "precio_kg": "span.price-per-kg",
        "puntuacion": "span.rating-value", "num_reviews": "span.review-count",
        "url_producto": "a.product-link",   "disponibilidad": "span.stock-status",
    }
}

def content_hash(item):
    key = f"{item.get('nombre','')}|{item.get('url_producto','')}"
    return hashlib.md5(key.encode()).hexdigest()

def transform(raw_items, source):
    clean = []
    seen = set()
    for item in raw_items:
        if not item.get("nombre") or not item.get("precio_eur"): continue
        price_str = item["precio_eur"].replace("€","").replace(",",".").strip()
        try: price_cents = int(float(price_str) * 100)
        except ValueError: continue
        h = content_hash(item)
        if h in seen: continue
        seen.add(h)
        clean.append({**item, "price_cents": price_cents, "source": source,
                       "content_hash": h, "scraped_at": datetime.utcnow().isoformat()})
    return clean

def load_supabase(products, url, key):
    client = create_client(url, key)
    for i in range(0, len(products), 100):
        client.table("competitor_products").upsert(
            products[i:i+100], on_conflict="content_hash"
        ).execute()
    print(f"  ✓ {len(products)} registros cargados en Supabase")
Log de ejecución — 2026-06-16 06:02:17 UTC
06:02:00[INFO] Pipeline iniciado · NutriPaw Inteligencia Competitiva v1.0.0
06:02:01[OK] Target 1/3: ZooPetFood · mode=static · robots.txt OK
06:02:12[OK] ZooPetFood scraped: 48 productos · 3 páginas · 11.2s
06:02:13[INFO] Target 2/3: NaturalMascota · mode=js · Playwright headless
06:02:24[OK] NaturalMascota scraped: 52 productos · 4 páginas · 10.8s
06:02:25[WARN] PatasMilanesas: 403 en intento directo · fallback a Bright Data Proxy
06:02:31[OK] PatasMilanesas scraped via proxy: 42 productos · 1 página · 9.2s · 0.12 MB
06:02:31[INFO] Transform: 142 raw items · normalizando precios · deduplicando...
06:02:31[OK] Transform completado: 138 items limpios · 4 duplicados descartados
06:02:32[INFO] Load: Supabase project=nutripaw-analytics · table=competitor_products
06:02:40[OK] Batch 1/2 cargado: 100 registros · upserted
06:02:48[OK] Batch 2/2 cargado: 38 registros · upserted
06:02:48[WARN] 7 cambios de precio detectados vs. ejecución anterior
06:02:48[OK] Notificación Slack enviada → #nutripaw-pricing · 7 price changes
06:02:48[OK] Pipeline completado en 48.3s · 138/142 registros cargados (97.2%)