GamesScraping
El reto principal
Un scraper de cinco tiendas se rompe constantemente: basta con que una cambie una clase CSS para que su extractor devuelva vacío. Mantener a mano cinco juegos de selectores es una tarea sin final, y el usuario solo ve que "faltan precios" sin saber por qué.
Cuando un extractor devuelve vacío, en vez de fallar en silencio el sistema manda el fragmento de HTML a un modelo de OpenAI y le pide el selector correcto; si el selector propuesto extrae un precio válido, se guarda y sustituye al anterior. Fue clave acotar el gasto: la reparación solo se dispara ante un fallo real, nunca en cada consulta, y el resultado se cachea una hora para no volver a pagar por lo mismo.
Qué aprendí
Un modelo de lenguaje encaja bien justo donde el código determinista se rompe: entender HTML que cambia sin avisar. La disciplina está en usarlo como último recurso y validar siempre su respuesta antes de confiar en ella.
- Las cinco tiendas se consultan en paralelo con
Promise.allSettled: una que caiga no tumba al resto - Toda llamada a un modelo tiene que estar acotada por caché y por condición de disparo
- Nunca confiar en la salida del modelo: se valida contra el HTML real antes de guardarla
- Node.js
- Puppeteer
- OpenAI
- Caché
- VPS