Qué es
Centinela es un sistema de monitoreo automático que vigila productos en tiendas online y avisa al instante cuando pasa algo importante: bajó de precio, volvió a haber stock o cambió de estado.
Está hecho desde cero, sin librerías mágicas: cada pieza (el scraper, el sistema de alertas, la base de datos y el panel) fue diseñada y escrita para este proyecto.
Por qué lo hice
Perder una oferta por no revisar la página, o enterarse tarde de que un producto volvió a estar disponible, se siente como dejar plata en la mesa. Un humano no puede revisar 20 tiendas cada 10 minutos. Una máquina sí, y no se aburre.
Cómo está construido
Centinela
├── scraper/ # Obtención de datos de cada tienda
│ └── tiendas/ # Un módulo por tienda, fácil de agregar
├── core/ # Lógica: detección de cambios, dedupe
├── alertas/ # WhatsApp + Telegram
├── store/ # SQLite: historial de precios y stock
└── web/ # Panel minimalista para ver todo
El scraper
Cada tienda tiene su propio módulo con selectores dedicados. El núcleo común se encarga de la parte difícil:
# core/scraper.py (resumido)
def vigilar(tienda, url):
dom = descargar(url) # respeta robots, retry + backoff
precio = tienda.precio(dom) # cada tienda define sus selectores
stock = tienda.stock(dom)
return Producto(url=url, precio=precio, stock=stock)
Lo importante es lo que no se ve en el código:
- Anti-detección: rotación de User-Agent, esperas aleatorias, sesiones persistentes. No le pega a las tiendas como un loco.
- Tolerancia a cambios: si una tienda cambia el diseño y el selector no encuentra nada, en vez de romper, avisa “estructura cambiada” y sigue con las demás.
- Retries con backoff exponencial: si la tienda está caída, espera y reintenta en vez de fallar.
Detección de cambios
El corazón del sistema es comparar el estado actual contra el histórico:
def detectar(actual, anterior):
cambios = []
if anterior.precio and actual.precio and actual.precio < anterior.precio:
cambios.append(ALERTA_BAJA_PRECIO)
if not anterior.stock and actual.stock:
cambios.append(ALERTA_VOLVIO_STOCK)
return cambios
Con dedupe: si ya te avisé de esa baja de precio, no te vuelvo a molestar con la misma noticia cada 10 minutos.
Alertas en segundos
Las notificaciones salen por Telegram (gratis y simple) y WhatsApp (vía WhatsApp Business API). Un mensaje directo al celular:
📉 PS5 Slim — MercadoLibre Bajó de $1.299.999 a $1.049.999 (−19%) Hace 2 min https://…
Infraestructura
- Corre en un servidor VPS con un cron que dispara cada 10 minutos.
- SQLite guarda el historial de cada producto (precio + stock + timestamp).
- Logs estructurados para saber exactamente qué pasó si algo sale mal.
- Prometheus-style métricas básicas: productos vigilados, tiendas con error, alertas enviadas.
Resultados
- 24/7 sin intervención humana: solo hay que tocar el server para actualizar el código.
- Alertas en menos de 10 minutos desde que el cambio ocurre.
- Un humano tardaría horas revisando lo que este bot hace solo.
Lo que aprendí
- Scraping de verdad es 20% código y 80% tolerancia a fallos.
- Diseñar para que “una tienda cambie de diseño” no tumbe todo el sistema.
- Las alertas por Telegram + WhatsApp son el canal más efectivo que probé.