Volver al blog
La ciencia del web scraping
Raluca PenciucLast updated on Mar 31, 20269 min read

Introducción a los encabezados HTTP: cómo utilizarlos para un web scraping eficaz

Introducción a los encabezados HTTP: cómo utilizarlos para un web scraping eficaz

El web scraping es una herramienta increíble para extraer información valiosa de Internet, pero seamos realistas: puede resultar bastante frustrante cuando tus scripts de scraping son bloqueados.

Es como un juego del gato y el ratón, en el que los propietarios de los sitios web siempre se inventan nuevas formas de mantenerte fuera. Pero hay un arma secreta en tu caja de herramientas que puede darte ventaja: los encabezados HTTP y las cookies.

Estos dos elementos desempeñan un papel fundamental en la forma en que tus scripts de scraping interactúan con los sitios web, y dominarlos puede marcar la diferencia entre un scraping bloqueado y uno exitoso.

En este tutorial, desvelaremos los secretos de los encabezados HTTP y las cookies, y te mostraremos cómo utilizarlos para que tus esfuerzos de scraping sean lo más parecidos posible a los de un humano.

Aprenderás cuáles son los encabezados más comunes utilizados en el scraping web, cómo capturar encabezados y cookies desde un navegador real, y cómo utilizar encabezados personalizados para eludir las medidas de seguridad. ¡Así que vamos a ponernos manos a la obra y ver cómo podemos llevar nuestro scraping al siguiente nivel!

Comprender los encabezados HTTP

Los encabezados HTTP son pares clave-valor que se envían como parte de una solicitud o respuesta HTTP. Están separados por dos puntos y un espacio, y sus nombres (claves) no distinguen entre mayúsculas y minúsculas.

Puedes agrupar los encabezados HTTP en diferentes categorías, dependiendo de su función y de la dirección en la que los envíes. Estas categorías incluyen:

  • encabezados generales: se aplican tanto a los mensajes de solicitud como a los de respuesta
  • encabezados de solicitud: contienen más información sobre el recurso que se desea obtener, o sobre el cliente que realiza la solicitud
  • encabezados de respuesta: contienen información adicional sobre la respuesta, como su ubicación o el servidor que la proporciona
  • encabezados de entidad: contienen información sobre el cuerpo del recurso, como su tamaño o tipo MIME
  • encabezados de extensión: se utilizan para proporcionar compatibilidad con versiones anteriores

Los encabezados HTTP proporcionan una amplia gama de información, incluyendo el tipo de solicitud que se está realizando, el navegador que se está utilizando y cualquier información adicional que el servidor necesite para procesar la solicitud.

También te permiten proporcionar información de autenticación y seguridad, controlar el almacenamiento en caché y la compresión, y especificar el idioma y el juego de caracteres de la solicitud.

Por ejemplo, estos son los encabezados que envía Chrome al acceder a youtube.com:

:authority: www.youtube.com

:method: GET

:path: /

:scheme: https

accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

accept-encoding: gzip, deflate, br

accept-language: en-US,en;q=0.9

cache-control: no-cache

pragma: no-cache

referer: https://www.google.com/

sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"

sec-ch-ua-arch: "x86"

sec-ch-ua-bitness: "64"

sec-ch-ua-full-version: "109.0.5414.75"

sec-ch-ua-full-version-list: "Not_A Brand";v="99.0.0.0", "Google Chrome";v="109.0.5414.75", "Chromium";v="109.0.5414.75"

sec-ch-ua-mobile: ?0

sec-ch-ua-model: ""

sec-ch-ua-platform: "Windows"

sec-ch-ua-platform-version: "15.0.0"

sec-ch-ua-wow64: ?0

sec-fetch-dest: document

sec-fetch-mode: navigate

sec-fetch-site: same-origin

sec-fetch-user: ?1

upgrade-insecure-requests: 1

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

x-client-data: CIm2yQEIorbJAQjEtskBCKmdygEI5PDKAQiWocsBCKr2zAEI7oLNAQibiM0BCLqIzQEI9YjNAQ==

Decoded:

message ClientVariations {

  // Active client experiment variation IDs.

  repeated int32 variation_id = [3300105, 3300130, 3300164, 3313321, 3324004, 3330198, 3357482, 3359086, 3359771, 3359802, 3359861];

}

Comprender las cookies web

Las cookies web, o cookies HTTP, son pequeños archivos de texto que un sitio web almacena en el navegador del usuario. A partir de ese momento, cada vez que el usuario envía una nueva solicitud al sitio web, las cookies se incluyen automáticamente.

Son identificables de forma única, y se pueden encontrar como:

  • cookies de sesión: son temporales y caducan cuando el usuario cierra el navegador
  • cookies persistentes: tienen una fecha de caducidad específica y permanecen en el dispositivo del usuario hasta que caducan o el usuario las elimina.

Los sitios web utilizan cookies web para personalizar la experiencia del usuario. Esto puede incluir recordar su información de inicio de sesión y almacenar el contenido del carrito de la compra para comprender cómo interactúan los usuarios con el sitio web y ofrecer publicidad personalizada.

Tomando como ejemplo youtube.com también en este caso, podemos ver qué almacenan las cookies:

cookie: CONSENT=YES+srp.gws-20210816-0-RC3.ro+FX+801; __Secure-3PAPISID=jG4abs_wYhyzcDG5/A2yfWlePlb1U9fglf; VISITOR_INFO1_LIVE=pJuwGIYiJlE; __Secure-3PSIDCC=AEf-XMRV_MjLL0AWdGWngxFHvNUF3OIpk3_jdeUwRiZ76WZ3XsSY0Vlsl1jM9n7FLprKTqFzvw; __Secure-3PSID=RAi8PYLbf3qLvF1oEav9BnHK_eOXwimNM-0xwTQPj1-QVG1Xwpz17T4d-EGzT6sVps1PjQ.; YSC=4M3JgZEwyiA; GPS=1; DEVICE_INFO=ChxOekU1TURJMk1URTBOemd5TWpJeU5qVTJOdz09EOvgo54GGOvgo54G; PREF=tz=Europe.Bucharest&f6=40000000&f4=4000000; CONSISTENCY=ACHmjUr7DnoYSMf5OL-vaunKYfoLGz1lWYRUZRepFyIBDRpp_jrEa85E4wgRJLJ2j15l688hk9IVQu7fIjYXo7sdsZamArxVHTMuChgHd22PkX_mbfifnMjyp4OX2swyQJRS-8PE6cOCt_6129fGyBs; amp_adc4c4=Ncu7lbhgeiAAYqecSmyAsS.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn4emd4v.1gn4en556.0.4.4

La importancia de los encabezados y las cookies en el web scraping

En el web scraping, puedes utilizar encabezados y cookies para eludir las medidas de seguridad y acceder a contenido restringido, así como para proporcionar información que ayude a identificar tu script de scraping como un navegador legítimo.

Por ejemplo, al especificar el encabezado User-Agent correcto (más detalles en la siguiente sección), puede hacer que su script parezca un navegador Chrome, lo que puede ayudarle a evitar ser detectado por el sitio web.

Además, al almacenar y enviar cookies, su scraper puede acceder a contenido que solo está disponible para usuarios que han iniciado sesión. Dado que el sitio web utiliza cookies para ofrecer publicidad personalizada, también puede utilizarlas para extraer datos más precisos y comprender mejor el sitio web.

Además de jugar con los encabezados HTTP y las cookies, ten en cuenta algunas prácticas recomendadas de web scraping bastante útiles que se enumeran en esta guía.

Encabezados comunes utilizados en el web scraping

Hay muchos encabezados diferentes que se pueden utilizar en el web scraping, pero algunos de los más comunes son:

User-Agent

Se utiliza para identificar el navegador y el sistema operativo que utiliza el cliente que realiza la solicitud. Los servidores utilizan esta información para determinar qué navegador y sistema operativo utiliza el cliente con el fin de ofrecerle el contenido y las funciones adecuadas.

La cadena User-Agent contiene información como el nombre del navegador, la versión y la plataforma. Por ejemplo, una cadena User-Agent para Google Chrome en Windows podría tener este aspecto:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

En el web scraping, al especificar un User-Agent que pertenezca a un navegador web común, puedes hacer que tu script parezca un navegador que suelen utilizar los usuarios legítimos, lo que reduce la probabilidad de que sea bloqueado.

Accept

Se utiliza para especificar los tipos de contenido que el navegador está dispuesto a aceptar en respuesta a una solicitud HTTP, como texto, imágenes, audio o vídeo. Un encabezado Accept puede tener este aspecto:

Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

En el web scraping, al especificar el encabezado Accept correcto, puedes asegurarte de que tu script reciba los datos correctos. Por ejemplo, si quieres extraer datos de una página HTML, puedes especificar el encabezado Accept como text/html.

Sin embargo, algunos sitios web pueden utilizar este encabezado para detectar rastreadores, por lo que es importante utilizarlo con cuidado y solo cuando sea necesario.

Accept-Language

Este encabezado especifica el idioma preferido del contenido que el navegador está dispuesto a aceptar en respuesta a una solicitud HTTP. Los servidores utilizan el encabezado Accept-Language para determinar qué idioma enviar al cliente.

Un navegador que solicite una página HTML en inglés podría enviar un encabezado Accept-Language similar a este:

Accept-Language: en-US,en;q=0.9

Los sitios web utilizan este encabezado para enviar cookies a un cliente después de que se realice una solicitud. Un encabezado Cookie puede tener este aspecto:

Cookie: session_id=1234567890; user_id=johndoe

En el web scraping, puedes utilizar este encabezado para pasar cookies de sesión y acceder a contenido que solo está disponible para usuarios que han iniciado sesión. Otro caso de uso sería utilizar cookies persistentes para obtener resultados personalizados.

Referer

Este encabezado especifica la URL de la página web anterior desde la que se siguió un enlace a la página actual. Los servidores lo utilizan para rastrear el origen de la solicitud y comprender el contexto de la misma.

Por ejemplo, si un usuario hace clic en un enlace de una página web a otra, el navegador envía una solicitud a la segunda página web con la URL de la primera página web en el encabezado Referer. Así, la solicitud a la segunda página web tendría un encabezado Referer con este aspecto:

Referer: https://www.example.com/

En el web scraping, puedes utilizar el encabezado Referer para acceder a sitios web que no permiten solicitudes directas.

Recuperación de encabezados y cookies desde un navegador real

Pero basta de teoría. Veamos cómo se pueden extraer los encabezados HTTP y las cookies web que se envían a un sitio web.

Volviendo a nuestro ejemplo, ve a youtube.com en tu navegador real. A continuación, haz clic con el botón derecho en cualquier lugar de la página y selecciona la opción «Inspeccionar». Cuando se abran las Herramientas de desarrollador, ve a la pestaña «Red».

Tras actualizar la página, deberías ver las solicitudes cargándose en tiempo real. Haz clic en la primera (y principal) y aparecerá una pestaña adicional.

Aquí puedes ver todos los detalles de la solicitud que enviaste: URL, método, código de estado, dirección remota y, lo más importante: los encabezados de solicitud y respuesta que estábamos buscando.

Uso de encabezados personalizados en el web scraping

  • Utiliza httpbin.org para mostrar los encabezados enviados por un navegador
  • elige un lenguaje de programación y envía una solicitud GET básica para ver los encabezados
  • pasa los encabezados personalizados que has obtenido
  • repite el proceso para Node.js y Python
  • Reescribe la sección para WSA - Enlace a la documentación de la API - Describe la función de los encabezados personalizados

Ahora veamos cómo podemos aprovechar estos encabezados para mejorar nuestros rastreadores. Para esta parte, tomaremos como ejemplo un sitio web de duplicación simple, que nos mostrará directamente los encabezados que enviamos: https://httpbin.org/headers.

Copia el contenido del objeto «headers» y empecemos a escribir el código.

Node.js

Después de asegurarte de que tu entorno Node.js está configurado correctamente y tu proyecto inicializado, ejecuta el siguiente código:

import got from 'got';

(async () => {

    const response = await got('https://httpbin.org/headers')

    console.log(response.body)

})()

De esta forma podemos ver cómo es la solicitud GET más básica. El resultado debería ser:

{

  "headers": {

    "Accept-Encoding": "gzip, deflate, br",

    "Host": "httpbin.org",

    "User-Agent": "got (https://github.com/sindresorhus/got)",

    "X-Amzn-Trace-Id": "Root=1-63c93ff5-0c352d6319620b3d6b46df02"

  }

}

Esto se ve muy diferente de lo que vimos en nuestro navegador. El User-Agent por sí solo hace que sea muy fácil para un servidor detectar que la solicitud es automatizada.

Ahora pasemos nuestros encabezados personalizados y enviemos la solicitud de nuevo:

import got from 'got';

(async () => {

    const custom_headers = {

        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

    	  "Accept-Encoding": "gzip, deflate, br",

    	  "Accept-Language": "en-US,en;q=0.9",

    	  "Cache-Control": "no-cache",

    	  "Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

    	  "Host": "httpbin.org",

    	  "Pragma": "no-cache",

    	  "Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

    	  "Sec-Ch-Ua-Mobile": "?0",

    	  "Sec-Ch-Ua-Platform": "\"Windows\"",

    	  "Sec-Fetch-Dest": "document",

    	  "Sec-Fetch-Mode": "navigate",

    	  "Sec-Fetch-Site": "none",

    	  "Sec-Fetch-User": "?1",

    	  "Upgrade-Insecure-Requests": "1",

    	  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

    	  "X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

    }

    const response = await got('https://httpbin.org/headers', {

        headers: custom_headers

    })

    console.log(response.body)

})()

Al ejecutar el script de nuevo, deberías notar que ahora nuestra solicitud parece enviada desde un navegador Chrome real, aunque no hayamos abierto uno.

Python

Ahora probemos lo mismo en Python. Aunque la sintaxis y las bibliotecas sean diferentes, el principio es exactamente el mismo.

import requests

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

headers = {

	"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

	"Accept-Encoding": "gzip, deflate, br",

	"Accept-Language": "en-US,en;q=0.9",

	"Cache-Control": "no-cache",

	"Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

	"Host": "httpbin.org",

	"Pragma": "no-cache",

	"Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

	"Sec-Ch-Ua-Mobile": "?0",

	"Sec-Ch-Ua-Platform": "\"Windows\"",

	"Sec-Fetch-Dest": "document",

	"Sec-Fetch-Mode": "navigate",

	"Sec-Fetch-Site": "none",

	"Sec-Fetch-User": "?1",

	"Upgrade-Insecure-Requests": "1",

	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

	"X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

}

response = requests.get(url, headers=headers)

print(response.text)

El resultado tras ejecutar el script será el mismo independientemente del lenguaje de programación que utilices.

Encabezados personalizados en WebScrapingAPI

Cualquier API de scraping que se precie debería ofrecer la potente función de pasar encabezados HTTP y cookies personalizados a una solicitud. El estándar puede variar según la API, así que asegúrate de consultar siempre primero la documentación oficial.

Por defecto, WebScrapingAPI proporciona un conjunto de encabezados personalizados con cada solicitud. Los encabezados User-Agent aleatorios serían solo uno de los ejemplos.

Sin embargo, dado que los sitios web pueden volverse muy complejos o simplemente estar desactualizados, tienes la libertad de desactivar este comportamiento y personalizar completamente tu solicitud. Solo asegúrate de obtener primero una clave de API y, a continuación, ejecuta el siguiente código:

import got from 'got';

(async () => {

    const response = await got("https://api.webscrapingapi.com/v1", {

        searchParams: {

            api_key: "YOUR_API_KEY",

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

            keep_headers: '0',

        },

        headers: {

            "Wsa-Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

            "Wsa-Accept-Encoding": "gzip, deflate, br",

            "Wsa-Accept-Language": "en-US,en;q=0.9",

            "Wsa-Cache-Control": "no-cache",

            "Wsa-Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

            "Wsa-Pragma": "no-cache",

            "Wsa-Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

            "Wsa-Sec-Ch-Ua-Mobile": "?0",

            "Wsa-Sec-Ch-Ua-Platform": "\"Windows\"",

            "Wsa-Sec-Fetch-Dest": "document",

            "Wsa-Sec-Fetch-Mode": "navigate",

            "Wsa-Sec-Fetch-Site": "none",

            "Wsa-Sec-Fetch-User": "?1",

            "Wsa-Upgrade-Insecure-Requests": "1",

            "Wsa-User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

            "Wsa-X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

        }

    })

    console.log(response.body)

})()

En este caso, según la documentación de la API, debemos añadir el prefijo «Wsa-» al nombre de un encabezado para poder pasarlo a la solicitud. Esta medida se ha implementado para evitar que se pasen encabezados involuntarios, como cuando la solicitud de la API se envía desde un navegador.

Conclusión

Este artículo ha presentado una visión general de la importancia y el uso de los encabezados HTTP y las cookies web en el web scraping.

Hemos hablado de qué son los encabezados y las cookies, cómo puedes utilizarlos para acceder a contenido restringido y hacer que tu script de scraping parezca un navegador legítimo, así como de cómo pueden utilizarse para el seguimiento y el análisis.

También hemos presentado algunos de los encabezados más comunes utilizados en el web scraping y hemos explicado cómo recuperar encabezados y cookies de un navegador real. A continuación, hemos utilizado ejemplos de código para ilustrar cómo utilizarlos en tus scripts de scraping.

Al comprender y utilizar eficazmente los encabezados y las cookies, puedes mejorar la eficiencia de tus esfuerzos de web scraping. Con estos conocimientos, puedes llevar tus habilidades de scraping al siguiente nivel y extraer información valiosa de la web.

Acerca del autor
Raluca Penciuc, Desarrollador full-stack @ WebScrapingAPI
Raluca PenciucDesarrollador full-stack

Raluca Penciuc es desarrolladora full stack en WebScrapingAPI, donde se dedica a crear rastreadores, mejorar las técnicas de evasión y buscar formas fiables de reducir la detección en los sitios web de destino.

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.