Seleniumユーザーエージェントガイド:設定と変更

SeleniumでUser-Agentヘッダーを設定およびローテーションして、Webスクレイピング機能を強化し、ボット対策を回避する方法を学びましょう。
5 min read
Selenium User Agent Guide Setting and Changing

このチュートリアルでは以下について説明します:

  • User-Agentヘッダーが非常に重要な理由
  • ヘッドブラウザとヘッドレスブラウザ両方におけるデフォルトのSeleniumユーザーエージェント値
  • Seleniumでユーザーエージェントを変更する方法
  • Seleniumでユーザーエージェントのローテーションを実装する方法

さっそく始めましょう!

User-Agentヘッダーが重要な理由

User-Agentヘッダーは、HTTPリクエストを行うクライアントソフトウェアを識別する文字列です。通常、リクエストの元となったブラウザやアプリケーションの種類、オペレーティングシステム、アーキテクチャに関する情報が含まれます。これは通常、ブラウザ、HTTP クライアント、またはWebリクエストを実行するその他のアプリケーションによって設定されます。

たとえば、この記事の執筆時点でChromeにより設定されたユーザーエージェントは次のとおりです:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

このユーザーエージェント文字列の構成要素は次のとおりです。

  • Mozilla/5.0:以前はMozillaブラウザーとの互換性を示すために使用されていました。互換性上の理由から追加されるプレフィックスを表すようになりました。
  • Windows NT 10.0; Win64; x64:オペレーティングシステム(Windows NT 10.0)、プラットフォーム(Win64)、アーキテクチャ(x64)。
  • AppleWebKit/537.36:Chromeが依存しているブラウザエンジン。
  • KHTML(Geckoなど):Mozillaが使用しているKHTMLエンジンおよびGeckoレイアウトエンジンとの互換性。
  • Chrome/125.0.0.0:ブラウザ名とバージョン。
  • Safari/537.36:Safariとの互換性。

簡単に言えば、ユーザーエージェントは、リクエストが知名度の高いブラウザから送信されたのか、別の種類のソフトウェアから送信されたのかを識別します。

スクレイピングボットとブラウザ自動化スクリプトは、デフォルトまたは一貫性のないユーザーエージェント文字列を使用する傾向があります。この傾向が、受信リクエストを監視してWebページのデータを保護するスクレイピング対策ソリューションに、その自動化された性質を晒け出してしまいます。User-Agentヘッダーを見れば、アクセス中のユーザーが正規のユーザーかボットか分かります。

詳細は、「WebスクレイピングにおけるUser-Agent」に関するガイドをご覧ください。

デフォルトのSeleniumユーザーエージェントとは

Webページを取得するためにHTTP GETリクエストを行うとき、Seleniumが設定するUser-Agentヘッダーは、制御対象のブラウザと、ヘッダーモードかヘッドレスモードかに依存します。

:この記事では、PythonでSeleniumを使用して、Chromeで動作するように設定します。ただし、ここで学ぶ内容はさまざまなプログラミング言語やブラウザに簡単に応用できます。

Seleniumユーザーエージェント文字列を確認するには、httpbin.io /user-agentページにアクセスする基本的なブラウザ自動化スクリプトを作成してください。これは、受信リクエストのUser-Agentヘッダーを返すAPIにすぎません。

seleniumをインポートし、Chromeインスタンスを初期化し、目的のページにアクセスして、そのコンテンツを出力してください:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

# enable headless mode in Selenium

options = Options()

# options.add_argument('--headless')

# initialize a Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

上記のPythonスクリプトを起動すると、次のようにターミナルにログインします:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

この値は、この記事の執筆時点でChromeにより設定されたUser-Agentヘッダーに対応しています。Seleniumは実際のブラウザウィンドウ上で動作するため、これを不思議に思う必要はありません。

同時に、Seleniumは通常、ヘッドレスブラウザインスタンスを制御するように設定されています。その理由は、ブラウザのUIをロードすると多くのリソースが必要になり、稼働中の環境では何のメリットもないからです。そのため、--headlessオプションをアンコメントして、スクリプトをヘッドレスモードで実行してください。今回の結果は次のようになります:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/125.0.6422.142 Safari/537.36"

}

ご覧のとおり、Chrome/125.0.0.0HeadlessChrome/125.0.6422.142に置き換えられました。人間のユーザーがヘッドレスブラウザを使用することはないため、この値によってリクエストがブラウザ自動化ツールからのものであることが明確に示されます。その結果、ボット対策システムはそうしたリクエストをボット由来としてマークし、ブロックすることができます。これが、Seleniumユーザーエージェント値を設定することが非常に重要な理由です。

詳細は「Selenium Webスクレイピングガイド」をご覧ください。

Seleniumでユーザーエージェントを変更する方法

Seleniumには、ユーザーエージェント値を設定する方法が2つあります。両方とも掘り下げてみましょう!

ユーザーエージェントをグローバルに設定する

Chromeでサポートされているオプションの中には、--user-agentフラグもあります。これにより、ChromeプロセスがタブまたはウィンドウでWebページにアクセスするときに使用するグローバルユーザーエージェントを指定できます。

PythonでSeleniumのグローバルユーザーエージェントを以下のように設定します:

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# other options...

# initialize a Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

すべてを組み合わせて、次のスクリプトで動作することを確認してください:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

このスクリプトを起動すると、次のように出力されます:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

これはcustom_user_agent文字列で指定されたユーザーエージェントと一致します。特筆するべきなのは、Seleniumを介して制御されるブラウザが、ヘッドレスモードであっても、ヘッドブラウザのユーザーエージェント値を公開するようになったことです。このトリックは、それほど洗練されていないボット対策ソリューションを欺くには十分なはずです。

この方法の主な欠点は、ブラウザインスタンスのセットアップ中に--user-agentフラグを一度しか設定できないことです。一度指定すると、カスタムユーザーエージェントはブラウジングセッション全体で使用され、get()呼び出しの前にその場で変更することはできません。

ユーザーエージェントをローカルで設定する

Chrome Devtoolsプロトコル(CDP)コマンドを使用すると、実行中のChromeブラウザと通信できます。特に、ブラウザによって設定されたデフォルト値と構成を動的に変更することができます。

SeleniumでCDPコマンドを実行するには、driverオブジェクトによって公開されているexecute_cdp_cmd()メソッドを使用します。具体的には、Network.SetUserAgentOverride CDPコマンドが、指定された文字列でユーザーエージェントをオーバーライドします。これを使用して、以下のようにSeleniumのユーザーエージェントをローカルで変更します:

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

次のロジックを使用して、同じブラウジングセッション内でユーザーエージェントを複数回更新できることを確認してください:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# configure a custom user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# set another user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# reload the page

driver.refresh()

# print the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

上記のスクリプトを起動すると、以下が生成されます:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

}

完了です!同じブラウジングセッション内の2つの異なるSeleniumユーザーエージェント文字列。

Seleniumでのユーザーエージェントローテーションの実装

ヘッドレスでないUser-Agentヘッダーを設定するだけでは、ボット対策の克服には不十分かもしれません。問題は、同じヘッダーを持ち同じIPアドレスから送信されるリクエストが多すぎると、Seleniumスクリプトの自動化された性質が明るみに出る可能性があることです。

ボット検出を回避する鍵は、ユーザーエージェントローテーションを実装するなどして、リクエストをランダム化することです。このアプローチの背後には、あるページにSeleniumで移動する前に、ユーザーエージェントをランダムに選択するというアイデアがあります。そうすれば、自動化されたリクエストが別のブラウザ由来として表示されるため、ブロックやアクセス制限が発生するリスクが軽減されます。

それでは以下の手順に従って、Seleniumでユーザーエージェントローテーションを実装する方法を学びましょう。

ステップ1:ユーザーエージェントのリストを取得する

User Agent String.comなどのポータルから適切なユーザーエージェントを入手し、次のようにPython配列に保存してください:

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

    # other user agents...

]

ステップ2:ランダムなユーザーエージェントを抽出する

Selenium Web ドライバーオブジェクトにランダムなユーザーエージェントを設定するカスタム関数を定義してください:

def set_user_agent(driver):

    # set the user agent...

Python標準ライブラリからrandomパッケージをインポートして、user_agentsリストからユーザーエージェントをランダムに選択する準備をしてください:

import random

random.choice()関数を使用して、配列からユーザーエージェント文字列をランダムに抽出してください:

random_user_agent = random.choice(user_agents)

次に、execute_cdp_cmd()関数を使用してChromeウィンドウに割り当ててください:

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

これでset_user_agent()関数には次の内容が含まれます:

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

ステップ3:ランダムユーザーエージェントの設定

get()のあるページに移動する前に、set_user_agent()関数を呼び出してSeleniumユーザーエージェントを変更してください:

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

ステップ4:仕上げ

Python Seleniumユーザーエージェントローテーションスクリプトは次のようになります:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

import random

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

]

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

このスクリプトを数回実行すると、異なるユーザーエージェント文字列が出力されることに注意してください。

ほら、このとおり!これで、Seleniumのユーザーエージェント変更をマスターできました。

まとめ

このガイドでは、User-Agentヘッダーの重要性と、それをSeleniumでオーバーライドする方法を学びました。この手法により、基本的なボット対策システムを欺いて、ヘッドレスでない正規のブラウザから送信されたリクエストと勘違いさせることができます。ただし、高度なソリューションは、これらも検出してブロックできる場合があります。IPアドレス制限を防ぐには、プロキシとSeleniumを併用することもできますが、それでも十分ではないかもしれません。

Seleniumやその他のブラウザ自動化ツールと統合できる次世代ブラウザ、Scraping Browserでこうした煩わしさを解消できます。Scraping Browserを使用すると、ブラウザフィンガープリントを回避しながら、ボット対策テクノロジーを簡単にバイパスできます。このブラウザは、具体的なシステムとしては、ユーザーエージェントローテーション、IPローテーションCAPTCHA解決などの機能に依拠しています。ブラウザの自動化は、かつてないほど簡単になりました!