このチュートリアルでは以下について説明します:
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.0
はHeadlessChrome/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解決などの機能に依拠しています。ブラウザの自動化は、かつてないほど簡単になりました!
クレジットカードは必要ありません