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!