この記事では以下を習得できます。
ユーザーエージェントとは?
この用語は、エンドユーザーとウェブコンテンツとの対話処理を容易にするソフトウェア全般を指します。ユーザーエージェント(UA)文字列は、クライアントコンピューターソフトウェアがリクエストを介して送信するテキストです。
ユーザーエージェント文字列は、宛先のサーバーがどのブラウザ、デバイスの種類、およびオペレーティングシステムを使用しているかを識別するのに役立ちます。例えば、この文字列は、コンピューターでChromeブラウザとWindows 10が使用されていることをサーバーに通知します。サーバーは、この情報を使用することで、デバイス、OS、およびブラウザのタイプに合わせて応答を調整できます。
ほとんどのブラウザは、次の形式でユーザーエージェントヘッダーを送信しますが、ユーザーエージェントの選択方法にあまり一貫性はありません。
すべてのブラウザは、platformやRV(リリースバージョン)など、独自のコメントコンポーネントを追加します。Mozillaは、クローラーに使用する文字列の例を提供しています。
Mozillaブラウザで使用できるさまざまな文字列について、詳しくは、“>開発者のサイトを参照してください。
以下に、Chromeの開発者サイトに掲載されている、さまざまなデバイスやブラウザによって異なるUA文字列フォーマットの見え方の例を示します。
Android版Chrome
スマートフォンUA:
タブレットUA:
ユーザーエージェントを使用すべき理由
ウェブスクレイピングを実行しているとき、ウェブサーバーが特定のユーザーエージェントをブロックしていることに気づくことがあります。これは主に、発信元がボットであると識別され、特定のウェブサイトではボットクローラーやスクレイパーが許可されていないためです。より洗練されたウェブサイトでは、この逆を行います。つまり、有効だと思われるユーザーエージェントにのみ、クローリングジョブを許可します。本当に洗練されたものになると、主張されているユーザーエージェントとブラウザの動作が実際に一致するかどうかをチェックします。
正しい解決策は、リクエストにユーザーエージェントを含めないことだと思われるかもしれません。ただし、この場合、ツールはデフォルトのUAを使用することになります。多くの場合、これは宛先のウェブサーバーによりブラックリストに登録され、ブロックされます。
では、ユーザーエージェントが禁止されないようにするにはどうすればよいのでしょうか?
スクレイピング時にUAが禁止されるのを回避するためのヒント:
#1:実際のユーザーエージェントを使用する
ユーザーエージェントが主要なブラウザに属していない場合、一部のウェブサイトはそのリクエストをブロックします。ボットベースのウェブスクレイパーの多くは、UAを定義するステップを省略しており、その結果、誤った/デフォルトのUAが見つからないために検出され、禁止されます。
この問題を回避するには、広く使用されているUAをウェブクローラーに設定します。 一般的なユーザーエージェントの大規模なリストはこちらから確認できます。ウェブサイトに対してcURLリクエストを実行することで、一般的な文字列をリストアップして、ローテーションできます。とはいえ、ブラウザのユーザーエージェントを使用することをお勧めします。これは、ブラウザの動作をあまり変更しない方が、ユーザーエージェントから期待される動作とブラウザの動作が一致する可能性が高いためです。
#2:ユーザーエージェントをローテーションさせる
ウェブスクレイピング中に多数のリクエストを行う場合、リクエストをランダム化する必要があります。これにより、ウェブサーバーがUAを識別してブロックする可能性を最小限に抑えられます。
リクエストをランダム化するにはどうすればよいですか?
1つの解決策は、プロキシをローテーションさせてリクエストIPアドレスを変更することです。こうすることで、毎回異なるヘッダーセットを送信できます。ウェブサーバー側からは、リクエストが異なるコンピューターや異なるブラウザから送信されているように見えます。
プロからのアドバイス:ユーザーエージェントはヘッダーですが、ヘッダーにはユーザーエージェント以外にも多くのものが含まれています。ヘッダーをランダムに送信するだけでは不十分です。送信するユーザーエージェントが、送信するヘッダーと一致していることを確認する必要があります。
botcheck.luminatio.ioを使って、送信するヘッダーがユーザーエージェントに期待されるものと一致するかどうかを確認できます。
ユーザーエージェントをローテーションする方法
最初に、ユーザーエージェント文字列のリストを収集する必要があります。実際のブラウザの文字列を使用することをお勧めします。詳しくは、こちらをご覧ください。次のステップでは、文字列をPythonリストに追加します。そして最後に、すべてのリクエストがリストからランダムな文字列を選択するように定義します。
Python 3とSelenium 4を使用してユーザーエージェントをローテーションさせる方法の例については、スタックオーバーフローに関する論考をご覧ください。コード例は次のようになります。
UAヘッダーのローテーションに使用するプログラムや方法にかかわらず、検出されてブロックされないようにするには、同じテクニックに従う必要があります。
- #1:各UAに関連付けられたヘッダーをフルセットでローテーションさせる
- #2:実際のブラウザが通常行う順序でヘッダーを送信する
- #3:前にアクセスしたページを「参照元ヘッダー」として使用する
プロからのアドバイス:リファラヘッダーを使用する場合は、IPアドレスとCookieが変化しないようにする必要があります。理想は、実際に前のページにアクセスして、ターゲットサーバーにその記録が残るようにすることです。
#3:プロキシを使用してエージェントをローテーションさせる
ローテーションプロキシネットワークを使用することで、リストを手動で定義したり、IPを手動でローテーションさせたりするという頭痛の種や手間を省くことができます。プロキシには、自動IPローテーションとUA文字列ローテーションを設定する機能があります。これは、リクエストがさまざまなウェブブラウザから発信されたように見えることを意味します。これにより、リクエストが実際のウェブユーザーから発信されたように見えるため、ブロックが大幅に減少し、成功率が向上します。ユーザーエージェントを適切に管理し、ローテーションできるのは、データブロック解除技術を採用した非常に限定されたプロキシだけであることを念頭に置いてください。
スクレイピング用User-Agentのリスト
ブラウザ、電話、デバイス、ロボット、検索エンジン、開発者ツールベースのUser-Agentは多種多様であり、wgetやcURLなどのツールを使いながらさまざまなブラウザをエミュレートできます。以下が含まれます:
- Lynx: Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23
- Wget: Wget/1.15 (linux-gnu)
- Curl: curl/7.35.0
- HTC: Mozilla/5.0 (Linux; Android 7.0; HTC 10 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36
- Google Nexus: Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7
- Samsung Galaxy Note 4: Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-N910F Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36
- Samsung Galaxy Note 3: Mozilla/5.0 (Linux; Android 5.0; SAMSUNG SM-N900 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.1 Chrome/34.0.1847.76 Mobile Safari/537.36
- Samsungスマートフォン: Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G570Y Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36
- Bingの検索エンジンボット: Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
- Googleの検索エンジンボット: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
- Apple iPhone: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1
- Apple iPad: Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4
- Microsoft Internet Explorer 11 / IE 11: Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
- Microsoft Internet Explorer 10 / IE 10: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; MDDCJS)
- Microsoft Internet Explorer 9 / IE 9: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; Trident/5.0)
- Microsoft Internet Explorer 8 / IE 8: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
- Microsoft Internet Explorer 7 / IE 7: Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)
- Microsoft Internet Explorer 6 / IE 6: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
- Microsoft Edge: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
- Mozilla Firefox: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0
- Google Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
キーポイント
ほとんどのウェブサイトは、有効な、または認識可能なブラウザユーザーエージェントがないリクエストをブロックするため、UAを適切にローテーションする方法を学ぶことは、サイトブロックを回避する上で重要です。正しいユーザーエージェントを使用することで、リクエストが有効な発信元から来たことをターゲットのウェブサイトに伝え、目的のターゲットサイトから自由にデータを収集できるようになります。
Bright Dataは、完全に自動化されたデータロック解除ソリューションを開発し、機械学習アルゴリズムを使用してサイト固有のブラウザユーザーエージェントを生成し、ボット検出システムを回避することで、チームの時間とリソースを節約します。