更改Selenium Web驱动程序的用户代理


73

我在以下代码中Python

from selenium.webdriver import Firefox
from contextlib import closing

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

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

Answers:


162

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

在Firefox中设置用户代理

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

您可以指示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命令行选项。再次,这不是硒的事情。您可以在命令行调用Chrome,chrome --user-agent=foo以将代理设置为value 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变量将包含用户代理。


请注意,我有from selenium.webdriver import Firefox。我试图弄清楚如何Firefox从导入我的配置文件selenium.webdriver
xralf 2015年

1
用户代理不是请求或响应头,而是通用头。
xralf 2015年

2
我在第一个代码段的答案中使用了Firefox。另外,User-Agent绝对请求标头。请参阅第14.43节:“用户代理请求标头字段包含有关发起请求的用户代理的信息。” (着重于我。)
路易(Louis

好的,我将其与代码结合在一起。因此,对于设置用户代理,有一个set_preference方法。是否也有类似get_preference的东西,才能知道以前的情况?
xralf 2015年

没错,这是一个请求标头字段。在书中,HTTP要点(第56页)是错误的。
xralf 2015年

17

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

在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,这并没有返回您的自定义设置:

driver.execute_script("return navigator.userAgent")

因此,如果有人知道如何在PhantomJS中执行此操作,请编辑我的答案或在下面添加评论!干杯。


我做到了,但是运行此消息时发布了此消息:http.client.RemoteDisconnected:远端无响应的关闭连接
hamed baziyad

6

这是一种快速更改请求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')

然后返回您的用户代理:

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)以及要使用的参数类型。


0

要建立在JJC的有用答案的基础上,而JJC的有用答案是在Louis的有用答案的基础上...

使用PhantomJS 2.1.1-windows,此行有效:

driver.execute_script("return navigator.userAgent")

如果它不起作用,您仍然可以通过日志获取用户代理(以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'])

嗨,您能告诉我这部分的“ your_path”是什么意思:driver = webdriver.PhantomJS(executable_path = r“ your_path”,wanted_capabilities = dcap)
hamed baziyad 18/09/30

我猜您想在“ bin文件”中说“ phantomjs.exe”的地址。
hamed baziyad

我这样做了,但是此消息将为我发布:http.client.RemoteDisconnected:远端封闭的连接没有响应
hamed baziyad

我已经做到了,但是我看不到浏览器的任何变化都是“在远程控制之下”的。你能分析一下吗?
hamed baziyad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.