Guía del agente de usuario de Selenium: configuración y cambios

Aprenda a configurar y rotar el encabezado User-Agent en Selenium para mejorar sus capacidades de Scraping web y eludir las medidas anti-bot.
13 min de lectura
Selenium User Agent Guide Setting and Changing

En este tutorial aprenderás:

  • Por qué es tan importante el encabezado User-Agent
  • El valor predeterminado del agente de usuario de Selenium en navegadores con y sin interfaz gráfica
  • Cómo cambiar el agente de usuario en Selenium
  • Cómo implementar la rotación del agente de usuario en Selenium

¡Empecemos!

¿Por qué es importante el encabezado User Agent?

El encabezado del agente de usuario es una cadena que identifica el software cliente que realiza la solicitud HTTP. Por lo general, incluye información sobre el tipo de navegador o aplicación, el sistema operativo y la arquitectura desde la que se realiza la solicitud. Por lo general, lo establecen los navegadores, los clientes HTTP o cualquier otra aplicación que realice solicitudes web.

Por ejemplo, a continuación se muestra el agente de usuario establecido por Chrome en el momento de escribir este artículo:

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 esta cadena de agente de usuario son:

  • Mozilla/5.0: Se utilizaba históricamente para indicar la compatibilidad con los navegadores Mozilla. Ahora representa un prefijo añadido 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 en el que se basa Chrome.
  • KHTML, como Gecko: compatibilidad con el motor KHTML y el motor de diseño Gecko utilizados por Mozilla.
  • Chrome/125.0.0.0: nombre y versión del navegador.
  • Safari/537.36: Compatibilidad con Safari.

En pocas palabras, el agente de usuario identifica si la solicitud proviene de un navegador conocido o de otro tipo de software.

Los bots de scraping y los scripts de automatización de navegadores tienden a utilizar cadenas de agente de usuario predeterminadas o inconsistentes. Estas revelan su naturaleza automatizada a los ojos de las soluciones antiscraping, que protegen los datos de las páginas web mediante la supervisión de las solicitudes entrantes. Al examinar el encabezado User-Agent, pueden 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 Selenium?

El encabezado User-Agent establecido por Selenium al realizar la solicitud HTTP GET para recuperar una página web depende del navegador controlado y de si se encuentra en modo con encabezado o sin encabezado. 

Nota: En este artículo, utilizaremos Selenium en Python y lo configuraremos para que funcione en Chrome. Sin embargo, puede ampliar fácilmente lo que aprenderá aquí a diferentes lenguajes de programación y navegadores.

Para ver la cadena del agente de usuario de Selenium, cree un script básico de automatización del navegador que visite la página httpbin. io/user-agent. No es más que una API que devuelve el encabezado User-Agent de la solicitud entrante.

Importa selenium, inicializa una instancia de Chrome, visita la página deseada e imprime su contenido:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

# habilitar el modo sin interfaz gráfica en Selenium

options = Options()

# options.add_argument('--headless')

# inicializar una instancia de Chrome

driver = webdriver.Chrome(

    options=options,

)

# visitar la página deseada

driver.get("https://httpbin.org/user-agent")

# obtener el contenido de la página

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# imprimir el contenido de la página

print(user_agent_info)

# cerrar el navegador

driver.quit()

Ejecute el script Python anterior y se registrará en la terminal algo similar a:

{

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

}

El valor corresponde al encabezado User-Agent establecido por Chrome en el momento de escribir este artículo. Esto no debería sorprenderle, ya que Selenium funciona en una ventana de navegador real.

Al mismo tiempo, Selenium suele estar configurado para controlar instancias de navegador sin interfaz gráfica. El motivo es que cargar la interfaz de usuario de un navegador consume muchos recursos y no aporta ninguna ventaja en la producción. Por lo tanto, descomente la opción --headless para ejecutar el script en modo sin interfaz gráfica. En esta ocasión, el resultado será:

{

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

}

Como puede ver, Chrome/125.0.0.0 ha sido sustituido por HeadlessChrome/125.0.6422.142. Este valor identifica claramente la solicitud como procedente de una herramienta de automatización del navegador, ya que ningún usuario humano utilizaría nunca un navegador sin interfaz gráfica. La consecuencia es que los sistemas antibots pueden marcar dicha solicitud como procedente de un bot y bloquearla. ¡Por eso es tan importante establecer el valor del agente de usuario Selenium!

Encuentre más información en nuestra guía sobre el Scraping web con Selenium.

Cómo cambiar el agente de usuario en Selenium

Selenium ofrece dos formas de establecer el valor del agente de usuario. ¡Veámoslas ambas!

Establecer el agente de usuario de forma global

Entre las opciones compatibles con Chrome, también se encuentra el indicador --user-agent. Este le permite especificar el agente de usuario global que debe utilizar el proceso de Chrome al visitar páginas web en sus pestañas o ventanas.

Configure un agente de usuario global en Selenium con Python como se indica a continuación:

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

options = Options()

# establecer un agente de usuario personalizado en la opción del navegador

options.add_argument(f'--user-agent={custom_user_agent}')

# otras opciones...

# inicializar una instancia de Chrome con un agente de usuario personalizado

driver = webdriver.Chrome(

    options=options,

)

Combínalo todo y comprueba que funciona con el siguiente script:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

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

options = Options()

# establecer un agente de usuario personalizado en la opción del navegador

options.add_argument(f'--user-agent={custom_user_agent}')

# habilitar el modo sin interfaz gráfica

options.add_argument('--headless')

# inicializar una instancia de Chrome sin interfaz gráfica con un agente de usuario personalizado

driver = webdriver.Chrome(

    options=options,

)

# visitar la página deseada

driver.get("https://httpbin.org/user-agent")

# obtener el contenido de la página

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# imprimir el contenido de la página

print(user_agent_info)

# cerrar el navegador

driver.quit()

Ahora, ejecute el script y 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"

}

Esto coincide con el agente de usuario especificado en la cadena custom_user_agent. En concreto, el navegador controlado a través de Selenium ahora expone el valor del agente de usuario de un navegador con encabezado, incluso si está en modo sin encabezado. Ese truco debería ser suficiente para engañar a las soluciones antibots menos complejas.

La principal desventaja de este enfoque es que solo se puede establecer el indicador --user-agent una vez, durante la configuración de la instancia del navegador. Una vez especificado, el agente de usuario personalizado se utilizará en toda la sesión de navegación, sin posibilidad de cambiarlo sobre la marcha antes de una llamada get().

Establecer el agente de usuario localmente

Los comandosdel protocolo Chrome Devtools Protocol (CDP) le permiten comunicarse con un navegador Chrome en ejecución. En concreto, le ofrecen la posibilidad de cambiar dinámicamente los valores predeterminados y las configuraciones establecidas por el navegador.

Puede ejecutar un comando CDP en Selenium utilizando el método execute_cdp_cmd() expuesto por el objeto controlador. En concreto, el comando CDP Network.setUserAgentOverride sustituye el agente de usuario por la cadena dada. Utilícelo para cambiar localmente el agente de usuario en Selenium como se indica a continuación:

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

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

Comprueba que este enfoque te permite actualizar el agente de usuario varias veces dentro de la misma sesión de navegación con la siguiente lógica:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

options = Options()

# habilitar el modo sin interfaz gráfica

options.add_argument('--headless')

# inicializar una instancia de Chrome sin interfaz gráfica

driver = webdriver.Chrome(

    options=options,

)

# configurar un agente de usuario personalizado

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

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# visitar la página deseada

driver.get("https://httpbin.org/user-agent")

# obtener el contenido de la página e imprimirlo

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# establecer otro agente de usuario

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

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# recargar la página

driver.refresh()

# imprimir el contenido de la página

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# cerrar el navegador

driver.quit()

Ejecute el script anterior y obtendrá el siguiente resultado:

{

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

}

{

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

}

¡Genial! Dos cadenas de agente de usuario Selenium diferentes en la misma sesión de navegación.

Implementar la rotación de agentes de usuario en Selenium

Establecer un encabezado de agente de usuario no headless puede no ser suficiente para superar los antibots. El problema es que demasiadas solicitudes procedentes de la misma dirección IP y con los mismos encabezados pueden revelar la naturaleza automatizada de su script de Selenium. 

La clave para evitar la detección de bots es aleatorizar sus solicitudes, por ejemplo, implementando la rotación de agentes de usuario. La idea detrás de este enfoque es seleccionar aleatoriamente un agente de usuario antes de navegar a una página en Selenium. De esa manera, sus solicitudes automatizadas parecerán provenir de diferentes navegadores, lo que reduce el riesgo de activar bloqueos y prohibiciones.

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

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

Obtenga algunos agentes de usuario adecuados de un portal como User Agent String.com y guárdelos en una matriz de Python de la siguiente manera:

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 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, como Gecko) Versión/17.4.1 Safari/605.1.15»

    # otros agentes de usuario...

]

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

Defina una función personalizada para establecer el agente de usuario aleatorio en el objeto del controlador web Selenium:

def set_user_agent(driver):

    # establecer el agente de usuario...

Importa el paquete aleatorio de la biblioteca estándar de Python para prepararte para seleccionar aleatoriamente un agente de usuario de la lista user_agents:

import random

Utilice la función random.choice() para extraer aleatoriamente una cadena de agente de usuario de la matriz:

random_user_agent = random.choice(user_agents)

A continuación, asígnelo a la ventana de Chrome con la función execute_cdp_cmd():

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Tu función set_user_agent() ahora contendrá:

def set_user_agent(driver):

    # selecciona aleatoriamente una cadena de agente de usuario de la lista

    random_user_agent = random.choice(user_agents)

    # establece el agente de usuario en el controlador

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Paso n.º 3: establecer el agente de usuario aleatorio

Antes de navegar a una página con get(), llama a la función set_user_agent() para cambiar el agente de usuario de Selenium:

# establecer un agente de usuario personalizado

set_user_agent(driver)

# visitar la página deseada

driver.get("https://httpbin.org/user-agent")

Paso 4: Combinar todo

Así es como se verá su script de rotación de agente de usuario de Python Selenium:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

import random

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 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

]

def set_user_agent(driver):

    # selecciona aleatoriamente una cadena de agente de usuario de la lista

    random_user_agent = random.choice(user_agents)

    # establece el agente de usuario en el controlador

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

options = Options()

# habilitar el modo sin interfaz gráfica

options.add_argument('--headless')

# inicializar una instancia de Chrome sin interfaz gráfica

driver = webdriver.Chrome(

    options=options,)



# establecer un agente de usuario personalizado

set_user_agent(driver)

# visitar la página deseada

driver.get("https://httpbin.org/user-agent")

# obtener el contenido de la página e imprimirlo

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# cerrar el navegador

driver.quit()

Ejecute este script varias veces y observe que imprimirá diferentes cadenas de agente de usuario.

¡Et voilà! Ahora ya es un experto en cambiar el agente de usuario en Selenium.

Conclusión

En esta guía, ha aprendido la importancia del encabezado User-Agent y cómo anularlo en Selenium. Esta técnica le permite engañar a los sistemas antibots básicos para que piensen que sus solicitudes provienen de un navegador legítimo sin cabeza. Sin embargo, es posible que las soluciones avanzadas sigan siendo capaces de detectarle y bloquearle. Para evitar las prohibiciones de IP, podría integrar un Proxy con Selenium, ¡pero incluso eso podría no ser suficiente!

Evita esos problemas con el Navegador de scraping, un navegador de última generación que se integra con Selenium y cualquier otra herramienta de automatización de navegadores. El Navegador de scraping puede eludir sin esfuerzo las tecnologías antibots por ti, al tiempo que evita la huella digital del navegador. En segundo plano, se basa en funciones como la rotación del agente de usuario, la rotación de IP y la Resolución de CAPTCHA. ¡La automatización del navegador nunca ha sido tan fácil!