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:
- Visitación automatizada de páginas de productos de competidores
- Extracción de datos como precio, disponibilidad, descripciones
- Normalización y almacenamiento de información en bases de datos
- Análisis y comparación para generar insights accionables
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:
- Uso de headless browsers (Playwright/Puppeteer)
- Espera inteligente hasta que elementos críticos estén cargados
- Interceptación de requests API cuando es posible
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:
- ✓ Respetamos
robots.txty meta tags - ✓ Implementamos rate limiting conservador
- ✓ Solo extraemos datos públicamente disponibles
- ✓ No accedemos a áreas que requieren login
- ✓ Monitoreamos solo precios y disponibilidad pública
- ✓ No revendemos ni republicamos datos scraped
Principios del Ethical Scraping
✅ Mejores Prácticas que Implementamos
- Respeto al ancho de banda: Delays entre requests (2-5 segundos mínimo)
- Identificación clara: User-Agent descriptivo con contacto
- Horarios inteligentes: Mayor actividad durante horas valle del servidor
- Caché agresivo: No repetir requests innecesarios
- 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
- Formatos diversos: "$1,234.56", "1.234,56 €", "R$ 1.234,56"
- Información adicional: "Antes: $100 Ahora: $80"
- Descuentos y promociones: "50% OFF", "2x1"
- Disponibilidad: "Sin stock", "Consultar", "Preventa"
💡 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:
- Auto-adaptación de selectores: ML para detectar precios sin selectores manuales
- Detección de anomalías: Identificar datos incorrectos automáticamente
- Predicción de cambios: Anticipar cuándo un competidor cambiará precios
- Priorización inteligente: Decidir qué productos scrappear con más frecuencia
¿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:
- Scrapy Framework - Framework Python para scraping
- Playwright - Automatización de navegadores
- Beautiful Soup - Parser de HTML/XML