Uso de puppeteer-humanize para Web Scraping: Guía 2025

Explore por qué puppeteer-humanize mejora el raspado web imitando acciones humanas para eludir el análisis del comportamiento del usuario.
12 min de lectura
Puppeteer humanize web scraping

En este artículo aprenderá:

  • Por qué vanilla Puppeteer no es suficiente contra el análisis del comportamiento del usuario.
  • Qué es el titiritero-humanizador y cómo ayuda a superar esas limitaciones.
  • Cómo utilizarlo para el web scraping en una sección tutorial paso a paso.
  • Los retos pendientes con este enfoque para raspar datos web.

Sumerjámonos.

Análisis del comportamiento de los usuarios: Por qué el titiritero estándar se queda corto

El análisis del comportamiento del usuario (UBA) es el proceso de recopilación y análisis de datos sobre cómo interactúan los usuarios con una página web. En el web scraping, su objetivo principal es detectar comportamientos anómalos o sospechosos para identificar bots.

Esta sofisticada técnica anti-bot está ganando popularidad. La razón es que los bots modernos con IA evolucionan continuamente para parecerse más a los humanos. Por lo tanto, los métodos tradicionales de detección de bots pueden dejar de ser eficaces contra ellos.

Para contrarrestar la UBA, algunas bibliotecas de automatización intentan imitar el comportamiento humano de forma más realista. Por ejemplo, simulan los movimientos del ratón utilizando heurística o incluso aprendizaje automático. Sin embargo, en la mayoría de los casos, la mecanografía sigue pareciendo robótica, lo cual es un problema.

Ahora, suponga que su script Puppeteer necesita rellenar un formulario. Incluso si añade un pequeño retardo entre las pulsaciones de teclas utilizando la función type(), esa interacción no parecería natural.

Tomemos como ejemplo el formulario de acceso de Quotes to Scrape:

import puppeteer from "puppeteer";

(async () => {
  // set up a new browser instance in headful mode
  const browser = await puppeteer.launch({
    headless: false, // set to false so you can watch the interaction
    defaultViewport: null,
  });
  const page = await browser.newPage();

  // connect to the target page
  await page.goto("https://quotes.toscrape.com/login");

  // simulate typing with a delay of 200ms between each character
  await page.type("input[name=\"username\"]", "username", { delay: 200 });
  await page.type("input[name=\"password\"]", "password", { delay: 200 });

  // ...

  // close the browser and release its resources
  await browser.close();
})();

Así sería la interacción:

Interacción con el bot Puppeteer

Aunque el enfoque anterior es más realista que establecer directamente el valor de los campos de entrada, sigue sin parecer humano. El problema es que la escritura parece demasiado fluida, coherente y sin errores. Pregúntese: ¿qué usuario real teclea todos los caracteres exactamente en el mismo intervalo, sin vacilaciones ni errores tipográficos?

Como puede imaginar, los sistemas UBA avanzados pueden detectar fácilmente este tipo de scripts. Aquí es donde entran en juego herramientas como puppeteer-humanize.

¿Qué es titiritero-humanizar?

puppeteer-humanize es una librería Node.js que hace la automatización de Puppeteer más humana, específicamente cuando se interactúa con campos de texto. Ayuda a evitar los métodos comunes de detección de bots que analizan el comportamiento del usuario, que a menudo marcan acciones poco realistas o demasiado precisas.

Para lograrlo, puppeteer-humanize inyecta imperfecciones realistas en las interacciones regulares de Puppeteer mediante:

  1. Simulación de errores tipográficos.
  2. Imitar el uso de la tecla de retroceso para corregir esos errores.
  3. Reescribir texto borrado con retrasos aleatorios.
  4. Introducir retardos aleatorios entre pulsaciones para variar la velocidad de escritura.

Esto hace que la mecanografía automatizada parezca más natural y menos mecánica. Sin embargo, es importante tener en cuenta que la biblioteca sólo se centra en humanizar el comportamiento de escritura y las entradas de formularios. Por lo tanto, no es una solución completa contra los robots.

También hay que tener en cuenta que su último commit fue en 2021, y que todavía no soporta características avanzadas como la simulación del movimiento del ratón basada en GAN. Por lo tanto, su alcance se limita únicamente al comportamiento de escritura.

Cómo utilizar puppeteer-humanize para Web Scraping

Sigue los siguientes pasos para aprender a utilizar puppeteer-humanize para construir un bot de scraping más parecido a un humano. Esto reduce las posibilidades de ser detectado por los sistemas UBA, especialmente cuando tu script necesita escribir datos en formularios.

El objetivo será el formulario de acceso a Quotes to Scrape:

Este ejemplo servirá únicamente para demostrar cómo simular el rellenado realista de formularios. En escenarios reales de scraping, evite el scraping de contenido detrás de formularios de inicio de sesión a menos que tenga permiso explícito, ya que puede plantear problemas legales.

Veamos ahora cómo utilizar puppeteer-humanize para el web scraping.

Paso nº 1: Configuración del proyecto

Si aún no tienes un proyecto Node.js configurado, puedes crear uno en tu carpeta de proyecto con npm init:

npm init -y

El comando anterior generará un archivo package.json en el directorio del proyecto. Dentro de la carpeta del proyecto, cree un archivo script.js, que es donde colocará su lógica de raspado de JavaScript:

your-project-folder/
├── package.json
└── script.js

A continuación, abra la carpeta en su IDE de JavaScript favorito. Visual Studio Code funcionará perfectamente.

En su IDE, modifique el archivo package.json para incluir la siguiente línea:

"type": "module"

Esto configura tu proyecto para usar ESM(Módulos ECMAScript), que generalmente se recomienda para proyectos Node.js modernos sobre el formato estándar CommonJS.

¡Genial! Ya está listo para aprovechar las ventajas de puppeteer-humanize para simular interacciones realistas en sus scripts de scraping.

Paso 2: Instalación y puesta en marcha de puppeteer-humanize

Aunque puppeteer-humanize era originalmente un plugin para Puppeteer Extra, este ya no es el caso. Por lo tanto, para utilizarlo, sólo tiene que instalar:

Instale ambos con el siguiente comando:

npm install @forad/puppeteer-humanize puppeteer

A continuación, abre tu archivo script.js e inicializa un script básico de Puppeteer como este:

import puppeteer from "puppeteer";

(async () => {
  // set up a new browser instance in headful mode
  const browser = await puppeteer.launch({
    headless: false, // set to false so you can watch the interaction
    defaultViewport: null,
  });
  const page = await browser.newPage();

  // ...

  // close the browser and release its resources
  await browser.close();
})();

¡Fantástico! Ya puede empezar a implementar sus interacciones de raspado con apariencia humana.

Paso 3: Conectarse a la página de destino y seleccionar los elementos de entrada

Utilice Puppeteer para navegar a la página de destino:

await page.goto("https://quotes.toscrape.com/login");

Ahora, abra la misma página en su navegador, haga clic con el botón derecho en el formulario de inicio de sesión y seleccione “Inspeccionar” para examinar los elementos del formulario:

Observará que el formulario contiene:

  • Un campo de entrada de nombre de usuario que puede seleccionar con input[name="nombredeusuario"].
  • Un campo de entrada de contraseña que puede seleccionar con input[name="contraseña"].

Para seleccionar estos elementos de entrada en su script, utilice el método $() de Puppeteer:

const usernameInput = await page.$("input[name=\"username\"]");
const passwordInput = await page.$("input[name=\"password\"]");

⚠️ Importante: puppeteer-humanize no funciona con localizadores. Eso significa que debes usar $() o $$() para recuperar los manejadores de los elementos directamente.

Si ambas entradas se encuentran en la página, prepárese para interactuar con ellas como lo haría un usuario real:

if (usernameInput && passwordInput) {
  // interaction...
}

¡Maravilloso! Es hora de rellenar esas entradas como si fueras un usuario real.

Paso nº 4: Configurar la función de mecanografía del titiritero-humanizar

En primer lugar, importa la función typeInto de puppeteer-humanize:

import { typeInto } from "@forad/puppeteer-humanize";

A continuación, utilícelo para configurar una interacción de cumplimentación de formularios similar a la humana, como se muestra a continuación:

const typingConfig = {
  mistakes: {
    chance: 10, // 10% chance of introducing a typo that gets corrected
    delay: {
      min: 100, // minimum delay before correcting a mistake (in ms)
      max: 500, // maximum delay before correcting a mistake (in ms)
    },
  },
  delays: {
    all: {
      chance: 100, // 100% chance to add delay between each keystroke
      min: 100, // minimum delay between characters (in ms)
      max: 200, // maximum delay between characters (in ms)
    },
  },
};

// strings to fill into the input elements
const username = "username";
const password = "password";

// apply the human-like typing logic to both inputs
await typeInto(usernameInput, username, typingConfig);
await typeInto(passwordInput, password, typingConfig);

La configuración tipográfica anterior:

  • De vez en cuando introduce erratas, seguidas de correcciones realistas, como haría un usuario real.
  • Añade retardos aleatorios entre cada pulsación, imitando la variación natural de la velocidad de escritura.

Ese comportamiento hace que su automatización parezca mucho más humana, limitando las posibilidades de detección por parte de las tecnologías UBA.

¡Estupendo! Tu script Titiritero debería ahora comportarse mucho más como un humano real.

Paso 5: Rellene el formulario y prepárese para el Web Scraping

Ahora puede rellenar el formulario utilizando el código que figura a continuación:

const submitButton = page.locator("input[type=\"submit\"]");
await submitButton.click();

Ten en cuenta que el formulario de acceso en Quotes to Scrape es sólo una página de prueba. En detalle, puede acceder a ella con las credenciales de nombre de usuario y contraseña. Una vez que envíe el formulario, se le redirigirá a una página que contiene los datos que es posible que desee raspar:

Enviar el formulario de acceso

En ese momento, puede utilizar la API de Puppeteer para implementar la lógica de raspado:

// wait for the page to load
await page.waitForNavigation();

// scraping logic...

Ahora, el enfoque de este artículo es titiritero-humanizar. Por lo tanto, no vamos a cubrir la parte de raspado aquí.
Si estás interesado en extraer datos de Quotes to Scrape y exportarlos a CSV, lee nuestro tutorial completo sobre extracción web con Puppeteer.

Paso nº 6: Póngalo todo junto

Tu script.js debería contener ahora:

import puppeteer from "puppeteer";
import { typeInto } from "@forad/puppeteer-humanize";

(async () => {
  // set up a new browser instance in headful mode
  const browser = await puppeteer.launch({
    headless: false, // set to false so you can watch the interaction
    defaultViewport: null,
  });
  const page = await browser.newPage();

  // visit the target page
  await page.goto("https://quotes.toscrape.com/login");

  // select the login form inputs
  const usernameInput = await page.$("input[name=\"username\"]");
  const passwordInput = await page.$("input[name=\"password\"]");

  // if they are not both null, interact with them
  if (usernameInput && passwordInput) {
    // configure the typing behavior
    const typingConfig = {
      mistakes: {
        chance: 10, // 10% chance of introducing a typo that gets corrected
        delay: {
          min: 100, // minimum delay before correcting a mistake (in ms)
          max: 500, // maximum delay before correcting a mistake (in ms)
        },
      },
      delays: {
        all: {
          chance: 100, // 100% chance to add delay between each keystroke
          min: 100, // minimum delay between characters (in ms)
          max: 200, // maximum delay between characters (in ms)
        },
      },
    };

    // test strings to fill into the input elements
    const username = "username";
    const password = "password";

    // apply the human-like typing logic to both inputs
    await typeInto(usernameInput, username, typingConfig);
    await typeInto(passwordInput, password, typingConfig);

    // submit the form
    const submitButton = page.locator("input[type=\"submit\"]");
    await submitButton.click();

    // wait for the page to load
    await page.waitForNavigation();

    // scraping logic...
  }

  // close the browser and release its resources
  await browser.close();
})();

Lanza el script de scraping puppeteer-humanize anterior con:

node script.js

El resultado será:

Observe lo natural que es la interacción de tecleado

Como puedes ver, el bot Puppeteer interactúa ahora con el formulario de inicio de sesión de una forma mucho más natural, como lo haría un usuario humano real. Escribe a una velocidad realista, de vez en cuando comete errores tipográficos y luego los corrige. Ese es el poder de Puppeteer : ¡humanizar!

Desafíos de este enfoque del Web Scraping

puppeteer-humanize es definitivamente un gran aliado para reducir las posibilidades de ser detectado por tecnologías que analizan cómo interactúan los usuarios. Aún así, ¡las técnicas anti -scraping y anti-bot van mucho más allá del comportamiento del usuario!

Primero, recuerde que Puppeteer debe instrumentar el navegador para controlarlo programáticamente. Eso introduce cambios sutiles y señales que pueden exponer al navegador como automatizado. Para reducir estas fugas, también debe considerar el uso de Puppeteer Stealth.

Incluso con puppeteer-humanize y Puppeteer Stealth en su lugar, es posible que aún encuentre CAPTCHAs durante sus interacciones. En estos casos, eche un vistazo a nuestro artículo sobre cómo evitar CAPTCHA con Playwright.

Aunque estas herramientas y guías pueden ayudarle a construir una configuración de scraping más resistente, muchas de las soluciones en las que se basan no duran para siempre. Si se trata de sitios que utilizan soluciones anti-bot muy sofisticadas, sus posibilidades de éxito disminuyen significativamente. Además, la adición de múltiples plugins puede hacer que su configuración sea más pesada en memoria y uso de disco, y más difícil de escalar.

En ese punto, el problema no es sólo Puppeteer en sí, sino más bien las limitaciones del navegador que controla. El verdadero avance viene de la integración de Puppeteer con un navegador headful, basado en la nube y construido específicamente para el web scraping. Esta solución incluye soporte integrado para proxies rotativos, resolución avanzada de CAPTCHA, huellas dactilares realistas del navegador y mucho más. Esto es exactamente de lo que trata la API de navegador de Bright Data.

Conclusión

En este tutorial, has aprendido por qué vanilla Puppeteer se queda corto en el análisis del comportamiento del usuario y cómo solucionarlo con puppeteer-humanize. En particular, usted vio cómo integrar este enfoque en un flujo de trabajo de raspado web a través de un tutorial paso a paso.

Aunque este método puede ayudarte a eludir sistemas anti-bot sencillos, no garantiza un alto porcentaje de éxito. Esto es especialmente cierto cuando se rastrean sitios que se basan en CAPTCHAs, prohibiciones de IP o técnicas modernas anti-bot basadas en IA. Además, escalar esta configuración puede ser complejo.

Si su objetivo es hacer que su script de scraping -o incluso un agente de IA- se comporte más como un usuario real, debería considerar el uso de un navegador especialmente diseñado para este caso de uso: Bright Data’s Agent Browser.

Cree una cuenta gratuita de Bright Data para acceder a toda nuestra infraestructura de scraping preparada para la IA.