6 min read

STOCK INSPECTOR: Datos públicos, decisiones privadas, inteligencia competitiva con Python y LLMs

STOCK INSPECTOR: Datos públicos, decisiones privadas, inteligencia competitiva con Python y LLMs

Todo empezó con un problema concreto de un cliente: quería saber cuánto estaba vendiendo su competencia para planificar mejor su stock y negociar con proveedores. Sin esa información, estaba tomando decisiones a ciegas.

Mi primer instinto fue el de siempre: un scraper tradicional en Python, selectores CSS, XPath, BeautifulSoup (lo de toda la vida). Funcionó, hasta que el mínimo cambio rompió todo.

El problema real del scraping tradicional

Cada vez que una tienda actualizaba su frontend, todo se rompía. Un cambio de clase CSS y la lógica dejaba de funcionar. No era un bug mío, era el problema fundamental del enfoque: estaba acoplando mi código a la estructura visual de sitios que no controlo y que cambian sin previo aviso.

Necesitaba algo que entendiera una página como lo haría una persona, sin importar cómo estuviera construida.

⚠️
Una aclaración importante antes de continuar

STOCK INSPECTOR trabaja exclusivamente con datos públicos. Todo lo que la herramienta analiza es exactamente lo que cualquier consumidor ve al navegar una tienda online: precios visibles, disponibilidad de productos y niveles de stock publicados.

No accede a bases de datos privadas, no extrae información de usuarios, ni interactua con sistemas internos de ninguna tienda.

Adicionalmente, la herramienta respeta el archivo robots.txt de cada sitio, que es el mecanismo estándar mediante el cual los sitios web indican qué rutas permiten o restringen el acceso automatizado. Si un sitio restringe el acceso a una ruta, STOCK INSPECTOR no la procesa.

Es el equivalente digital de recorrer tiendas anotando precios, pero automatizado y a escala.

El cambio de enfoque: delegar la extracción a un LLM

Gemini como LLM para la interpretación de información publica en páginas web tipo e-commerce

Integré Gemini API para que sea el modelo quien interprete el contenido público de cada página e identifique productos, precios y disponibilidad en lenguaje natural. Sin selectores rígidos, sin mantenimiento constante ante cambios de diseño.

El momento que cambió todo fue cuando le pasé el contenido de una página que había destrozado tres versiones anteriores de mi scraper, y Gemini extrajo correctamente cada producto con su precio y estado de stock.

Ahí entendí que había cambiado de paradigma: de extraer estructura a comprender contenido.

La lógica de estimación de ventas

Una vez resuelto el problema de extracción, vino el verdadero valor para el cliente. El pipeline en cada ejecución captura el stock público de cada producto en cada tienda monitoreada. La lógica es simple pero efectiva:

Stock de ayer - Stock de hoy = Ventas estimadas del día

Si el stock bajó, alguien compró. Esa delta acumulada en el tiempo genera una aproximación del volumen de ventas por producto y por tienda, construida enteramente sobre información que las propias tiendas publican abiertamente.

Dashboard en Grafana del total de productos vendidos por categoria (durante el rango de tiempo seleccionado)

Con esa información el cliente puede estimar qué productos se mueven más rápido en la competencia, cuándo recargan inventario, y usar eso como argumento concreto en sus negociaciones con proveedores. Pasa de negociar con intuición a negociar con datos.

Las decisiones técnicas detrás del stack

Gemini API para extracción inteligente. Elegí Gemini sobre otras opciones por una razón práctica: su consola de Google AI Studio ofrece visibilidad clara sobre el uso de la API, costos, errores y transacciones en tiempo real. Para un proyecto productivo con un cliente real, necesitaba saber exactamente qué estaba consumiendo, cuánto me costaba y dónde fallaba. Esa transparencia operacional fue determinante en la decisión, además de su capacidad para interpretar contenido web en lenguaje natural, eliminando la fragilidad del scraping tradicional basado en selectores.

Docker para portabilidad. Contenerizar desde el inicio me permite correr el sistema igual en cualquier entorno sin depender de configuraciones locales ni sorpresas en producción.

Hostinger + Easypanel en lugar de un cloud grande y Kubernetes. Soy honesto sobre esto: no necesitaba la complejidad operacional de AWS, GCP o Azure, ni la de Kubernetes para este proyecto. Me decidí por Hostinger porque me da un servidor con costo fijo y predecible, sin sorpresas en la factura de fin de mes. Encima de eso, Easypanel resuelve todo lo que necesito: despliegue de contenedores, gestión de variables de entorno y logs, sin overhead innecesario. Para un proyecto personal con un cliente real, mantener los costos controlados es tan importante como la arquitectura técnica. Es una decisión que repetiría de ser necesario.

Prometheus y Grafana para observabilidad de negocio. Esta fue una decisión de arquitectura desde el inicio, no un añadido posterior. En lugar de construir dashboards desde cero, elegí dos herramientas open source ampliamente adoptadas y probadas en producción que tienen toda la infraestructura de visualización resuelta. Prometheus exporta métricas de stock y estimaciones de ventas, y Grafana las expone en dashboards siempre disponibles para el cliente; esa decisión me ahorró semanas de desarrollo y me permitió enfocarme en la lógica de negocio en lugar de en la capa de presentación.

Cómo recibe el cliente la información

El cliente accede a dos cosas:

  • Una página estática que permite buscar y visualizar los reportes semanales y mensuales de ventas estimadas por producto y competidor.
Stock Inspector UI para búsqueda y visualización de reportes
  • Dashboard en Grafana donde puede ver en distintos panaeles interactivos la fluctuación de stock, precios y estimación de ventas en tiempo real. No necesita entender nada técnico, solo interpretar las gráficas y tomar decisiones comerciales con respaldo de datos.
Dashboard en grafana de la fluctuación de stock disponible en cada tienda (para el rango de tiempo seleccionado)

Seguridad

Me enfoqué en cubrir los vectores de riesgo más comunes sin "sobreingeniear" la solución:

Credenciales fuera del código. Todas las API keys y credenciales, incluyendo la clave de Gemini API, se gestionan como variables de entorno a través de Easypanel. Ninguna credencial vive en el código ni en el repositorio.

Acceso autenticado a Grafana y servidor Web estático. El dashboard y la UI de reportes no son públicos. El cliente accede con usuario y contraseña, evitando que cualquier persona con el link pueda ver los datos de inteligencia competitiva.

HTTPS en la página del cliente. La página estática donde el cliente consulta sus reportes corre sobre HTTPS, garantizando que la información en tránsito esté cifrada.

Aislamiento del contenedor. Easypanel gestiona el acceso al contenedor, añadiendo una capa de control sobre qué está expuesto y qué no.

No es una arquitectura de seguridad enterprise, pero es la correcta para el contexto: un sistema productivo, con un cliente real, donde los datos son confidenciales aunque de origen público.

Lo que haría diferente

Honestamente, poco. Las decisiones técnicas centrales funcionaron desde el inicio porque partieron de un razonamiento claro: usar herramientas probadas en lugar de reinventar la rueda.

Lo que sí haría diferente es documentar mejor las decisiones técnicas desde el inicio, precisamente para poder contarlas con más detalle después. Este post me costó más de lo que debería porque tuve que reconstruir el razonamiento detrás de cada decisión de memoria.

El resultado para el cliente

Hoy gracias a la herramienta mi cliente puede tomar decisiones respaldadas por inteligencia competitiva al tener tiene visibilidad diaria sobre las tendencias de stock y precios de su competencia.

Puede tomar decisiones con datos reales como por ejemplo:

  • Optimizar inventario: Sabe exactamente cuánto stock adquirir según el comportamiento real del mercado, eliminando sobrestock y quiebres
  • Negociar con poder: Llega a reuniones con proveedores armado con datos de ventas estimadas y tendencias, logrando mejores precios y condiciones
  • Anticiparse al mercado: Identifica tendencias emergentes antes que la competencia y ajusta su estrategia comercial en tiempo real
  • Maximizar campañas: Diseña promociones basadas en datos de demanda real, no en suposiciones
  • Monitorear precios: Detecta fluctuaciones de precios en el mercado y ajusta su posicionamiento estratégicamente

¿Qué sigue?

Estoy explorando LangChain para que el cliente pueda hacer preguntas sobre sus datos en lenguaje natural, en lugar de solo consultar reportes estáticos. La idea es que pueda preguntar cosas como ¿qué producto de la competencia tuvo mayor caída de stock esta semana? y obtener una respuesta directa conversacional.

STOCK INSPECTOR es el primer producto bajo mi marca personal RCODLAB, donde construyo herramientas que combinan Python, LLMs y observabilidad para resolver problemas reales de negocio.

Si estás construyendo algo similar, tienes preguntas sobre el stack, o simplemente quieres conversar sobre inteligencia competitiva con datos públicos, con gusto hablamos.