python selenium http-headers user-agent

python - Cambiar agente de usuario para el controlador de selenio



selenium http-headers (4)

Tengo el siguiente código en Python :

from selenium.webdriver import Firefox from contextlib import closing with closing(Firefox()) as browser: browser.get(url)

Me gustaría imprimir el encabezado HTTP del agente de usuario y posiblemente cambiarlo. ¿Es posible?


Esta es una solución corta para cambiar la solicitud UserAgent sobre la marcha.

Cambiar UserAgent de una solicitud con Chrome

from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities driver = webdriver.Chrome(driver_path) driver.execute_cdp_cmd(''Network.setUserAgentOverride'', {"userAgent":"python 2.7", "platform":"Windows"}) driver.get(''http://amiunique.org'')

luego devuelva su useragent:

agent = driver.execute_script("return navigator.userAgent")

Algunas fuentes

El código fuente de webdriver.py de SeleniumHQ ( https://github.com/SeleniumHQ/selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/py/selenium/webdriver/chrome/webdriver.py ) extiende sus funcionalidades a través del protocolo Chrome Devtools.py)

def execute_cdp_cmd(self, cmd, cmd_args): """ Execute Chrome Devtools Protocol command and get returned result

Podemos usar el Visor de protocolo de Chrome Devtools para enumerar funcionalidades más extendidas ( https://chromedevtools.github.io/devtools-protocol/tot/Network#method-setUserAgentOverride ), así como el tipo de parámetros a utilizar.


No hay forma en Selenium para leer los encabezados de solicitud o respuesta. Puede hacerlo indicando a su navegador que se conecte a través de un proxy que registra este tipo de información.

Configuración del agente de usuario en Firefox

La forma habitual de cambiar el agente de usuario para Firefox es establecer la variable "general.useragent.override" en su perfil de Firefox. Tenga en cuenta que esto es independiente del selenio.

Puede indicarle a Selenium que use un perfil diferente al predeterminado, como este:

from selenium import webdriver profile = webdriver.FirefoxProfile() profile.set_preference("general.useragent.override", "whatever you want") driver = webdriver.Firefox(profile)

Configurar el agente de usuario en Chrome

Con Chrome, lo que quiere hacer es usar la opción de línea de comando de user-agent . De nuevo, esto no es una cosa de selenio. Puede invocar Chrome en la línea de comando con chrome --user-agent=foo para establecer el agente en el valor foo .

Con Selenium lo configura así:

from selenium import webdriver from selenium.webdriver.chrome.options import Options opts = Options() opts.add_argument("user-agent=whatever you want") driver = webdriver.Chrome(chrome_options=opts)

Ambos métodos anteriores fueron probados y se encontró que funcionaban. No sé sobre otros navegadores.

Obtener el agente de usuario

Selenium no tiene métodos para consultar al agente de usuario desde una instancia de WebDriver . Incluso en el caso de Firefox, no puede descubrir el agente de usuario predeterminado comprobando qué general.useragent.override sería si no se establece en un valor personalizado. (Esta configuración no existe antes de establecerla en algún valor).

Sin embargo, una vez que se inicia el navegador, puede obtener el agente de usuario ejecutando:

agent = driver.execute_script("return navigator.userAgent")

La variable de agent contendrá el agente de usuario.


Para aprovechar la útil respuesta de Louis ...

Configuración del agente de usuario en PhantomJS

from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities ... caps = DesiredCapabilities.PHANTOMJS caps["phantomjs.page.settings.userAgent"] = "whatever you want" driver = webdriver.PhantomJS(desired_capabilities=caps)

El único problema menor es que, a diferencia de Firefox y Chrome, esto no devuelve su configuración personalizada:

driver.execute_script("return navigator.userAgent")

Entonces, si alguien descubre cómo hacerlo en PhantomJS, edite mi respuesta o agregue un comentario a continuación. Aclamaciones.


Para construir sobre la útil respuesta de JJC que se basa en la útil respuesta de Louis ...

Con PhantomJS 2.1.1-windows esta línea funciona:

driver.execute_script("return navigator.userAgent")

Si no funciona, aún puede obtener el agente de usuario a través del registro (para construir sobre la respuesta de Mma ):

from selenium import webdriver import json from fake_useragent import UserAgent dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] = (UserAgent().random) driver = webdriver.PhantomJS(executable_path=r"your_path", desired_capabilities=dcap) har = json.loads(driver.get_log(''har'')[0][''message'']) # get the log print(''user agent: '', har[''log''][''entries''][0][''request''][''headers''][1][''value''])