n8n+DiffHook

n8n + Puppeteer — scraping Chrome headless sin la operativa

DiffHook maneja Puppeteer por ti, espera a que el DOM se asiente, difiere el resultado frente al snapshot anterior y entrega los cambios a n8n por un webhook firmado. Sin binario de Chromium, sin imagen Docker, sin reiniciar-en-OOM.

Alojar Puppeteer dentro de un despliegue de n8n es la típica trampa: el binario de Chromium infla el tamaño de la imagen, los workers pierden memoria tras unos cientos de ejecuciones y cualquier cambio de página rompe el script de selectores a las 3 de la mañana. DiffHook lleva el navegador a una flota gestionada. Describes una vez qué vigilar y n8n solo ve el diff post-render — nunca los crashes del navegador, nunca la latencia de arranque en frío, nunca el drift de versión de los plugins stealth.

n8n

El hub completo de n8n + DiffHook

Todas las recetas, plantillas y precios de n8n en un solo lugar.

Flujo

Conecta diffs renderizados por Puppeteer a n8n en 5 pasos

El navegador corre de nuestro lado. n8n solo ve cambios — sin arranques en frío, sin procesos Chromium zombis.

01

Expón un webhook n8n

Añade un nodo disparador Webhook a un flujo n8n nuevo o existente y anota la URL de producción. Ese es el destino al que DiffHook hará POST cuando el DOM renderizado cambie.

02

Elige html_rendered y el motor Puppeteer

Pon type a html_rendered y render.engine a puppeteer. Añade wait_for_selector o wait_until: networkidle para que DiffHook solo tome el snapshot cuando la página haya terminado de cargar JS y datos.

03

Apunta al elemento correcto con un selector

DiffHook aplica el selector CSS al DOM renderizado. Un selector apretado (una ficha de producto concreta, una fila de precio, un banner de estado) mantiene el diff enfocado y hace que n8n solo dispare ante la señal que importa.

04

Crea el monitor

POST a /v1/monitors con la URL, la config de render, el selector, el intervalo y una entrega webhook hacia tu URL de n8n. DiffHook planifica las ejecuciones de Puppeteer — no tienes nada con forma de navegador.

05

Reacciona al cambio en n8n

Cuando la salida del selector renderizado cambia, el nodo Webhook de n8n dispara con un cuerpo JSON firmado: previous_value, current_value, url, detected_at. Verifica el HMAC y enruta el diff a los pasos posteriores.

Ejemplo de API

Monitor renderizado por Puppeteer, un POST

render.engine elige el navegador. Puppeteer es un buen valor por defecto para sitios que examinan expresamente huellas de la familia Chrome.

POST /v1/monitors
POST https://api.diffhook.com/v1/monitors
Authorization: Bearer $DIFFHOOK_API_KEY
Content-Type: application/json

{
  "type": "html_rendered",
  "url": "https://spa.example.com/pricing",
  "render": { "engine": "puppeteer", "wait_for_selector": "[data-ready]" },
  "css_selector": "main .plan",
  "interval_seconds": 600,
  "deliveries": [
    {
      "type": "webhook",
      "url": "https://n8n.yourdomain.com/webhook/spa-pricing"
    }
  ]
}

Flujo importable

Arranca con un flujo n8n ya hecho

La plantilla verifica el HMAC, parsea el HTML renderizado por Puppeteer con HTML Extract y envía filas estructuradas a una base Notion. Edita el nodo de destino a tu gusto.

FAQ

n8n Puppeteer — preguntas frecuentes

Puppeteer vs Playwright — ¿qué motor elijo?
Son intercambiables en ~95 % de los sitios. Elige Puppeteer cuando el objetivo examine explícitamente features de Chrome (llamadas al Chrome DevTools Protocol, APIs de navegador propias de Chrome) o cuando encuentres una página que se comporta distinto bajo cada uno. Elige Playwright cuando necesites control más fino sobre los waits o cuando el sitio trabaje mejor con el perfil por defecto de Playwright. Cambiar entre ellos es modificar una línea en la config del monitor.
¿Tengo que correr mi propio Chromium en algún sitio?
No. DiffHook hospeda la flota de Chromium, la mantiene al día y recicla los workers entre ejecuciones. Tú solo envías el POST. Esta es la razón principal por la que este patrón le gana a «n8n + nodo Puppeteer»: sin binario que instalar, sin imagen que mantener, sin alerta de worker caído que triar.
¿Cómo trata DiffHook las páginas que cargan contenido al hacer scroll?
Dos opciones. Puedes poner scroll_to_bottom: true para que Puppeteer haga auto-scroll antes del snapshot, o dar un wait_for_selector que solo aparece cuando el contenido lazy-loadeado se monta. Ambas funcionan para listas de productos en scroll infinito, changelogs cargados de forma perezosa y widgets basados en intersection-observer.
¿Puedo pasar cookies de auth a Puppeteer?
Sí. Cada monitor tiene un array cookies y un mapa request_headers, los dos almacenados cifrados. Útil cuando quieres vigilar la vista autenticada de una app — un panel tras login, una página SaaS por tenant. Rota o revoca las credenciales desde el panel cuando quieras.
¿Cuál es la cadencia mínima en monitores renderizados?
Los mismos mínimos que en monitores estáticos — 60 segundos en planes de pago, horaria en gratis. El navegador hace cada comprobación más cara en consumo del plan, pero el panel muestra siempre el coste efectivo por monitor, así que no hay precipicios.

Flujos relacionados

También geniales con DiffHook

Deja de distribuir Chromium con tu imagen de n8n

Flota Puppeteer gestionada, webhooks firmados con HMAC, comprobaciones cada 60 segundos, plan gratuito. Despliega a producción en minutos.