Guía del agente de usuario de Node.js: configuración y modificación

Descubra la importancia de configurar los encabezados User-Agent, el agente de usuario predeterminado en Node.js, y cómo implementar la rotación de agentes de usuario para evadir la detección antibots.
11 min de lectura
Node.js User Agent Guide hero image

En esta guía de configuración del agente de usuario de Node.js, verá:

  • Por qué es importante configurar el encabezado User-Agent
  • Cómo es el agente de usuario predeterminado en Node.js
  • Cómo configurar un agente de usuario utilizando la API Fetch
  • Cómo implementar la rotación del agente de usuario en Node.js

¡Empecemos!

Por qué es tan importante configurar un agente de usuario

El encabezado User-Agent es una cadena que identifica el software cliente que realiza una solicitud HTTP. Normalmente incluye detalles sobre el navegador o la aplicación, el sistema operativo y la arquitectura del sistema desde el que se origina la solicitud. Este encabezado suele ser establecido por los navegadores web, los clientes HTTP o cualquier software que realice solicitudes web.

Por ejemplo, este es el agente de usuario actual establecido por Chrome al solicitar páginas:

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

A continuación se muestra un desglose de los componentes de esta cadena de agente de usuario:

  • Mozilla/5.0: originalmente utilizado para indicar la compatibilidad con los navegadores Mozilla, este prefijo se añade ahora con fines de compatibilidad.
  • 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): muestra 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.

En esencia, el agente de usuario puede revelar si la solicitud proviene de un navegador de confianza o de otro tipo de software.

Los bots de scraping web y los scripts de automatización suelen utilizar cadenas de agente de usuario predeterminadas o que no son de navegador. Estas pueden exponer su naturaleza automatizada a los sistemas antibots, que protegen los datos web examinando las solicitudes entrantes. Al analizar el encabezado User-Agent, estas soluciones pueden discernir si la solicitud proviene de un usuario genuino o de un bot.

Para obtener más información, consulte nuestra guía sobre agentes de usuario para el Scraping web.

¿Cuál es el agente de usuario predeterminado de Node.js?

A partir de la versión 18, Node.js incluye el método fetch() como una implementación integrada de la API Fetch. Esa es la forma recomendada de realizar solicitudes HTTP en Node.js, ya que no requiere ninguna dependencia externa. Obtenga más información sobre cómo realizar solicitudes HTTP en Node.js con la API Fetch.

Al igual que la mayoría de los demás clientes HTTP, fetch() establece automáticamente un encabezado User-Agent predeterminado al realizar una solicitud. Por ejemplo, lo mismo ocurre en la biblioteca de solicitudes de Python.

En concreto, el agente de usuario predeterminado de Node.js establecido por fetch() es:

node

Puede verificarlo realizando una solicitud GET al punto final httpbin.io/user-agent. Este punto final devuelve el encabezado User-Agent de la solicitud entrante, lo que le ayuda a descubrir el agente de usuario establecido por un cliente HTTP.

Cree un script Node.js, defina una función asíncrona y utilice fetch() para realizar la solicitud HTTP deseada:

async function getFetchDefaultUserAgent() {

// realiza una solicitud HTTP al punto final HTTPBin

// para obtener el agente de usuario

const response = await fetch("https://httpbin.io/user-agent");

// leer el agente de usuario predeterminado de la respuesta

// e imprimirlo

const data = await response.json();

console.log(data);

}

getFetchDefaultUserAgent();

Ejecute el código JavaScript anterior y recibirá la siguiente cadena:

{ 'user-agent': 'node' }

Como puede ver, el agente de usuario establecido por fetch() en Node.js es simplemente node. Esta cadena es bastante diferente de los agentes de usuario utilizados por los navegadores, que pueden activar los sistemas antibots.

Las soluciones antibots supervisan las solicitudes entrantes en busca de patrones sospechosos, como cadenas de agente de usuario inusuales. Una vez detectadas, marcan la solicitud como procedente de un bot y la bloquean. Por eso, cambiar el valor predeterminado del agente de usuario de Node.js es fundamental para evitar ser marcado.

Cómo cambiar el agente de usuario de Node.js utilizando la API Fetch

La especificación de la API Fetch no proporciona un método específico para cambiar el agente de usuario. Al mismo tiempo, User-Agent no es más que un encabezado HTTP. Eso significa que puedes personalizar su valor utilizando las opciones de encabezadode fetch().

¡Vea cómo configurar el encabezado User-Agent en Node.js utilizando fetch()!

Configurar un agente de usuario localmente

fetch() admite la personalización de encabezados a través de la opción headers. Úsela para configurar el encabezado User-Agent al realizar una solicitud HTTP específica de la siguiente manera:

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"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",

},

});

Si lo juntamos todo, obtendremos:

async function getFetchUserAgent() {

// realiza una solicitud HTTP a HTTPBin

// con un agente de usuario personalizado

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent":

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

},

});

// leer el agente de usuario predeterminado de la respuesta

// e imprimirlo

const data = await response.json();

console.log(data);

}

getFetchUserAgent();

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'

}

¡Fantástico! El agente de usuario devuelto por la API coincide con el agente de usuario configurado en el código. Ahora ya sabes cómo cambiar el agente de usuario de Node.js.

Configurar un agente de usuario globalmente

Configurar el agente de usuario para cada solicitud es sencillo, pero puede dar lugar a código repetitivo. ¿Qué pasa si quieres cambiar el agente de usuario predeterminado de Node.js de forma global? Por desgracia, en el momento de escribir este artículo, la API fetch() no ofrece una forma de anular su configuración predeterminada de forma global.

Lo que puedes hacer es crear una función envolvente para personalizar el comportamiento de fetch() con las configuraciones que desees:

function customFetch(url, options = {}) {

// encabezados personalizados

const customHeaders = {

"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",

...options.headers, // fusionar con cualquier otro encabezado pasado en las opciones

};

const mergedOptions = {

...options,

headers: customHeaders,

};

return fetch(url, mergedOptions);

}

Ahora puede realizar una solicitud HTTP con un agente de usuario personalizado llamando a customFetch() en lugar de fetch():

const response = await customFetch("https://httpbin.io/user-agent");

El script completo de Node.js será:

función customFetch(url, opciones = {}) {

// añadir un encabezado de agente de usuario personalizado

const customHeaders = {

"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",

...options.headers, // fusionar con cualquier otro encabezado pasado en las opciones

};

const mergedOptions = {

...options,

headers: customHeaders,

};

return fetch(url, mergedOptions);

}

async function getFetchUserAgent() {

// realizar una solicitud HTTP a HTTPBin

// a través del envoltorio de obtención personalizado

const response = await customFetch("https://httpbin.io/user-agent");

// leer el agente de usuario predeterminado de la respuesta

// e imprimirlo

const data = await response.json();

console.log(data);

}

getFetchUserAgent();

Ejecute el script Node.js anterior y se imprimirá:

{

'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! Acabas de aprender a configurar un agente de usuario global en Node.js utilizando fetch().

Implementar la rotación del agente de usuario en Node.js

Anular el encabezado User-Agent predeterminado de un cliente HTTP con el de un navegador real puede no ser suficiente para eludir la detección antibots. Si envías demasiadas solicitudes desde la misma dirección IP utilizando el mismo agente de usuario, los sistemas antiscraping pueden seguir identificando tu actividad como automatizada. El problema es que tus solicitudes seguirán sugiriendo un comportamiento no humano.

Para reducir el riesgo de detección de bots en Node.js, debes introducir variabilidad en tus solicitudes HTTP. Una técnica eficaz es la rotación del agente de usuario, que consiste en cambiar el encabezado User-Agent en cada solicitud. Este enfoque hace que tus solicitudes automatizadas parezcan provenir de diferentes navegadores, lo que reduce la probabilidad de que sean detectadas por los sistemas antibots.

En la siguiente sección, aprenderás cómo lograr la rotación de agentes de usuario en Node.js.

Paso n.º 1: recuperar una lista de agentes de usuario

Visite un sitio como WhatIsMyBrowser.com y rellene una lista con algunos valores válidos de agentes de usuario:

const userAgents = [

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",

«Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, como Gecko) Versión/17.5 Safari/605.1.15»,

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

// otros agentes de usuario...

];

Consejo: Cuantas más cadenas de agente de usuario reales contenga esta matriz, mejor se evitará la detección antibots.

Paso n.º 2: Seleccionar aleatoriamente un agente de usuario

Cree una función que seleccione aleatoriamente y devuelva una cadena de agente de usuario de la lista:

function getRandomUserAgent() {

const userAgents = [

// agentes de usuario omitidos por brevedad...

];

// devuelve un agente de usuario aleatorio

// extraído de la lista

return userAgents[Math.floor(Math.random() * userAgents.length)];

}

Analicemos lo que ocurre en esta función:

  • Math.random() genera un número aleatorio entre 0 y 1
  • Este número se multiplica por la longitud de la matriz userAgents.
  • Math.floor() redondea el número resultante al entero más grande menor o igual a ese número.
  • El número resultante de las operaciones anteriores corresponde a un índice generado aleatoriamente que va de 0 a userAgents.length - 1.
  • A continuación, el índice se utiliza para devolver un agente de usuario aleatorio de la matriz de agentes de usuario.

Cada vez que se llama a la función getRandomUserAgent(), es probable que se obtenga un agente de usuario diferente.

Paso n.º 3: Realizar la solicitud HTTP con un agente de usuario aleatorio

Para implementar la rotación de agentes de usuario en Node.js utilizando fetch(), establezca el encabezado User-Agent con el valor de la función getRandomUserAgent():

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent": getRandomUserAgent(),

},

});

La solicitud HTTP realizada a través de la API Fetch ahora tendrá un agente de usuario aleatorio.

Paso n.º 4: Combinarlo todo

Añada los fragmentos de los pasos anteriores a un script de Node.js y, a continuación, envuelva la lógica para realizar una solicitud fetch() en una función asíncrona.

Así es como debería quedar tu script final de rotación de agentes de usuario Node.js:

function getRandomUserAgent() {

const userAgents = [

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",

«Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, como Gecko) Versión/17.5 Safari/605.1.15»,

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/126.0.2592.113",

// otros agentes de usuario...

];

// devuelve un agente de usuario aleatorio

// extraído de la lista

return userAgents[Math.floor(Math.random() * userAgents.length)];

}

async function getFetchUserAgent() {

// realiza una solicitud HTTP con un agente de usuario aleatorio

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent": getRandomUserAgent(),

},

});

// lee el agente de usuario predeterminado de la respuesta

// y lo imprime

const data = await response.json();

console.log(data);

}

getFetchUserAgent();

Ejecute el script 3 o 4 veces. Estadísticamente, debería ver diferentes respuestas del agente de usuario como se muestra a continuación:

different user agent responses

Esto demuestra que la rotación del agente de usuario funciona correctamente.

¡Et voilà! Ahora ya sabes cómo configurar agentes de usuario en Node.js utilizando la API Fetch.

Conclusión

En este tutorial, has visto por qué debes configurar el encabezado User-Agent y cómo es el agente de usuario predeterminado de Node.js en fetch(). También has explorado cómo anular este valor e implementar la rotación de agentes de usuario en Node.js para evadir los sistemas básicos antiscraping. Sin embargo, los sistemas más avanzados aún pueden detectar y bloquear tus solicitudes automatizadas. Para evitar las prohibiciones de IP, puedes configurar un Proxy en Node.js, ¡pero incluso eso puede no ser siempre suficiente!

Para una solución más robusta, considera la API Web Scraper, un servicio de Scraping web de última generación que simplifica las solicitudes web automatizadas en Node.js o cualquier otra tecnología. Evita eficazmente las medidas antiscraping mediante funciones como la rotación de IP y del agente de usuario, lo que hace que el Scraping web sea más fácil que nunca.

Regístrese ahora y encuentre el mejor producto para sus proyectos. ¡Comience hoy mismo su prueba gratuita!

Usted también puede estar interesado en