スクレイパー向けにブラウザフィンガープリントを解説
ブラウザフィンガープリントとは、Cookieやアカウントではなく、ブラウザの複数の特徴を組み合わせて訪問者を識別する手法です。サイトは、再訪問者の識別、不正検知、自動化の認識のためにこれを使います。Webをスクレイピングするなら、いずれ必ず遭遇します。このガイドでは、何が測定されるのか、なぜ1つの不一致がトラブルになるのか、そして公開データを集めるために一貫性があり行儀のよいプロファイルをどう保つのかを説明します。また、フィンガープリントの調整でできることと、すべきでないことの限界も扱います。
フィンガープリントの構成要素
1つの値だけではブラウザを特定できませんが、多くの小さな値を組み合わせると、ほとんどの場合特定できてしまいます。主な入力は次のとおりです。
- User-Agentとクライアントヒント。 ブラウザが報告するブラウザ名、バージョン、OS。
- 画面とウィンドウの形状。 画面サイズ、色深度、デバイスピクセル比、ビューポートのサイズ。
- 言語とタイムゾーン。
Accept-Languageヘッダー、navigator.languages、ブラウザが報告するタイムゾーン。 - インストールされたフォント。 ページが検出できるフォント。OSやインストール済みソフトウェアによって異なります。
- Canvas、WebGL、オーディオの出力。 テスト用の画像や音声を描画・処理するときのグラフィックスやオーディオスタックの小さな違い。
- ネットワークレベルの特徴。 TLSハンドシェイク、HTTP/2の設定、リクエストヘッダーの順序。JavaScriptが動く前からサーバーに見えています。
フィンガープリントのスクリプトは、これらを組み合わせてハッシュやスコアにします。安定していて珍しいシグナルが多いほど、識別力が高くなります。
不一致が目立つ理由
実際のブラウザは内部的に一貫しています。OSはフォントと合っており、タイムゾーンは言語設定と合っており、画面サイズはそのデバイスと合っています。スクレイパーは、意図せずにこの一貫性を壊してしまうことがよくあります。
- デスクトップブラウザからコピーしたUser-Agentを、フォントが一つも入っていないサーバーから送る。
- 別の国のIPアドレスからのリクエストに、ドイツ語の
Accept-Languageヘッダーを付ける。タイムゾーンはどちらとも合わない。 - 実在するモニターでは使われないウィンドウサイズを報告するヘッドレス環境。
- 実行のたびに真っ新なプロファイルを使い、Cookieや履歴がリピーターに見えない。
どの不一致も小さなシグナルです。それらが合わさると、リクエストは「普通の訪問者」から「もう少し詳しく見る必要がある」へと移ることがあります。
ステップ1:自分の環境を測定する
ページがクライアントについて何を知るかは、自分が管理しているフィンガープリントのテストページや、ローカルで動かす診断ページを読み込めば確認できます。値を見て、それが1台の一貫したマシンを表しているかを考えてください。次は、いくつかの値を表示する最小限のPlaywrightの例です。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
page = context.new_page()
page.goto("https://example.com") # 自分が管理するページに置き換えること
print(page.evaluate("""() => ({
language: navigator.language,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
platform: navigator.platform,
viewport: [innerWidth, innerHeight]
})"""))
browser.close()
ステップ2:プロファイルごとにIDを1つに保つ
最も役立つ習慣は、スクレイピングのIDを1つのプロファイルとして扱うことです。1組の特徴を決めて、その寿命の間ずっと保ちます。
- ブラウザのビルド、User-Agent、OSは1つにする。
- ロケール、言語、タイムゾーンは、トラフィックの発信地域と合わせる。
- ビューポートとデバイスのスケールファクターは、実在する画面に合わせる。
- 永続的なCookieジャーを使い、プロファイルが再訪問者のように振る舞うようにする。
リクエストごとにどれかを変えると、一定に保つよりも怪しく見えます。一貫性こそが、プロファイルを普通に見せるものです。
ステップ3:訪問者のようなペースでプロファイルを動かす
フィンガープリントは入力の1つにすぎません。サイトは、1つのプロファイルがどれだけ速くサイトを移動するかも見ています。1分間に商品ページを200ページ読み込むプロファイルは、フィンガープリントが何と言おうと人間ではありません。リクエストを分散し、結果をキャッシュし、ページが止まるように示したら止まってください。ペーシングの詳細はスクレイピングでブロックされないためのチェックリストで扱っています。
ステップ4:限界を知る
フィンガープリントの調整によって、自動化されたプロファイルを、そこにいない人のように見せることはできません。フィンガープリントに依存するサイトは、通常、レート制限、アカウントのチェック、そして場合によってはcaptchaと組み合わせています。captchaが出たら、フィンガープリントをいじり続けるのではなく、ソルバーからトークンを取得する必要があります。Scarnoxでライブのcaptchaの種類はPopularCaptchaです。リクエストの例はPythonでPopularCaptchaを解くガイドにあります。ウィジェットの全体像については、captchaの種類の解説を読んでください。
さらに重要なのは、フィンガープリントの回避は、サイトのルールを無視してよいという許可ではないことです。サイトの運営者が自動化されたアクセスを制限しているなら、正しい行動は、プロファイルを見つかりにくくすることではなく、停止することです。フィンガープリントはプライバシーの問題でもあります。訪問をまたいで人を追跡するためにサイトが使うこともあり、そのため、プロジェクトに必要なものだけを収集するべき理由がもう1つあります。
責任あるスクレイピング
- サイトをスクレイピングする前に、
robots.txtと利用規約を読んでください。 - リクエストは少なく、ゆっくりにし、すでに集めたものはキャッシュしてください。
- 実在の人物になりすますため、またはブロックを回避するためにプロファイルを作らないでください。
- 必要のない個人データは保存せず、保存するものは慎重に扱ってください。
次に読むもの
ターゲットがブラウザレベルのチェックの背後にある場合は、まずヘッドレスブラウザの検出から始めてください。自動化されたブラウザに特有のシグナルを扱っています。コンテンツの表示にJavaScriptが必要なページは、JavaScriptのサイトのスクレイピングで扱っています。
無料のトライアルクレジットで始められ、カード登録は不要です。アカウントを作成して、自分が管理しているページに対してPopularCaptchaのフローを試してください。現在の料金は料金ページにあります。