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''])