El problema
Se me pasaban las bajadas de precio en productos que quería porque revisar manualmente era tedioso, y la mayoría de rastreadores existentes eran extensiones de navegador pesadas en las que no confiaba con mis datos. Quería un servicio pequeño y autoalojado que solo vigilara una URL y me avisara.
Rol e impacto
- Proyecto individual, enfocado en backend.
- Rastrea más de 40 URLs de producto en 5 tiendas distintas.
- Detectó una bajada de precio del 35% a los 10 minutos de haber ocurrido.
- La cola procesa ~200 jobs de scraping por hora con reintento y backoff automáticos, cero reinicios manuales en 3 meses de uptime.
Decisiones técnicas y desafíos
Cada tienda renderiza los precios distinto, y algunas requieren ejecutar JavaScript. Comparé peticiones HTTP simples con cheerio contra un navegador headless para cada job.
Terminé usando Playwright solo para los sitios que lo requieren, cayendo a un fetch HTTP ligero en los demás casos, porque correr un navegador completo en cada job habría hecho la cola de trabajo demasiado lenta y costosa en recursos.
Un scrape con fallos podía reportar un cambio de precio falso y saturar al usuario con alertas. Evalué notificar ante cualquier cambio contra requerir confirmación en dos lecturas consecutivas.
Elegí requerir dos lecturas consecutivas coincidentes antes de disparar una notificación, ya que eliminó casi todos los falsos positivos causados por problemas transitorios de renderizado.
Stack detallado
| Capa | Tecnología | Por qué |
|---|---|---|
| Scraping | Playwright, cheerio | Maneja tanto páginas con mucho JS como páginas estáticas |
| Cola | BullMQ (Redis) | Reintento y backoff confiables para jobs de scraping a escala |
| Avisos | Resend | Correo transaccional simple para alertas de bajada de precio |
Galería
Qué haría diferente
Agregaría rotación de proxies desde el inicio en vez de sumarla después. Algunas tiendas empezaron a limitar el scraper por IP cuando el número de URLs rastreadas superó cierto volumen, algo que el scraping con una sola IP no puede evitar.