Guía del agente de usuario de Python Requests: configuración y cambio

¡Deja de ser bloqueado por los sistemas antibots! Este tutorial te enseña a configurar y rotar el encabezado User-Agent en Python Requests para un Scraping web seguro y exitoso.
10 min de lectura
Requests User Agent Guide blog image

En este tutorial, aprenderás:

  • Por qué es necesario configurar el encabezado del agente de usuario
  • El agente de usuario predeterminado de Python requests
  • Cómo cambiar y desactivar el agente de usuario en Requests
  • Cómo implementar la rotación del agente de usuario en Python

¡Empecemos!

Por qué siempre debe configurar el encabezado del agente de usuario

El encabezado HTTP del agente de usuario lo establecen los navegadores, las aplicaciones que realizan solicitudes web y los clientes HTTP para identificar el software cliente que realiza la solicitud. Este valor suele incluir detalles sobre el tipo de navegador o aplicación, el sistema operativo y la arquitectura desde la que se realiza la solicitud.

Por ejemplo, este es el agente de usuario establecido por Chrome en el momento de escribir este artículo al visitar páginas web:

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

Los componentes de este agente de usuario son:

  • Mozilla/5.0: Se utilizaba históricamente para indicar la compatibilidad con los navegadores Mozilla. Ahora es un prefijo común que se añade a los agentes de usuario por motivos de compatibilidad.
  • Windows NT 10.0; Win64; x64: sistema operativo (Windows NT 10.0), plataforma (Win64) y arquitectura (x64).
  • AppleWebKit/537.36: motor del navegador utilizado por la versión de Chrome que realiza la solicitud.
  • KHTML, como Gecko: compatibilidad con el motor KHTML y el motor de diseño Gecko utilizado por Mozilla.
  1. Chrome/125.0.0.0: nombre del navegador y su versión.
  2. Safari/537.36: Compatibilidad con Safari.

En resumen, el agente de usuario es crucial para identificar si una solicitud proviene de un navegador conocido o de otro tipo de software.

Los bots de scraping suelen utilizar cadenas de agente de usuario predeterminadas o inconsistentes, lo que revela su naturaleza automatizada. En consecuencia, las soluciones anti-scraping protegen los datos de las páginas web examinando el encabezado User-Agent para determinar si el usuario actual es legítimo o un bot.

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

¿Cuál es el agente de usuario predeterminado de Requests Python?

Como la mayoría de los clientes HTTP, Requests establece un encabezado User-Agent al realizar solicitudes HTTP. En concreto, el agente de usuario predeterminado establecido por Requests sigue el formato siguiente:

python-requests/X.Y.Z

Donde X.Y.Z es la versión del paquete de solicitudes instalado en su proyecto. 

Verifique que la cadena anterior es realmente el agente de usuario de Requests realizando una solicitud GET al punto final httpbin.io /user-agent. Esta API devuelve el encabezado User-Agent leído de la solicitud entrante. En otras palabras, le permite comprobar el agente de usuario establecido automáticamente por un cliente HTTP.

Importe requests y utilice su método get() para realizar la solicitud HTTP deseada:

import requests

# realiza una solicitud HTTP GET a la URL especificada

response = requests.get('https://httpbin.io/user-agent')

# analiza la respuesta de la API como JSON y la imprime

print(response.json())

Ejecute el fragmento de código Python anterior y obtendrá algo como esto:

{'user-agent': 'python-requests/2.32.3'}

El agente de usuario es python-requests/2.32.3, lo que identifica claramente la solicitud como procedente de la biblioteca de solicitudes. Como resultado, los sistemas antibots pueden marcar dicha solicitud como no procedente de un usuario humano y bloquearla inmediatamente. ¡Por eso es tan importante cambiar el valor del agente de usuario de Python Requests!

Para obtener más información, consulta nuestra guía completa sobre la biblioteca Python Requests.

Cómo cambiar el agente de usuario de Python Requests

Veamos cómo cambiar y desactivar el valor del encabezado User-Agent en Requests.

Establecer un agente de usuario personalizado

Requests no ofrece una opción directa para establecer el valor del agente de usuario. Al mismo tiempo, User-Agent no es más que un encabezado HTTP. Por lo tanto, puede personalizar su valor como cualquier otro encabezado HTTP utilizando la opción headers como se muestra a continuación:

import requests

# encabezado de agente de usuario personalizado

headers = {

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

}

# realizar una solicitud HTTP GET a la URL especificada

# configurar encabezados personalizados

response = requests.get('https://httpbin.io/user-agent', headers=headers)

# analizar la respuesta de la API como JSON e imprimirla

print(response.json())

Ejecute de nuevo el fragmento de código Python anterior y, esta vez, se imprimirá:

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

¡Genial! Acabas de aprender que para configurar un agente de usuario personalizado en Python requests, tienes que:

  1. Definir un diccionario Python con una propiedad user-agent.
  2. Pasar el diccionario al parámetro headers del método requests que estás utilizando para realizar la solicitud HTTP.

No olvides que los nombres de los encabezados HTTP no distinguen entre mayúsculas y minúsculas, por lo que los nombres de las propiedades del diccionario de encabezados pueden tener el formato que prefieras.

Nota: Este enfoque también funciona con request(), post(), patch(), put(), delete() y head().

Para configurar un agente de usuario global de requests, debes configurar una sesión HTTP personalizada de la siguiente manera:

import requests

# inicializar una sesión HTTP

session = requests.Session()

# establecer un encabezado personalizado en la sesión

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

# realizar una solicitud GET dentro de la sesión HTTP

response = session.get('https://httpbin.io/user-agent')

# imprimir los datos devueltos por la API

print(response.json())

# otras solicitudes con un agente de usuario personalizado dentro de la sesión ...

Esto producirá el mismo resultado que antes. Si no estás familiarizado con las sesiones HTTP en Requests, consulta la documentación.

Desactivar el agente de usuario

Realizar solicitudes HTTP sin configurar el agente de usuario es una mala práctica que puede activar fácilmente soluciones antibots. Sin embargo, hay situaciones en las que puede ser necesario eliminar el encabezado User-Agent

El primer enfoque para desactivar el agente de usuario en Requests que se te podría ocurrir es establecer el encabezado User-Agent en None:

import requests

# encabezado de agente de usuario personalizado

headers = {

  'user-agent': None

}

# realizar una solicitud HTTP GET a la URL especificada

# establecer encabezados personalizados

response = requests.get('https://httpbin.io/user-agent', headers=headers)

# analizar la respuesta de la API como JSON e imprimirla

print(response.json())

Esto no funcionará porque requests utiliza urllib3 en segundo plano. Por lo tanto, se establecerá de forma predeterminada el valor del agente de usuario de urllib3:

python-urllib3/2.2.1

En detalle, el punto final /user-agent devolverá algo como:

{'user-agent': 'python-urllib3/2.2.1'}

Lo que hay que hacer es configurar urllib3 para que omita el valor predeterminado del agente de usuario utilizando urllib3.util.SKIP_HEADER. Comprueba que el agente de usuario se ha desactivado dirigiéndote al punto final/headers de httpbin.io, que devuelve los encabezados HTTP de la solicitud entrante:

import requests

import urllib3

# excluir el valor predeterminado del agente de usuario

headers = { 

  'user-agent': urllib3.util.SKIP_HEADER 

}

# preparar la solicitud HTTP que se va a realizar

req = requests.Request('GET', 'https://httpbin.io/headers')

prepared_request = req.prepare()

# establecer los encabezados personalizados sin agente de usuario

prepared_request.headers = headers

# crear una sesión de solicitudes y realizar

# la solicitud

session = requests.Session()

response = session.send(prepared_request)

# imprimir los datos devueltos

print(response.json())

Ejecute el código Python anterior y obtendrá:

{'headers': {'Accept-Encoding': ['identity'], 'Host': ['httpbin.io']}}

¡Increíble! Como era de esperar, no hay ningún agente de usuario de Python requests.

Implementar la rotación del agente de usuario en las solicitudes

Cambiar el encabezado User-Agent predeterminado por un valor adecuado de un navegador real puede no ser suficiente. Si realiza demasiadas solicitudes desde la misma dirección IP utilizando el mismo agente de usuario, puede despertar las sospechas de las tecnologías antibots. Estos sistemas supervisan todas las solicitudes entrantes, sabiendo que las solicitudes automatizadas suelen seguir patrones regulares. 

La clave para evitar la detección de bots es aleatorizar tus solicitudes. Una buena forma de hacer que cada solicitud sea diferente de las demás es la rotación del agente de usuario. La idea detrás de esta técnica es cambiar constantemente el encabezado del agente de usuario utilizado por el cliente HTTP. De esta manera, puedes hacer que tus solicitudes automatizadas parezcan provenir de diferentes navegadores, lo que reduce el riesgo de activar bloqueos o prohibiciones temporales.

Ahora, siga los pasos que se indican a continuación para implementar la rotación de agentes de usuario en Requests.

Paso n.º 1: Recuperar una lista de agentes de usuario válidos

Reúna una lista de agentes de usuario adecuados de un sitio como User Agent String.com y guárdela en una matriz de Python:

user_agents = [

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

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

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

    # otros agentes de usuario...

]

Paso n.º 2: extraer un agente de usuario aleatorio

Extrae aleatoriamente una cadena de agente de usuario de la matriz utilizando random.choice():

random_user_agent = random.choice(user_agents)

No olvide que la línea anterior requiere la siguiente importación:

import random

Paso n.º 3: Establecer el agente de usuario aleatorio y realizar la solicitud HTTP

Defina el diccionario de encabezados con el agente de usuario aleatorio y utilícelo en la solicitud de requests:

headers = {

  'user-agent': random_user_agent

}

response = requests.get('https://httpbin.io/user-agent', headers=headers)

print(response.json())

Estas instrucciones requieren esta importación:

import requests

Paso 4: Combinar todo

Así es como se verá la lógica de rotación del agente de usuario de Python Requests:

import random

import requests

# lista de agentes de usuario

user_agents = [

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

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

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

    # otros agentes de usuario...

]

# selecciona un agente de usuario aleatorio de la lista

random_user_agent = random.choice(user_agents)

# establecer el agente de usuario aleatorio

headers = {

  'user-agent': random_user_agent

}

# realizar una solicitud GET a la URL especificada

# e imprimir los datos de la respuesta

response = requests.get('https://httpbin.io/user-agent', headers=headers)

print(response.json())

Ejecute este script varias veces y obtendrá diferentes cadenas de agente de usuario.

¡Et voilà! Ahora ya eres un experto en configurar los valores del agente de usuario de Requests Python.

Conclusión

En esta guía, has aprendido la importancia de configurar el encabezado User-Agent y cómo hacerlo en requests. De esta manera, puedes engañar a los sistemas antibots básicos para que piensen que tus solicitudes provienen de navegadores legítimos. Sin embargo, es posible que las soluciones avanzadas aún puedan detectarte y bloquearte. Para evitar las prohibiciones de IP, podrías usar un Proxy con requests, ¡pero incluso eso podría no ser suficiente!

Evita estas complicaciones con la API Web Scraper. Esta API de Scraping web de última generación te ofrece todo lo que necesitas para realizar solicitudes web automatizadas utilizando solicitudes o cualquier otro cliente HTTP. Evita sin esfuerzo las tecnologías antibots, gracias a funciones como la rotación de IP y del agente de usuario. ¡Realizar solicitudes automatizadas con éxito nunca ha sido tan fácil!

Hable con uno de nuestros expertos en datos sobre nuestras soluciones de scraping o simplemente explore todos los productos disponibles registrándose ahora. ¡Hay pruebas gratuitas disponibles!