web-dev-qa-db-ja.com

Seleniumドライバーのユーザーエージェントを変更する

Pythonに次のコードがあります:

from Selenium.webdriver import Firefox
from contextlib import closing

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

User-agent HTTPヘッダーを印刷し、場合によっては変更したいと思います。出来ますか?

56
xralf

Seleniumには、要求または応答ヘッダーを読み取る方法はありません。このような情報を記録するプロキシを介して接続するようにブラウザに指示することにより、それを行うことができます。

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

上記の両方の方法がテストされ、機能することがわかりました。他のブラウザについては知りません。

ユーザーエージェントの取得

Seleniumには、WebDriverのインスタンスからユーザーエージェントを照会するメソッドがありません。 Firefoxの場合でも、カスタム値に設定されていない場合にgeneral.useragent.overrideが何であるかを確認しても、デフォルトのユーザーエージェントを見つけることはできません。 (この設定は、何らかの値に設定されるまでexistではありません。)

ただし、ブラウザが起動したら、次を実行してユーザーエージェントを取得できます。

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

agent変数にはユーザーエージェントが含まれます。

109
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とは異なり、これがnotを返し、カスタム設定を返すことです:

driver.execute_script("return navigator.userAgent")

だから、誰かがPhantomJSでそれを行う方法を見つけたら、私の答えを編集するか、下にコメントを追加してください!乾杯。

14
JJC

ルイの有益な答えに基づくJJCの有益な答えに基づいて...

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'])
0
J. Does

これは、リクエスト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のwebdriver.pyのソースコード( https://github.com/SeleniumHQ/Selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/py/Selenium/webdriver/chrome/ webdriver.py )Chrome Devtools Protocolを通じて機能を拡張します

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

Chrome Devtools Protocol Viewerを使用して、さらに拡張された機能をリストできます( https://chromedevtools.github.io/devtools-protocol/tot/Network#method-setUserAgentOverride )使用するパラメータタイプも同様です。

0
Nioooooo