更改selenium驱动程序的用户代理

xra*_*alf 57 python selenium user-agent http-headers

我有以下代码Python:

from selenium.webdriver import Firefox
from contextlib import closing

with closing(Firefox()) as browser:
  browser.get(url)
Run Code Online (Sandbox Code Playgroud)

我想打印用户代理HTTP标头,并可能更改它.可能吗?

Lou*_*uis 114

Selenium无法读取请求或响应标头.您可以通过指示浏览器通过记录此类信息的代理进行连接来完成此操作.

在Firefox中设置用户代理

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

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

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

在Chrome中设置用户代理

使用Chrome,您要执行的操作是使用user-agent命令行选项.同样,这不是Selenium的事情.您可以在命令行中调用Chrome,chrome --user-agent=foo以将代理设置为值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)
Run Code Online (Sandbox Code Playgroud)

上述两种方法都经过测试并发现有效.我不知道其他浏览器.

获取用户代理

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

但是,启动浏览器后,您可以通过执行以下命令获取用户代理:

agent = driver.execute_script("return navigator.userAgent")
Run Code Online (Sandbox Code Playgroud)

agent变量将包含用户代理.

  • 我在第一个代码片段中的答案中处理了Firefox.另外,`User-Agent`绝对**是**请求头.参见[第14.43节](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html):"User-Agent**请求标题字段**包含有关发起请求的用户代理的信息. " (强调我的.) (2认同)

JJC*_*JJC 14

以路易斯的有用答案为基础......

在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)
Run Code Online (Sandbox Code Playgroud)

唯一的小问题是,不像Firefox和Chrome,这并没有返回您的自定义设置:

driver.execute_script("return navigator.userAgent")
Run Code Online (Sandbox Code Playgroud)

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


Nio*_*ooo 13

这是动态更改请求 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')
Run Code Online (Sandbox Code Playgroud)

然后返回您的用户代理:

agent = driver.execute_script("return navigator.userAgent")
Run Code Online (Sandbox Code Playgroud)

一些来源

来自 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
Run Code Online (Sandbox Code Playgroud)

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


小智 11

Firefox Profile 已弃用,您必须在 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")
Run Code Online (Sandbox Code Playgroud)