将 user-agent 更改为 Selenium web-driver

Change user-agent for Selenium web-driver

我在Python中有以下代码:

from selenium.webdriver import Firefox
from contextlib import closing

with closing(Firefox()) as browser:
  browser.get(url)

我想打印 user-agent HTTP header 和 可能改变它。可能吗?

Selenium 无法读取请求或响应 headers。您可以通过指示浏览器通过记录此类信息的代理进行连接来实现。

在 Firefox 中设置用户代理

更改 Firefox 用户代理的常用方法是在您的 Firefox 配置文件中设置变量 "general.useragent.override"。请注意,这与 Selenium 无关。

您可以指示 Selenium 使用与默认配置文件不同的配置文件,如下所示:

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

在Chrome

中设置用户代理

对于Chrome,您要做的是使用user-agent命令行选项。同样,这不是 Selenium 的东西。您可以在命令行中使用 chrome --user-agent=foo 调用 Chrome 以将代理设置为值 foo.

对于 Selenium,您可以这样设置:

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)

以上两种方法都经过测试,发现有效。我不知道其他浏览器。

获取用户代理

Selenium 没有从 WebDriver 的实例中查询用户代理的方法。即使在 Firefox 的情况下,您也无法通过检查 general.useragent.override 如果未设置为自定义值会是什么来发现默认用户代理。 (此设置在设置为某个值之前不存在。)

然而,一旦浏览器启动,您可以通过执行以下命令获取用户代理:

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

agent 变量将包含用户代理。

以 Louis 的有用回答为基础...

在 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)

唯一的小问题是,与 Firefox 和 Chrome 不同,这 不是 return 您的自定义设置:

driver.execute_script("return navigator.userAgent")

所以,如果有人知道如何在 PhantomJS 中做到这一点,请编辑我的答案或在下面添加评论!干杯。

以 JJC 的有用答案为基础构建 Louis 的有用答案...

对于 PhantomJS 2.1.1-windows 此行有效:

driver.execute_script("return navigator.userAgent")

如果它不起作用,您仍然可以通过日志获取用户代理(以 Mma's answer 为基础):

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

这是动态更改请求 UserAgent 的简短解决方案。

使用 Chrome

更改请求的 UserAgent
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')

然后 return 您的用户代理:

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

一些来源

来自 SeleniumHQ (https://github.com/SeleniumHQ/selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/py/selenium/webdriver/chrome/webdriver.py) 的 webdriver.py 的源代码通过 Chrome Devtools 协议

扩展了它的功能
def execute_cdp_cmd(self, cmd, cmd_args):
        """
        Execute Chrome Devtools Protocol command and get returned result

我们可以使用 Chrome Devtools 协议查看器来列出更多扩展功能 (https://chromedevtools.github.io/devtools-protocol/tot/Network#method-setUserAgentOverride) 以及要使用的参数类型。

Firefox 配置文件已弃用,您必须像这样在 Firefox 选项中使用它:

opts = FirefoxOptions()
opts.add_argument("--headless")
opts.add_argument("--width=800")
opts.add_argument("--height=600")
opts.set_preference("general.useragent.override", "userAgent=Mozilla/5.0 
(iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like 
Gecko) CriOS/101.0.4951.44 Mobile/15E148 Safari/604.1")