Guía del agente de usuario Puppeteer: configuración y cambios

Domine las técnicas para configurar y rotar agentes de usuario en Puppeteer para mejorar sus esfuerzos de Scraping web y eludir las defensas antibots.
12 min de lectura
Puppeteer
User Agent Guide blog image

En esta guía del agente de usuario Puppeteer, verás:

  • Scraping web
  • Cómo es el agente de usuario predeterminado en Puppeteer
  • Cómo anular el agente de usuario sin interfaz de Chrome predeterminado
  • Cómo implementar la rotación del agente de usuario en Puppeteer
  • Cómo utilizar Puppeteer Extra para anonimizar el agente de usuario

¡Empecemos!

Por qué es necesario configurar un agente de usuario personalizado

El encabezado User-Agent es una cadena que el cliente establece para identificarse ante un servidor cuando se pone en contacto con él a través de una solicitud HTTP. Normalmente incluye información sobre el equipo y/o la aplicación desde la que se origina la solicitud. Este encabezado lo establecen los navegadores web, los clientes HTTP o cualquier software que realice solicitudes web.

A continuación se muestra un ejemplo de la cadena del agente de usuario establecida por Chrome al solicitar páginas web:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/127.0.0.0 Safari/537.36

La cadena de agente de usuario anterior consta de los siguientes componentes:

  • Mozilla/5.0: originalmente utilizado para indicar la compatibilidad con los navegadores Mozilla, este prefijo se incluye ahora para una compatibilidad más amplia.
  • Windows NT 10.0; Win64; x64: indica el sistema operativo (Windows NT 10.0), la plataforma (Win64) y la arquitectura del sistema (x64).
  • AppleWebKit/537.36: se refiere al motor del navegador que utiliza Chrome.
  • (KHTML, como Gecko): indica la compatibilidad con los motores de diseño KHTML y Gecko.
  • Chrome/127.0.0.0: Especifica el nombre y la versión del navegador.
  • Safari/537.36: Indica compatibilidad con Safari.

Básicamente, la cadena del agente de usuario puede revelar si la solicitud proviene de un navegador conocido o de otro tipo de software.

El error que cometen la mayoría de los bots de Scraping web y los scripts de automatización es utilizar agentes de usuario predeterminados o que no son de navegador. Estos valores son fáciles de detectar por las medidas antibots diseñadas para proteger las páginas web. Al analizar el encabezado User-Agent, los servidores pueden determinar si la solicitud puede provenir de un bot automatizado.

Para obtener más detalles, consulte nuestra guía sobre agentes de usuario para Scraping web.

¿Cuál es el agente de usuario predeterminado de Puppeteer?

Puppeteer automatiza las tareas del navegador controlando una versión especial de un navegador web real. Por defecto, ejecuta una versión específica de Chrome, aunque también es compatible con Firefox. Por lo tanto, se podría suponer que el agente de usuario predeterminado en Puppeteer coincidiría con el establecido por la versión controlada de Chrome. Bueno, ese no es el caso…

La razón es que Puppeteer inicia el navegador en modo sin interfaz por defecto. Cuando los navegadores funcionan en modo sin interfaz, suelen establecer un agente de usuario distintivo. En la versión actual, el agente de usuario predeterminado de Puppeteer tiene este aspecto:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) HeadlessChrome/127.0.0.0 Safari/537.3

Observe la cadena HeadlessChrome, que identifica que Chrome se está ejecutando en modo sin interfaz gráfica. Como era de esperar, la cadena anterior es exactamente el agente de usuario de la última versión de Chrome sin interfaz gráfica.

Para confirmar que la cadena anterior es realmente el agente de usuario predeterminado de Puppeteer, configure un script y navegue a la página httpbin.io/user-agent. Este punto final de la API devuelve el encabezado User-Agent de la solicitud, lo que le ayuda a descubrir el agente de usuario utilizado por cualquier navegador o cliente HTTP.

Cree un script de Puppeteer, visite la página deseada, recupere la respuesta de la API del cuerpo y imprímala:

import puppeteer from "puppeteer";

(async () => {

// iniciar el navegador y abrir una nueva página

const browser = await puppeteer.launch();

const page = await browser.newPage();

// conectarse a la página de destino

await page.goto("https://httpbin.io/user-agent");

// extrae el texto del cuerpo con la respuesta de la API

// y lo imprime

const bodyText = await page.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText);

// cierra el navegador y libera sus recursos

await browser.close();

})();

Para obtener más información sobre la API de Puppeteer, lea nuestra guía sobre el Scraping web con Puppeteer.

Ejecute el código Node.js anterior y recibirá la siguiente cadena:

{

"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/127.0.0.0 Safari/537.36"

}

Tenga en cuenta que el agente de usuario establecido por Puppeteer coincide con la cadena presentada anteriormente.

El problema radica en el identificador HeadlessChrome, que puede alertar a los sistemas antibots. Estos sistemas analizan las solicitudes entrantes en busca de patrones que puedan indicar actividad de bots, como cadenas de agente de usuario inusuales. Las solicitudes sospechosas se marcan y se bloquean en consecuencia. ¡Por eso es tan importante modificar la cadena del agente de usuario predeterminada de Puppeteer!

Cómo cambiar el agente de usuario de Puppeteer

Cambiar el agente de usuario es una operación tan común y útil que Puppeteer proporciona un método específico para ello. En concreto, la clase Page expone el método setUserAgent(). Esto le permite modificar el agente de usuario establecido por Puppeteer al navegar por las páginas web en esa pestaña del navegador.

Utilice setUserAgent() para cambiar el agente de usuario de Puppeteer como se indica a continuación:

await page.setUserAgent("<tu_agente_de_usuario>");

Todas las solicitudes HTTP GET realizadas al llamar al método goto() en la página tendrán ahora un encabezado User-Agent personalizado. Tenga en cuenta que este cambio solo se aplica al objeto de página específico. Si abre una nueva página e interactúa con ella, Puppeteer utilizará el agente de usuario predeterminado que se ha visto anteriormente.

Para ver un ejemplo completo, echa un vistazo al siguiente fragmento de código:

import puppeteer from "puppeteer";

(async () => {

// iniciar el navegador y abrir una nueva página

const browser = await puppeteer.launch();

const page = await browser.newPage();

// establecer un agente de usuario personalizado

await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36");

// conectarse a la página de destino

await page.goto("https://httpbin.io/user-agent");

// extraer el texto del cuerpo con la respuesta de la API

// e imprimirlo

const bodyText = await page.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText);

// cerrar el navegador y liberar sus recursos

await browser.close();

})();

Ejecute el script anterior y, esta vez, el resultado será:

{

"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"

}

¡Genial! La cadena del agente de usuario extraída de la página coincide con el agente de usuario configurado en el código. Ahora ya sabes cómo realizar la operación de cambio de agente de usuario en Puppeteer.

Implementar la rotación del agente de usuario en Puppeteer

Reemplazar el encabezado User-Agent de un navegador sin interfaz gráfica por uno de un navegador con interfaz gráfica puede no ser suficiente para eludir los sistemas antibots. El problema es que tu script de automatización del navegador mostrará patrones que indican un comportamiento no humano. Esto es especialmente cierto si envías un gran número de solicitudes con los mismos encabezados desde la misma dirección IP.

Para minimizar el riesgo de detección de bots en Puppeteer, debes hacer que tus solicitudes sean lo más variadas posible. Un método eficaz es establecer un agente de usuario diferente para cada solicitud. Esta estrategia se denomina rotación de agentes de usuario y te ayuda a reducir la probabilidad de que te marquen como bot.

En la siguiente sección del tutorial, aprenderá a implementar la rotación de agentes de usuario en Puppeteer.

Paso n.º 1: generar un agente de usuario aleatorio

Hay dos enfoques principales para obtener un agente de usuario aleatorio. El primero es obtener una lista de agentes de usuario válidos y seleccionar uno al azar de la lista, como se muestra en nuestra guía de agentes de usuario de Node.js.

El segundo método consiste en utilizar una biblioteca generadora de agentes de usuario de terceros. La más popular en JavaScript es user-agents, un paquete que puede generar agentes de usuario válidos. En esta guía, seguiremos este método.

Ejecute este comando npm para añadir la biblioteca user-agents a las dependencias de su proyecto:

npm install user-agents

Ten en cuenta que user-agents se actualiza a diario, lo que garantiza que siempre incluya los últimos agentes de usuario.

Después de instalar la biblioteca, importe el objeto UserAgent a su script de Puppeteer:

import UserAgent from "user-agents";

Ahora puede generar una cadena de agente de usuario aleatoria con el siguiente código:

const userAgent = new UserAgent().random().toString();

Consulte la documentación oficial para obtener información sobre usos más avanzados, como obtener agentes de usuario para dispositivos específicos, sistemas operativos y mucho más.

Paso n.º 2: configurar el agente de usuario aleatorio

Pase la cadena de agente de usuario aleatoria a Puppeteer llamando al método setUserAgent():

const userAgent = new UserAgent().random().toString();

await page.setUserAgent(userAgent);

Todas las solicitudes realizadas a través del objeto de página tendrán ahora un agente de usuario personalizado, generado aleatoriamente.

Paso n.º 3: Visita la página de destino

Llame al método goto() en la página para visitar su página web de destino en el navegador sin interfaz gráfica controlado:

await page.goto("https://httpbin.io/user-agent");

Paso n.º 4: Ponlo todo junto

A continuación se muestra el script final de rotación del agente de usuario de Puppeteer:

import puppeteer from "puppeteer";

import UserAgent from "user-agents";

(async () => {

// iniciar el navegador y abrir una nueva página

const browser = await puppeteer.launch();

const page = await browser.newPage();

// generar un agente de usuario aleatorio

const userAgent = new UserAgent().random().toString();

// establecer un agente de usuario aleatorio

await page.setUserAgent(userAgent);

// conectarse a la página de destino

await page.goto("https://httpbin.io/user-agent");

// extraer el texto del cuerpo con la respuesta de la API

// e imprimirlo

const bodyText = await page.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText);

// cerrar el navegador y liberar sus recursos

await browser.close();

})();

Ejecute el script varias veces y debería ver diferentes agentes de usuario.

¡Et voilà! La lógica de rotación de agentes de usuario en Puppeteer funciona a las mil maravillas.

Establece un agente de usuario personalizado en Puppeteer con puppeteer-extra-plugin-anonymize-ua

Los métodos anteriores para configurar el agente de usuario de Puppeteer son eficaces, pero tienen un inconveniente importante. El método userAgent() solo cambia el agente de usuario para una sesión de página específica, no para todas las pestañas del navegador.

Para asegurarte de que Puppeteer nunca utilice el agente de usuario predeterminado, puedes utilizar el complemento puppeteer-extra-plugin-anonymize-ua de Puppeteer Extra. Si no estás familiarizado con este proyecto, Puppeteer Extra amplía Puppeteer añadiendo compatibilidad con complementos definidos por la comunidad. Puedes obtener más información en nuestra guía sobre el complemento Puppeteer Extra Stealth.

El complemento puppeteer-extra-plugin-anonymize-ua puede anonimizar el agente de usuario establecido por Puppeteer. Para instalar puppeteer-extra y el complemento necesario, ejecute el siguiente comando:

npm install puppeteer-extra puppeteer-extra-plugin-anonymize-ua

A continuación, importe puppeteer desde puppeteer-extra y AnonymizeUAPlugin desde puppeteer-extra-plugin-anonymize-ua:

import puppeteer from "puppeteer-extra";

import AnonymizeUAPlugin from "puppeteer-extra-plugin-anonymize-ua";

Configure puppeteer-extra-plugin-anonymize-ua para generar un agente de usuario aleatorio y regístrelo como complemento con el método use() de Puppeteer Extra:

puppeteer.use(

AnonymizeUAPlugin({

customFn: () => new UserAgent().random().toString(),

})

);

Ahora, prueba a visitar páginas en dos pestañas diferentes utilizando dos objetos de página separados:

import puppeteer from "puppeteer-extra";

import AnonymizeUAPlugin from "puppeteer-extra-plugin-anonymize-ua";

import UserAgent from "user-agents";

(async () => {

// configure and register the

// puppeteer-extra-plugin-anonymize-ua plugin

puppeteer.use(

AnonymizeUAPlugin({

customFn: () => new UserAgent().random().toString(),

})

);

// iniciar el navegador y abrir una nueva página

const browser = await puppeteer.launch();

// abrir una nueva página

const page1 = await browser.newPage();

// conectarse a la página de destino

await page1.goto("https://httpbin.io/user-agent");

// extraer el texto del cuerpo con la respuesta de la API

// e imprimirlo

const bodyText1 = await page1.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText1);

// abrir una nueva página

const página2 = await browser.newPage();

// conectarse a la página de destino

await página2.goto("https://httpbin.io/user-agent");

// extraer el texto del cuerpo con la respuesta de la API

// e imprimirlo

const bodyText2 = await page2.evaluate(() => {

return document.body.innerText;

});

console.log(bodyText2);

// cerrar el navegador y liberar sus recursos

await browser.close();

})();

El resultado serán dos agentes de usuario diferentes, como se muestra a continuación:

{

"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1"

}

{

"user-agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36"

}

Los dos agentes de usuario son diferentes y ninguno es el agente de usuario predeterminado de Puppeteer. Esto ocurre porque puppeteer-extra-plugin-anonymize-ua personaliza cada objeto de página con un agente de usuario aleatorio, tal y como se especifica en la función customFn. De esta forma, Puppeteer nunca revelará su agente de usuario predeterminado.

Conclusión

En este artículo, ha explorado la importancia de configurar el encabezado User-Agent y ha visto cómo es el agente de usuario predeterminado de Puppeteer. Ha aprendido a anular ese valor e implementar la rotación de agentes de usuario para eludir los sistemas básicos antiscraping. Sin embargo, los sistemas más sofisticados aún pueden detectar y bloquear sus solicitudes automatizadas. Para evitar las prohibiciones de IP, puede configurar un Proxy en Puppeteer, ¡pero incluso eso puede no ser siempre suficiente!

Para obtener una solución más eficaz, prueba el Navegador de scraping, un navegador de última generación que se integra con Puppeteer y cualquier otra herramienta de automatización de navegadores. El Navegador de scraping puede eludir sin esfuerzo las tecnologías antibots por ti, al tiempo que evita la huella digital del navegador. En segundo plano, se basa en funciones como la rotación del agente de usuario, la rotación de IP y la Resoluciónde CAPTCHA. ¡La automatización del navegador nunca ha sido tan fácil!

Regístrese ahora y comience su prueba gratuita.