← Volver al inicio

Web Scraping para Monitoreo de Precios

Cómo funciona la tecnología detrás del monitoreo automático de precios de competidores en tiempo real

📅 Actualizado: Noviembre 2025 ⏱️ Lectura: 8 minutos 🔧 Nivel: Técnico

El web scraping es la tecnología fundamental que permite a Kompara monitorear miles de precios de competidores 24/7 sin intervención manual. En este artículo técnico, exploramos cómo funciona, qué desafíos enfrenta, y las mejores prácticas para implementarlo éticamente.

¿Qué es Web Scraping para Precios?

Web scraping (también conocido como web harvesting o web data extraction) es el proceso automatizado de extraer información estructurada de sitios web. En el contexto de monitoreo de precios, significa:

Arquitectura de Web Scraping

┌─────────────┐
│   Scheduler │  ← Programa visitas cada hora
└──────┬──────┘
       │
       ▼
┌─────────────────────────────────────┐
│      Scraper Distribuido            │
│  ┌────────┐  ┌────────┐  ┌────────┐│
│  │Worker 1│  │Worker 2│  │Worker 3││  ← Múltiples workers
│  └────────┘  └────────┘  └────────┘│     en paralelo
└──────────────┬──────────────────────┘
               │
               ▼
┌──────────────────────────────────────┐
│       Parser & Normalizer            │  ← Limpia y estructura
└──────────────┬───────────────────────┘     los datos
               │
               ▼
┌──────────────────────────────────────┐
│        Database (PostgreSQL)         │  ← Almacena histórico
└──────────────┬───────────────────────┘
               │
               ▼
┌──────────────────────────────────────┐
│      Analytics Engine + AI           │  ← Genera insights
└──────────────────────────────────────┘
            

Tecnologías y Stack Técnico

🐍 Python + Scrapy

Framework robusto para scraping a gran escala. Maneja concurrencia, reintentos automáticos y middleware personalizable.

🌐 Selenium / Playwright

Para sitios con JavaScript pesado. Simula navegadores reales para acceder a contenido dinámico.

☁️ Infraestructura Cloud

AWS Lambda o Google Cloud Functions para escalar workers según demanda.

🔄 Proxies Rotativos

Red de IPs distribuidas para evitar bloqueos y respetar rate limits.

💾 PostgreSQL + Redis

Base de datos principal y caché para consultas rápidas.

📊 Apache Airflow

Orquestación de pipelines y scheduling de tareas complejas.

Desafíos Técnicos del Web Scraping

1. Detección y Bloqueos Anti-Bot

Los sitios ecommerce modernos implementan múltiples capas de protección:

🛡️ Rate Limiting

Limita requests por IP/minuto. Solución: Proxies rotativos + delays inteligentes.

🤖 User-Agent Detection

Detecta scrapers por headers. Solución: Rotar user agents reales.

🧩 CAPTCHA

Desafíos visuales para humanos. Solución: Servicios de resolución + comportamiento human-like.

📱 Browser Fingerprinting

Identifica características únicas. Solución: Emulación completa de navegadores.

2. Contenido JavaScript Dinámico

Muchos sitios modernos cargan precios vía JavaScript después del render inicial:

// Ejemplo: Precio cargado dinámicamente
fetch('/api/product/12345/price')
  .then(res => res.json())
  .then(data => {
    document.getElementById('price').textContent = data.price;
  });

Solución en Kompara:

3. Estructura HTML Variable

Sitios cambian su HTML frecuentemente, rompiendo selectores:

💡 Solución: Selectores Inteligentes con Fallbacks

selectors = [
    'span.price-now',           # Selector principal
    'div.product-price span',   # Fallback 1
    '[data-price]',             # Fallback 2
    'meta[property="og:price"]' # Fallback 3
]

for selector in selectors:
    price = page.query_selector(selector)
    if price:
        return normalize_price(price.text)

Web Scraping Ético y Legal

⚠️ Consideraciones Legales Importantes

El web scraping existe en una zona gris legal. En Kompara seguimos estas directrices:

Principios del Ethical Scraping

✅ Mejores Prácticas que Implementamos

  1. Respeto al ancho de banda: Delays entre requests (2-5 segundos mínimo)
  2. Identificación clara: User-Agent descriptivo con contacto
  3. Horarios inteligentes: Mayor actividad durante horas valle del servidor
  4. Caché agresivo: No repetir requests innecesarios
  5. Detección de errores: Backoff exponencial ante errores 5xx

Normalización y Calidad de Datos

Extraer el precio es solo el primer paso. La normalización es crítica:

Desafíos de Normalización

💡 Pipeline de Normalización en Kompara

def normalize_price(raw_price: str) -> Optional[float]:
    # 1. Limpieza básica
    clean = raw_price.strip()
    clean = re.sub(r'[^\d.,]', '', clean)  # Remover símbolos
    
    # 2. Detección de formato regional
    if ',' in clean and '.' in clean:
        # Determinar si , es decimal o separador de miles
        if clean.rfind(',') > clean.rfind('.'):
            clean = clean.replace('.', '').replace(',', '.')
        else:
            clean = clean.replace(',', '')
    elif ',' in clean:
        # Podría ser decimal europeo
        if len(clean.split(',')[1]) == 2:
            clean = clean.replace(',', '.')
    
    # 3. Conversión
    try:
        return float(clean)
    except ValueError:
        logger.warning(f"Could not parse: {raw_price}")
        return None

Escalabilidad y Performance

Monitoreo de 10M+ Precios Diarios

Para operar a escala de Kompara, necesitamos:

⚡ Concurrencia Alta

100+ workers en paralelo con async/await y event loops

🔄 Smart Scheduling

Priorización dinámica: productos populares más frecuentes

💾 Caché Inteligente

Redis para evitar rescraping de páginas sin cambios

📊 Monitoreo en Tiempo Real

Métricas de éxito/fallo por worker y sitio

Detección de Cambios y Alertas

El scraping genera valor cuando detecta cambios importantes:

class PriceChangeDetector:
    def analyze_change(self, old_price, new_price, product_id):
        change_pct = ((new_price - old_price) / old_price) * 100
        
        # Cambio drástico (>10%)
        if abs(change_pct) > 10:
            self.trigger_alert(
                type='drastic_change',
                product_id=product_id,
                old=old_price,
                new=new_price,
                change_pct=change_pct
            )
        
        # Perdemos liderazgo
        if self.was_cheapest(product_id) and not self.is_cheapest(product_id):
            self.trigger_alert(
                type='leadership_lost',
                product_id=product_id,
                competitor=self.get_new_leader(product_id)
            )

Futuro: Machine Learning en Scraping

La siguiente evolución incluye:

¿Quieres ver nuestro scraping en acción?

Solicita una demo y te mostraremos cómo monitoreamos tu competencia en tiempo real.

Solicitar Demo Gratuita →

📚 Recursos Adicionales

Open Source Tools: