この記事を読み終える頃には、次のことがわかります:
- – ユーザーエージェントとは何か、およびHTTPリクエストで設定すべき理由
- Wgetが設定するデフォルトのユーザーエージェント
- Wgetのユーザーエージェント文字列を変更する方法
- Wgetでユーザーエージェントローテーションを実装する方法
さっそく見ていきましょう!
ユーザーエージェント:定義と設定の必要性
ユーザーエージェントとは、ブラウザやWebリクエストを行うアプリケーション、HTTPクライアントがUser-Agent HTTPヘッダーに設定する文字列であり、リクエストの発信元となるクライアントソフトウェアを識別するために使用されます。この文字列には通常、ブラウザやアプリケーションの種類、オペレーティングシステム、その他の関連情報などが含まれます。
例えば、この記事執筆時点で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, like Gecko: Mozilla が使用する KHTML エンジンおよび Gecko レイアウトエンジンとの互換性を示す。
- Chrome/125.0.0.0: ブラウザ名とそのバージョン。
- Safari/537.36: Safari との互換性。
つまり、ユーザーエージェントは、リクエストが既知のブラウザから来ているのか、それとも別のソフトウェアから来ているのかを判断するために不可欠です。
スクレイピングボットは、一貫性のない、あるいはデフォルトのユーザーエージェント文字列を使用することが多く、その自動化された性質を明らかにしています。その結果、User-Agent ヘッダーは、サイトがページやデータを保護するために採用しているアンチボットソリューションが、現在のユーザーが本物かボットかを判断するのに役立ちます。
詳細については、ウェブスクレイピングのユーザーエージェントに関するガイドをご覧ください。
デフォルトのWgetユーザーエージェントとは?
HTTPリクエストを送信する際、WgetはUser-Agentヘッダーを以下の値に設定します:
Wget/X.Y.Z
X.Y.Zの文字列は、お使いのマシンにインストールされているWgetのバージョンに一致します。
上記の文字列が実際にWgetのユーザーエージェントであることを確認するには、httpbin.ioの/user-agentエンドポイントに対してGETリクエストを実行してください。これにより、受信リクエストのUser-Agentヘッダー内の文字列が返され、HTTPクライアントが使用するユーザーエージェントを確認する有効な方法となります。
以下の指示でWgetを使用して/user-agentへのGETリクエストを実行してください:
wget -O "response.json" "https://httpbin.io/user-agent"
注: Windowsでは、wgetをwget.exeに置き換えてください。これは、wgetがPowerShellのInvoke-WebRequestへのエイリアスであるのに対し、wget.exeはWgetのWindows実行ファイルを指すためです。
上記のコマンドは、エンドポイントから返されたレスポンスをダウンロードし、ローカルの response.json に保存します。その内容は以下のような形式になります:
{
"user-agent": "Wget/1.21.4"
}
この例では、Wgetによって設定されたユーザーエージェントはWget/1.21.4です。ご想像の通り、これはリクエストがWgetから発信されたものであることを明確に識別します。ボット対策ソリューションは、このようなリクエストを実際のユーザーからのものではないと簡単にフラグ付けし、即座にブロックする可能性があります。そのため、Wgetのユーザーエージェント変更手法をいくつか知っておくことが非常に重要です!
Wgetのユーザーエージェント設定方法
Wgetでユーザーエージェントを設定する方法は2つあります。両方見ていきましょう!
カスタムユーザーエージェントを直接設定する
Wgetにはユーザーエージェントを変更するオプションが用意されています。具体的には、-Uまたは –user-agentオプションを使用することで、WgetがUser-Agentヘッダーで使用するデフォルト文字列を上書きできます。Wgetでユーザーエージェント文字列を設定するには、以下の構文を使用します:
wget [その他のオプション] -U|--user-agent "<ユーザーエージェント文字列>" "<URL>"
以下の例をご覧ください:
wget -O "response.json" -U "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
response.jsonを開くと、以下のように表示されます:
{
"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"
}
素晴らしい!Wgetのユーザーエージェント設定戦略が見事に機能しました!
以前の Wget コマンドは以下と同等であることを忘れないでください:
wget.exe -O "response.json" --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" "https://httpbin.io/user-agent"
リクエストから User-Agent ヘッダーを除去するには、-U オプションに空の文字列を渡します。この動作は、httpbin.io の/headersエンドポイントにアクセスすることで確認できます。このエンドポイントは送信リクエストの HTTP ヘッダーを返します:
wget -O "response.json" -U "" "https://httpbin.io/headers"
response.jsonファイルには以下が含まれます:
{
"headers": {
"Accept": [
"*/*"
],
"Accept-Encoding": [
"identity"
],
"Connection": [
"Keep-Alive"
],
"Host": [
"httpbin.io"
]
}
}
予想通り、User-Agentヘッダーは存在しません。
代わりにUser-Agentヘッダーを無効化したい場合は、-Uオプションにスペース1つを指定します:
wget -O "response.json" -U " " "https://httpbin.io/headers"
response.json の内容は次のようになります:
{
"headers": {
"Accept": [
"*/*"
],
"Accept-Encoding": [
"identity"
],
"Connection": [
"Keep-Alive"
],
"Host": [
"httpbin.io"
],
"User-Agent": [
""
]
}
}
User-Agentヘッダーは存在しますが、意図した通り空の文字列を含んでいます。
注意: User-Agentヘッダーを削除または設定解除することは、アンチボット技術をトリガーする可能性のある悪い慣行です。
カスタム User-Agent HTTP ヘッダーの設定
User-AgentはHTTPヘッダーであるため、Wgetでは–headerオプションを使用して他のヘッダーと同様に設定できます。構文は以下の通りです:
wget [その他のオプション] --header "User-Agent: <ユーザーエージェント文字列>" "<URL>"
以下の例で –header オプションの実行例を確認してください:
wget.exe -O response.json --header "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" "https://httpbin.io/user-agent"
response.json の結果は次のようになります:
{
"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"
}
素晴らしい、レスポンスのユーザーエージェント値が –header オプションの文字列と一致しています。
Wgetのユーザーエージェントヘッダーを解除するには、”User-Agent:”ヘッダー値を使用します。ヘッダーを完全に削除する必要がある場合は、前述のように-Uオプションを使用する必要があります。
Wgetでユーザーエージェントローテーションを実装する
Wgetで自動リクエストを行う際、静的なUser-Agent値(実在のブラウザのユーザーエージェントであっても)を使用することは、必ずしも成功するアプローチとは言えません。問題は、アンチボット技術がすべての着信リクエストを監視し、特定のIPから同じヘッダーを持つリクエストが過剰に検出されると、そのIPを禁止する可能性があることです。
検出やブロックを回避する鍵はリクエストのランダム化です。リクエスト間の類似性を低減するには?ユーザーエージェントローテーションを活用しましょう!この手法により異なるブラウザからのリクエストを模倣でき、ブロックや一時的な禁止措置の発動リスクを低減できます。
Wgetのユーザーエージェントローテーションは、以下の3段階のアプローチで実現できます:
- ユーザーエージェントの取得:実際のブラウザからユーザーエージェント文字列のリストを収集します。
- ローテーションロジックの実装:リストからランダムにユーザーエージェントを選択します。
- リクエストをランダム化:選択したユーザーエージェント文字列をWgetリクエストに設定する。
この手順の実装には数行のコードが必要です。Unix BashやWindows PowerShellで記述可能です。PythonとWgetを連携させる方法でも実現できます。
それでは、WindowsとUNIXベースシステムの両方でWgetのユーザーエージェントローテーションを処理する方法を見ていきましょう!
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]}"
}
関数を呼び出してランダムなユーザーエージェントを取得し、Wgetコマンドで使用する:
# ランダムなユーザーエージェントを取得
user_agent=$(get_random_user_agent)
# 指定されたURLへのWgetリクエストを実行
# ランダムなユーザーエージェントを使用
wget -O "response.json" -U "$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に対してWgetリクエストを実行
# ランダムなユーザーエージェントを使用
wget -O "response.json" -U "$user_agent" "https://httpbin.io/user-agent"
上記のコードを.shスクリプトに追加し実行する。これによりスクリプトと同じフォルダにresponse.jsonファイルが生成される。これを開くと、/user-agentエンドポイントから返されたユーザーエージェントを確認できる。スクリプトを再度実行すると異なるユーザーエージェントが表示される。
よくできました!Wgetのユーザーエージェントローテーションが実装されました。
PowerShell
WhatIsMyBrowser.com などのサイトから実際のユーザーエージェント一覧を取得します。それらの文字列をPowerShell の配列変数に格納します:
$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を使用してリストからランダムにユーザーエージェント文字列を選択し、それを返す関数を実装する:
function Get-RandomUserAgent {
# リスト内のユーザーエージェント数
$count = $user_agents.Count
# 0から$countまでの乱数を生成
$index = Get-Random -Maximum $count
# ユーザーエージェント文字列を抽出して返す
return $user_agents[$index]
}
関数を呼び出してランダムなユーザーエージェント文字列を取得し、Wgetリクエストで使用します:
# ランダムなユーザーエージェントを取得
$user_agent = Get-RandomUserAgent
# 指定されたURLにHTTPリクエストを送信
# ランダムなユーザーエージェントを使用
wget.exe -O "response.json" -U "$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リクエストを送信
# ランダムなユーザーエージェントを使用
wget.exe -O "response.json" -U "$user_agent" "https://httpbin.io/user-agent"
上記のロジックを.ps1スクリプトに保存します。数回実行すると、response.json出力ファイルに異なるユーザーエージェント文字列が得られます。
これで完了!Wgetのユーザーエージェント変更手順の達人となりました。
まとめ
本ガイドでは、HTTPクライアントでUser-Agentヘッダーを常に設定すべき理由と、Wgetでの設定方法を解説しました。この手法により、単純なボット対策システムを欺き、リクエストが正規のブラウザから送信されていると認識させられます。ただし、高度なボット対策ソリューションでは依然としてリクエストを検知・ブロックされる可能性があります。レート制限などのスクレイピング対策回避には、Wgetとプロキシの併用が有効です。残念ながら、それだけでは不十分な場合もあります!
こうしたストレスを回避し、Scraper APIをお試しください。フル機能を備えたウェブスクレイピングAPIとして、Wgetやその他のHTTPクライアントで自動化されたウェブリクエストを実行するために必要なすべてを提供します。このオールインワンソリューションは、IPとユーザーエージェントのローテーション機能も備え、あらゆるボット対策技術を回避できます。自動化されたリクエストの作成がこれまで以上に簡単になります!
ニーズにぴったりの製品を見つけ、今すぐ登録しましょう。