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.4La 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.9Cookie
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.




