Volver al blog
Guías
Mihnea-Octavian ManolacheLast updated on Mar 31, 20268 min read

Cómo utilizar los encabezados HTTP con Axios para evitar ser detectado

Cómo utilizar los encabezados HTTP con Axios para evitar ser detectado

Los encabezados HTTP son un aspecto importante de cualquier solicitud o respuesta HTTP, ya que permiten que el cliente y el servidor intercambien información adicional sobre la solicitud. Al desarrollar una aplicación web con Node.js, es importante contar con un cliente HTTP fiable y fácil de usar para realizar solicitudes a API y otros servidores.

JavaScript y Node.js, en particular, ofrecen bastantes opciones en lo que respecta a clientes HTTP. Sin embargo, uno de mis favoritos (y sin duda uno de los 5 mejores clientes HTTP de JavaScript) es Axios. Por eso, hoy nos centraremos en la configuración de encabezados HTTP con Axios.

Axios es una biblioteca de JavaScript muy utilizada que simplifica el proceso de realizar solicitudes HTTP y resulta especialmente útil al trabajar con API en un entorno Node.js. En este artículo, exploraremos las diversas formas en que se puede utilizar Axios para trabajar con encabezados HTTP. Al final del mismo, deberías ser capaz de comprender:

  • Qué es un encabezado HTTP y cómo funciona
  • Por qué Axios es un excelente cliente HTTP para JavaScript
  • Cómo utilizar los encabezados HTTP de Axios en una aplicación web real

Cómo funciona la comunicación HTTP

Antes de profundizar en la definición de un encabezado HTTP, creo que es importante tener al menos una visión general de cómo funciona el protocolo HTTP. Como seguramente ya sabrás, el Protocolo de Transferencia de Hipertexto (HTTP) es la base sobre la que se construye la web hoy en día. A grandes rasgos, permite que la información se transfiera entre un servidor y sus clientes. El flujo real de este intercambio de información es algo así:

  • El cliente abre una nueva conexión TCP
  • Envía un mensaje al servidor, lo que se denomina solicitud HTTP
  • El servidor recibe e interpreta la solicitud
  • A continuación, envía un mensaje de vuelta al cliente, lo que se denomina respuesta HTTP
  • El cliente lee el mensaje y continúa o cierra la conexión

La parte importante en la que nos centraremos hoy es el mensaje, en particular el mensaje enviado por el cliente. Para que la comunicación entre el servidor y el cliente sea eficiente, los mensajes deben tener el formato descrito por el protocolo HTTP. En lo que respecta a la solicitud HTTP, los elementos que componen el mensaje son:

El método describe lo que queremos realizar con nuestra solicitud (si queremos recibir, enviar, actualizar información, etc.)

  • La ruta, la ubicación de la URL a la que intentamos acceder
  • La versión del protocolo HTTP que estamos utilizando
  • Los encabezados HTTP, que se utilizan para enviar información adicional y metadatos junto con nuestra solicitud
  • El cuerpo, en caso de que estemos utilizando un método que envíe información al servidor (como una solicitud POST)

¿Qué son los encabezados HTTP de Axios y cómo funcionan?

En pocas palabras, los encabezados HTTP son campos que transmiten información adicional y metadatos al mensaje. De nuevo, por mensaje entendemos la solicitud cuando la envía el cliente y la respuesta cuando la envía el servidor. Así que tanto el servidor como el cliente pueden pasar y recibir encabezados. Por ejemplo, supongamos que quieres abrir una conexión persistente con el servidor. Por defecto, las conexiones HTTP se cierran después de cada solicitud. Para evitarlo, solo tienes que pasar el encabezado `Keep-Alive`.

En lo que respecta a los encabezados HTTP con Axios, realmente no hay nada especial. Como hemos comentado, Axios es un cliente HTTP y ya hemos establecido que los clientes HTTP pueden enviar y recibir encabezados.

Por qué Axios es un excelente cliente HTTP para JavaScript

Ahora que hemos visto a grandes rasgos cómo funciona HTTP, hablemos de los «clientes». JavaScript ofrece varias opciones para «interactuar mediante programación» con un servidor a través de HTTP. Entre las opciones más populares se encuentran `axios`, `node-fetch` y `got`.

Existen diferentes opiniones en la comunidad de JavaScript sobre cuál utilizar. Por supuesto, cada paquete tiene sus pros y sus contras; sin embargo, yo mismo elegí Axios tras realizar una sencilla prueba de velocidad entre los tres.

Este es el script que he utilizado para probar la velocidad:

// index.js

import { get_timing, array_sum } from './helpers.js'

import got from 'got'

import axios from 'axios'

const CALLS = 5

const send = async () => {

   const res = {}

  

   let start = process.hrtime()

   await got('https://httpbin.org/')

   const g = get_timing(start)

   res.got = g

   start = process.hrtime()

   await axios.get('https://httpbin.org/')

   const a = get_timing(start)

   res.axios = a

   start = process.hrtime()

   await fetch('https://httpbin.org/')

   const f = get_timing(start)

   res.fetch = f

   return res

}

let test_results = {

   got: [],

   axios: [],

   fetch: []

}

let avg = {}

console.log(`[i] Process started with ${CALLS} iterations.`)

for (let i = 0; i<=CALLS; i++) {

   let r = await send()

   Object.entries(test_results).map(([key, value]) => test_results[key].push(r[key]))

}

Object.entries(test_results).forEach(([key, value]) => {

       console.log(`\n[+] ${key}`)

       console.log(`    [i] Average: ${array_sum(value)/value.length}`)

       console.log(`    [i] Values: ${value}`)

       avg[key] = array_sum(value)/value.length

   }

)

console.log(`\n🚀🚀🚀 WINNER: ${Object.keys(avg).reduce((key, v) => avg[v] < avg[key] ? v : key)}  [${CALLS} calls sent] 🚀🚀🚀`)

Y estas son las funciones «helper»:

// helpers.js

export const get_timing = (start) => {

   const NS_PER_SEC = 1e9

   const NS_TO_MS = 1e6

   const diff = process.hrtime(start)

   return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS

}

export const array_sum = (array) => {

   return array.reduce((accumulator, value) => {

     return accumulator + value

   }, 0)

}

He realizado pruebas con 5, 10, 20 y 30 solicitudes enviadas con cada paquete, 10 iteraciones cada vez, y aquí está el resumen de los resultados:

Por iteración me refiero al número de ejecuciones del script, utilizando esta fórmula de bash, que genera un archivo .txt con los resultados de cada iteración:

~ » for i in {1..10}

do

node got.js > "${i}.txt"

echo "${i} done"

done

Como verás si consultas la tabla de resultados detallada, hay tiempos diferentes para cada lote y, a veces, Axios no es el más rápido. Sin embargo, en general, Axios obtuvo una media de 387 milisegundos, medio segundo más rápido que sus competidores. Got y Fetch tuvieron un tiempo de respuesta muy similar, de aproximadamente 435 milisegundos de media. Dicho esto, si la velocidad es importante para tu proyecto, Axios es quizás el mejor cliente HTTP para ti.

Cómo enviar encabezados HTTP con Axios

Personalmente, creo que aprender con la práctica da resultados casi inmediatos. Así que ahora que tenemos tanto los conocimientos como las herramientas para enviar encabezados HTTP, empecemos a trabajar en un pequeño proyecto. En esta sección, configuraremos un nuevo proyecto Node, instalaremos Axios y lo utilizaremos para enviar encabezados HTTP a un servidor.

Configurar el proyecto

Antes de continuar, asegúrate de que tu equipo cuenta con:

Sugerencia: puedes comprobar si tienes Node JS instalado escribiendo el siguiente comando en tu terminal:

~ » node -v

v19.3.0

Ahora vamos a crear una nueva carpeta y a abrirla en nuestro IDE. Si utilizas un equipo tipo UNIX (Mac o Linux), puedes crear un nuevo directorio mediante comandos desde tu terminal escribiendo el siguiente comando:

~ » mkdir axios_project && cd axios_project

~ » npm init -y

~ » npm i axios

~ » touch index.js

~ » code .

Estos comandos harán lo siguiente:

  • Crearán un nuevo directorio (llamado «axios_project») y te llevarán a él
  • Inicializar un nuevo proyecto de Node.js dentro del directorio
  • Instalar `axios` dentro de tu proyecto
  • Crearán un nuevo archivo «index.js»
  • Abrir tu IDE en el proyecto actual

Código para aprender

En realidad, hay varias formas de enviar encabezados HTTP con Axios. Por ejemplo, puedes utilizar un objeto de configuración como se describe aquí, o puedes utilizar los métodos de instancia, que fusionarán automáticamente la configuración que pases con la configuración de la instancia. También puedes utilizar el objeto `axios.defaults.headers.common` para establecer los encabezados predeterminados para todas las solicitudes de Axios.

Además, ten en cuenta que Axios es un cliente HTTP basado en promesas. Esto significa que tendremos que esperar a que se resuelva dentro de una función asíncrona o resolver la respuesta.

Teniendo en cuenta estos dos aspectos, empecemos con algo de programación real. Trabajaremos dentro del archivo «index.js». Para mayor comodidad, recapitulemos lo que tenemos que hacer de antemano:

  • Importar `axios` dentro de nuestro archivo
  • Definir un objeto de configuración que contenga nuestros encabezados
  • Pasar la configuración a `axios` para realizar una solicitud
  • Imprimir la respuesta en nuestro terminal

#1: Enviar una solicitud GET utilizando el objeto de configuración

import axios from "axios"

const config = {

   method: 'GET',

   url: 'https://httpbin.org/headers',

   headers: {

       'HTTP-Axios-Headers': 'This is my custom header.'

   }

}

axios(config)

   .then((response) => {

       console.log(response)

   })

   .catch((err) => {

       console.log(err)

   })

Enviar encabezados HTTP con Axios es muy sencillo. Para ejecutar este script, simplemente ejecuta el siguiente comando en tu terminal:

~ » node index.js  

{

  status: 200,

  statusText: 'OK',

  headers: ...,

  config: ...,

  request: ...,

  data: {

    headers: {

      'Accept': 'application/json, text/plain, */*',

      'Accept-Encoding': 'gzip, compress, deflate, br',

      'Host': 'httpbin.org',

      'Http-Axios-Headers': 'This is my custom header.',

      'User-Agent': 'axios/1.2.2',

      'X-Amzn-Trace-Id': 'Root=1-63b54d94-7656f02113483dfa036c476c'

    }

  }

}

La respuesta completa es bastante grande y sigue este esquema. Sin embargo, lo que más nos interesa es el `data`, que contiene la respuesta real que recibimos del servidor. Ahora echa un vistazo a la respuesta anterior. Recuerda que enviamos un encabezado personalizado `Http-Axios-Headers` al servidor y, como puedes ver, el servidor lo recibió.

#2: Enviar una solicitud POST utilizando el alias del método

import axios from "axios"

const data = {

   'foo':'bar'

}

const config = {

   headers: {

       'HTTP-Axios-Headers': 'This is my custom header.'

   }

}

axios.post('http://httpbin.org/post', data, config)

   .then(response => console.log(response.data))

   .catch(err => console.log(err))

Fíjate en que, para enviar una solicitud POST, he añadido un nuevo objeto `data` a nuestro script y también he cambiado la URL. Ahora, si ejecutas el script, verás que estos son los datos recibidos del servidor:

{

  args: {},

  data: '{"foo":"bar"}',

  files: {},

  form: {},

  headers: {

    Accept: 'application/json, text/plain, */*',

    'Accept-Encoding': 'gzip, compress, deflate, br',

    'Content-Length': '13',

    'Content-Type': 'application/json',

    Host: 'httpbin.org',

    'Http-Axios-Headers': 'This is my custom header.',

    'User-Agent': 'axios/1.2.2',

    'X-Amzn-Trace-Id': 'Root=1-63b5508a-3a86493f087662d3169e80ee'

  },

  json: { foo: 'bar' },

  origin: '49.12.221.20',

  url: 'http://httpbin.org/post'

}

Cómo utilizar los encabezados HTTP en Axios para el web scraping

Si tienes pensado utilizar Axios para el web scraping, ten en cuenta que la mayoría de los sitios web cuentan con reglas de protección que bloquean las solicitudes procedentes de software automatizado (incluidos los web scrapers).

El uso de encabezados HTTP, en particular el encabezado `User-Agent`, puede ser una técnica útil para evitar la detección al realizar web scraping. El encabezado User-Agent identifica el navegador del cliente y el sistema operativo ante el servidor, y los servidores web pueden servir contenido diferente o bloquear solicitudes basándose en esta información. Al configurar el encabezado User-Agent, puedes imitar un navegador web común, aumentando así tus posibilidades de eludir algunos mecanismos de detección.

A continuación, se muestra un ejemplo de cómo utilizar el encabezado User-Agent con Axios para evitar la detección al realizar web scraping:

import axios from "axios"

axios.defaults.headers.common['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'

axios({

   method: 'GET',

   url: 'https://httpbin.org/get',

}).then(response => {

   console.log(response.data)

});

Fíjate en que esta vez he utilizado la opción config defaults de Axios, que aplica el encabezado a todas las solicitudes futuras. En este ejemplo, el encabezado User-Agent está configurado para imitar el navegador Chrome en un sistema operativo Windows 10. Quizás quieras probar a utilizar diferentes valores de User-Agent o una variedad de encabezados distintos para ver cuál funciona mejor para tu caso de uso específico.

Cabe señalar que, aunque cambiar el encabezado User-Agent puede ayudarte a evitar la detección en algunos casos, no es un método infalible, y es posible que los servidores web sigan siendo capaces de identificar que estás utilizando un rastreador web. Por lo tanto, es recomendable utilizar una combinación de técnicas para evitar la detección y mantenerte dentro de los límites de los términos de servicio del sitio web.

Conclusiones

El uso de encabezados HTTP con Axios (o con cualquier otro cliente HTTP, para el caso) puede aumentar la eficiencia de la comunicación entre un servidor y un cliente. Además, puede incluso ayudarte a evitar la detección cuando estás creando un rastreador web. De hecho, en WebScrapingAPI utilizamos varios agentes de usuario como una de las técnicas básicas de evasión.

Por supuesto, la detección no se limita a los agentes de usuario, pero es un buen punto de partida. Aquí tienes un buen tutorial sobre cómo evitar que te bloqueen la dirección IP al realizar web scraping, que te ayudará a comprender mejor cómo funcionan las técnicas de evasión.

Por cierto, ¿sabías que Web Scraping API te permite configurar encabezados personalizados para tus solicitudes? Si no es así, obtén más información al respecto aquí.

Acerca del autor
Mihnea-Octavian Manolache, Desarrollador Full Stack @ WebScrapingAPI
Mihnea-Octavian ManolacheDesarrollador Full Stack

Mihnea-Octavian Manolache es ingeniero Full Stack y DevOps en WebScrapingAPI, donde se encarga de desarrollar funciones para los productos y de mantener la infraestructura que garantiza el buen funcionamiento de la plataforma.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.