解説
User-Agentヘッダーは、ウェブ上で最も古い識別情報の一つです。クライアントが送信するすべてのHTTPリクエストには、クライアントソフトウェア(ブラウザまたはライブラリ)、そのバージョン、オペレーティングシステム、そして多くの場合レンダリングエンジンを示す`User-Agent:`行が含まれています。サーバーはこれをコンテンツネゴシエーション(モバイルとデスクトップのレイアウト)、アナリティクス、そして近年ではボット検出に利用しています。
スクレイピングにおいて、User-Agentは最も簡単に間違いを犯しやすいシグナルです。一般的なHTTPライブラリのデフォルトUser-Agent(`python-requests/2.31.0`、`axios/1.5.0`、`okhttp/4.10.0`)はすぐに見破られます。PlaywrightやPuppeteerのデフォルトUser-Agentでさえ`HeadlessChrome`が含まれており、アンチボットシステムに即座にフラグを立てられます。
単純な対処法は、すべてのリクエストにChrome UAを設定することです。ただし、User-Agentだけでは不十分です。現代のフィンガープリンティングは、UAを`sec-ch-ua`クライアントヒント、TLSフィンガープリント、JavaScriptのnavigatorオブジェクト、Accept-Languageヘッダーと照合します。Chrome UAを設定しつつPythonのTLSハンドシェイクを露出させたままにすると、デフォルトのUAをそのままにしておくよりも大きな警告フラグになります。
仕組み
クライアントがサーバーへの接続を開くと、リクエストラインにはヘッダーが含まれます。`User-Agent`の行はその一つです。サーバーはそれを解析(またはログに記録)し、確認した内容に基づいてリクエストをルーティングします。Windows上の最新のChrome User-Agentは次のようになります:`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36`。「Mozilla/5.0」プレフィックスは歴史的なものであり、すべてのブラウザがレガシー互換性のためにこれを送信します。
実際のブラウザは、現代のHTTPでは`sec-ch-ua`(「Sec-CH-UA」Client Hints)ヘッダーも送信し、構造化されたブラウザ・バージョン・プラットフォームのデータを伝えます。アンチボットシステムはこれらをUser-Agent文字列と比較し、不整合を検出します。そのため、User-Agentのローテーションは、一貫した`sec-ch-ua-*`の更新および一致するTLSフィンガープリントと組み合わせる必要があります。