このガイドでは以下を学びます:
- – User-Agentヘッダーとは何か、そしてなぜそれが重要なのか
- デフォルトのcURLユーザーエージェントヘッダーの内容
- cURLユーザーエージェント文字列を設定する2つのアプローチ
- cURLでユーザーエージェントローテーションロジックを実装する方法
さっそく見ていきましょう!
ユーザーエージェントとは何か?なぜ重要なのか?
ユーザーエージェントとは、ブラウザやWebリクエストを行うアプリケーション、HTTPクライアントがUser-AgentHTTPヘッダーに設定する文字列であり、リクエストの発信元であるクライアントソフトウェアを識別するために使用されます。この文字列には通常、ブラウザ/アプリケーションの種類、オペレーティングシステム、その他の詳細情報が含まれます。
例えば、Chromeリクエストからの実際のユーザーエージェント文字列は以下の通りです:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
このヘッダーの情報は、リクエストが既知のブラウザからか、他のソフトウェアからかを判断する上で極めて重要です。スクレイピングボットは一貫性のない、あるいはデフォルトのユーザーエージェント文字列を使用する傾向があり、自動化された性質を露呈します。したがって、ユーザーエージェントヘッダーは、現在のユーザーが本物かボットかをアンチボットソリューションが理解するのに役立ちます。
詳細については、ウェブスクレイピング向けユーザーエージェントガイドをご覧ください。
デフォルトのcURLユーザーエージェントとは?
ほとんどのHTTPクライアントと同様に、cURLはHTTPリクエスト時にUser-Agentヘッダーを設定します。具体的には、cURLのユーザーエージェント文字列は次の通りです:
curl/X.Y.Z
ここで X.Y.Z は、お使いのマシンにインストールされている cURL のバージョンです。
これを確認するには、httpbin.ioプロジェクトの/user-agentエンドポイントにcURLリクエストを送信してください。このAPIは呼び出し元が設定したUser-Agentヘッダー文字列を返します。
以下のコマンドでcURLから/user-agentへのGETリクエストを実行してください:
curl "https://httpbin.io/user-agent"
注: Windowsでは、curlをcurl.exeに置き換えてください。これは、curlがPowerShellのInvoke-WebRequestへのエイリアスであるのに対し、curl.exeはcURLのWindows実行ファイルを指すためです。
エンドポイントは以下のような結果を返すはずです:
{
"user-agent": "curl/8.4.0"
}
ご覧の通り、cURLが設定するユーザーエージェントはcurl/8.4.0です。これは好ましくありません。なぜなら、リクエストがcURLから送信されたものであることが明確に識別されるためです。サイトがページやデータを保護するために採用しているボット対策ソリューションは、このリクエストを容易に「実際のユーザーからのものではない」と判定し、それに応じてブロックする可能性があります。
cURLのユーザーエージェントヘッダー文字列の設定方法を知る必要がある理由がここにあります。
cURLユーザーエージェントヘッダーの設定方法
cURLでユーザーエージェントを設定するには2つの方法があります。両方を見ていきましょう!
カスタムユーザーエージェントを直接設定する
ユーザーエージェントの設定は非常に一般的であるため、cURLにはそのための専用オプションが用意されています。具体的には、-A または –user-agentオプションを使用すると、cURLが発行するHTTPリクエストのUser-Agentヘッダーに設定する文字列を指定できます。
このオプションを使用したcURLユーザーエージェントヘッダーの設定構文は以下の通りです:
curl -A|--user-agent "<user-agent_string>" "<url>"
次の例を考えてみましょう:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
出力は次のようになります:
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
素晴らしい!httpbin.ioの/user-agentエンドポイントで検出されたユーザーエージェントは、リクエストで設定されたものと同一です。
上記のリクエストは以下と同等であることに留意してください:
curl --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
推奨はされませんが、User-Agentヘッダーを完全に解除するには、-Aオプションに空の文字列を渡します。httpbin.ioの/headersエンドポイントにリクエストを送信し、受信リクエストのヘッダーを確認することでこれを検証できます:
curl -A "" "https://httpbin.io/headers"
結果は次のようになります:
{
"headers": {
"Accept": [
"*/*"
],
"Host": [
"httpbin.io"
]
}
}
予想通り、User-Agentヘッダーは存在しません。
User-Agentヘッダーは保持しつつ空の値を指定したい場合は、-Aオプションにスペース文字列を1つ渡します:
curl -A " " "https://httpbin.io/headers"
この場合、エンドポイントは以下を返します:
{
"headers": {
"Accept": [
"*/*"
],
"Host": [
"httpbin.io"
],
"User-Agent": [
""
]
}
}
User-Agent 文字列の値が空であることに注意してください。
カスタム User-Agent ヘッダーの設定
結局のところ、User-Agentは単なるHTTPヘッダーに過ぎません。つまり、cURLでは他のHTTPヘッダーと同様に、-Hまたは –headerオプションを使用して設定できます:
curl -H|--header "User-Agent: <user-agent_string>" "<url>"
完全なチュートリアルについては、cURLでHTTPヘッダーを送信する方法に関するガイドを参照してください。
以下の例で -H オプションの実行例を確認してください:
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
HTTPヘッダーは大文字小文字を区別しない設計であるため、User-Agentとuser-agentは同等です。
結果は次のようになります:
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
素晴らしい!ユーザーエージェント値が意図した通りに設定されました。
上記のcURLコマンドは以下と同等です:
curl --header "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
特殊なユースケースでは、以下の2つのcURLユーザーエージェントヘッダー文字列を検討してください:
- “User-Agent:” はリクエストから User-Agent ヘッダーを削除します。
- “User-Agent: ” で User-Agent ヘッダーを空文字列に設定します。
cURLでのユーザーエージェントローテーションの実装
cURLを使用して大規模な自動リクエストを行う場合、User-Agentに固定値を設定するだけでは不十分な場合があります。問題は、ボット対策技術がすべての着信リクエストを監視していることです。同じヘッダーで同じIPからのリクエストが多すぎると、対策が講じられる可能性が高くなります。
自動リクエスト時にサイトによる検知やブロックを回避する鍵は、リクエストをランダム化することです。この点で、ユーザーエージェントをローテーションさせることは、異なるブラウザからのリクエストをシミュレートするのに役立ちます。これにより、一時的な禁止やブロックがトリガーされるリスクを低減できます。
cURLでユーザーエージェントローテーションを実現する3つの手順:
- ユーザーエージェントの収集:様々なブラウザ、異なるバージョン、異なるデバイスから実際のユーザーエージェント文字列のリストを収集します。
- ローテーションロジックの実装:リストからランダムにユーザーエージェントを選択します。
- リクエストのランダム化:選択したユーザーエージェント文字列をcURLリクエストに設定します。
この手順の実装には数行のコードが必要であり、Unix系システムとWindowsでは異なります。両環境でcURLにユーザーエージェントローテーションを実装する方法を確認しましょう!
Bash
User Agent String.comのようなサイトから有効なユーザーエージェントのリストを収集し、配列変数に保存します:
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.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 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
)
次に、RANDOMを使用してリストからランダムに抽出する関数を実装します:
get_random_user_agent() {
# リスト内のユーザーエージェント数
local count=${#user_agents[@]}
# 0からcountまでの乱数を生成
local index=$((RANDOM % count))
# ランダムに抽出したユーザーエージェント文字列を返す
echo "${user_agents[$index]}"
}
関数を呼び出し、ローテーションするユーザーエージェントを取得し、cURLに設定:
# ランダムなユーザーエージェントを取得
user_agent=$(get_random_user_agent)
# 指定されたURLへのcURLリクエストを実行
# ランダムなユーザーエージェントを使用
curl -A "$user_agent" "https://httpbin.io/user-agent"
注: 目的に応じてターゲットURLを変更してください。
すべてをまとめると、以下のbashファイルが得られます:
#!/bin/bash
# ユーザーエージェント文字列のリスト
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.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 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0")
get_random_user_agent() {
# リスト内のユーザーエージェント数
local count=${#user_agents[@]}
# 0からcountまでのランダムな数値を生成
local index=$((RANDOM % count))
# ランダムに抽出したユーザーエージェント文字列を返す
echo "${user_agents[$index]}"
}
# ランダムなユーザーエージェントを取得
user_agent=$(get_random_user_agent)
# 指定されたURLに対してcURLリクエストを実行
# ランダムなユーザーエージェントを使用
curl -A "$user_agent" "https://httpbin.io/user-agent"
上記スクリプトを実行すると、毎回異なるユーザーエージェントが表示されます。ミッション完了!
PowerShell
WhatIsMyBrowser.com などのサイトから実際のユーザーエージェント一覧を取得します。次に、そのデータを配列変数に格納します:
$user_agents = @(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.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 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
)
次に、リストからランダムにユーザーエージェント文字列を選択して返す関数を作成します:
function Get-RandomUserAgent {
# リスト内のユーザーエージェント数
$count = $user_agents.Count
# 0から$countまでの乱数を生成
$index = Get-Random -Maximum $count
# ランダムに抽出したユーザーエージェントを返す
return $user_agents[$index]
}
最後に、関数を呼び出してランダムなユーザーエージェントを取得し、cURLで使用します:
# ランダムなユーザーエージェントを取得
$user_agent = Get-RandomUserAgent
# 指定されたURLにHTTPリクエストを送信
# ランダムなユーザーエージェントを使用
curl.exe -A "$user_agent" "https://httpbin.io/user-agent"
すべてをまとめると、以下のコードになります:
# ユーザーエージェントのリスト
$user_agents = @(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.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 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0")
function Get-RandomUserAgent {
# リスト内のユーザーエージェント数
$count = $user_agents.Count
# 0から$countまでの乱数を生成
$index = Get-Random -Maximum $count
# ランダムに抽出したユーザーエージェントを返す
return $user_agents[$index]
}
# ランダムなユーザーエージェントを取得
$user_agent = Get-RandomUserAgent
# 指定されたURLにHTTPリクエストを送信
# ランダムなユーザーエージェントを使用
curl.exe -A "$user_agent" "https://httpbin.io/user-agent"
これを.ps1スクリプトに保存し、数回実行してみてください。毎回異なるユーザーエージェント文字列が取得できます。
さあ、これでcURLのユーザーエージェントヘッダー設定の達人です!
まとめ
本ガイドでは、HTTPクライアントでUser-Agentヘッダーを設定することがなぜ重要なのか、そしてcURLでそれを実現する方法について見てきました。これにより、一部のアンチボットシステムを欺き、リクエストが通常のブラウザから送信されていると思わせることができます。ただし、高度なアンチボットソリューションは依然としてリクエストをブロックする可能性があります。レート制限などの対策回避には、cURLにプロキシを統合する方法もありますが、それだけでは不十分な場合もあります!
こうしたストレスを回避するには、スクレイパーAPIをお試しください。オールインワンの次世代型包括スクレイピングAPIとして、cURLやその他のHTTPクライアントを用いた自動ウェブリクエストに必要な機能をすべて提供します。IPとユーザーエージェントのローテーション機能を備えたこのフル機能ソリューションは、あらゆるボット対策技術を回避可能です。自動HTTPリクエストの実行がこれまで以上に簡単になります!
Bright Dataのウェブスクレイピングインフラの無料トライアルに今すぐ登録するか、当社のスクレイピングソリューションについてデータエキスパートにご相談ください。