Proyecto · 12 de agosto de 2026

Centinela — Vigilante de precios y stock 24/7

Un bot hecho desde cero que vigila tiendas online, detecta bajas de precio y reposiciones de stock, y te avisa en segundos por WhatsApp y Telegram. Corriendo 24/7 en la nube.

pythonscrapingautomatizaciontelegrambot

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é.
← Todos los proyectos