esedark
puesto de desarrollo usado para scraping y observabilidad

puppeteer / scraping / workers / observabilidad / pipelines

Puppeteer para scraping: arquitectura limpia para produccion

Puppeteer no es la parte dificil del scraping en produccion. Lo dificil es separar navegacion, extraccion, parsing, retries y almacenamiento para que una pagina rota no tumbe todo el pipeline.

Si usas Puppeteer para scraping, evita la trampa clasica: un script gigante que abre paginas, extrae campos, limpia strings, escribe en base de datos y manda alertas desde el mismo proceso. Ese estilo sirve para una demo y sale caro en produccion.

Un scraper de produccion deberia comportarse como un pequeno sistema distribuido. Necesita disciplina de colas, manejo estable del navegador, fronteras claras para parsers, evidencia en fallos y reglas explicitas sobre datos publicos, rate limits y almacenamiento. Sin esa estructura, el pipeline deja de ser fiable despues de unos pocos cambios en el DOM.

Que significa arquitectura limpia en scraping

Aqui arquitectura limpia no significa pureza academica. Significa que cada capa tiene una tarea y una superficie de fallo.

  • el scheduler decide que rastrear y cuando
  • el browser worker carga la pagina y captura evidencia
  • el extractor devuelve campos estructurados en bruto
  • el parser normaliza valores y valida supuestos
  • la capa de almacenamiento persiste solo registros validos

Esa separacion permite rehacer una pagina fallida sin relanzar todo el pipeline. Tambien facilita comparar ejecuciones de Puppeteer con otros sistemas de produccion como pipelines de IA donde la trazabilidad pesa mas que la herramienta llamativa.

Un layout practico para produccion

crawl-queue
  - target URL
  - crawl profile
  - retry count

browser-worker
  - launch context
  - navigate
  - wait strategy
  - screenshot en fallo

extractor
  - selectores CSS o XPath
  - fragmentos HTML

parser
  - normalizacion de campos
  - deteccion de duplicados
  - validacion de esquema

storage
  - escritura en base de datos
  - log de resultado
  - rastro de auditoria

Fijate en lo que falta: logica de negocio dentro de callbacks del navegador. El page worker deberia ser lo bastante simple como para cambiar selectores o reglas de parser sin reescribir el runtime entero.

Donde encaja bien Puppeteer

Puppeteer es util cuando la pagina depende de JavaScript, necesita render realista o requiere hooks de navegador para screenshots y debugging. No es automaticamente la respuesta correcta para cualquier fuente.

Si el origen expone una API estable o HTML simple, el navegador puede ser coste innecesario. Pero cuando importan renderizado, paginacion, lazy loading o UI dinamica, Puppeteer ofrece mejor inspeccion y mejor evidencia de recuperacion que un cliente HTTP ciego.

Errores comunes

El primer error es mezclar navegacion, parsing y persistencia en un solo archivo. Eso hace fragil la logica de retry porque los fallos parciales dejan estado ambiguo.

El segundo error es depender de un selector por campo sin capturar evidencia. Cuando cambia el DOM, el worker deberia guardar screenshot, URL, version de selectores y el fragmento HTML que fallo.

El tercer error es ignorar las fronteras sobre datos publicos. Aunque la informacion sea visible publicamente, el scraping sigue necesitando objetivo claro, ritmo de peticiones razonable, revision de fuente y disciplina de retencion.

El cuarto error es reintentar todo igual. Un timeout, un fallo al arrancar el navegador y un schema mismatch son clases distintas de error y no deberian compartir la misma logica de backoff.

El quinto error es tratar la rotacion de proxies como arquitectura. La red importa, pero un scraper flojo no se vuelve fuerte solo por cambiar mas veces de IP. La capa de proxies sigue necesitando comportamiento predecible.

Checklist practico para scraping con Puppeteer en produccion

  • los jobs entran en cola con clase de retry y perfil de rastreo
  • los browser workers estan aislados para fallar por separado
  • screenshots y HTML de evidencia se guardan en errores de extraccion
  • las reglas del parser se versionan aparte del codigo de navegacion
  • la deteccion de duplicados corre antes de escribir en base de datos
  • el uso de datos publicos esta documentado y con rate limit cuando toca
  • los selectores tienen estrategia de fallback para cambios comunes del DOM
  • el operador puede relanzar un job sin rehacer todo el pipeline
  • latencia, fallo y exito de parseo son visibles en logs
  • existe revision manual para registros valiosos o ambiguos

Trazabilidad y ejemplo de evidencia

El equipo deberia poder explicar por que existe un registro, de donde salio y que vio el scraper cuando lo capturo.

{
  "job_id": "crawl-8821",
  "url": "https://example.com/listing/42",
  "selector_profile": "listing-v4",
  "result": "schema_mismatch",
  "screenshot": "s3://scraping/evidence/crawl-8821.png"
}

Esa evidencia es la diferencia entre un scraper que evoluciona y un scraper que se convierte en incendio semanal.

Cuando tiene sentido contratar a alguien tecnico

Si tu equipo ya tiene scripts recogiendo datos pero el pipeline se rompe por cambios de layout, duplicados o limites legales poco claros, el problema ya no es "como usamos Puppeteer". El problema es ingenieria de produccion.

Ahi es donde ayuda especializada desde servicios tecnicos o soporte de arquitectura via CTO tecnico fractional tiene sentido. El trabajo es definir fronteras del scraper, recogida de evidencia, estrategia de colas y limites de cumplimiento realistas antes de que el pipeline se convierta en caos.

Conclusion

Puppeteer para scraping funciona bien en produccion cuando el navegador es solo una capa dentro de un pipeline disciplinado. La automatizacion del navegador por si sola no es arquitectura.

Si quieres un scraper que aguante carga real, construye alrededor de aislamiento de workers, versionado de parsers, trazabilidad, fronteras sobre datos publicos y retries estables. Si necesitas auditar o redisenar esa stack, usa contacto y trae las fuentes actuales, los patrones de fallo y el camino de almacenamiento.