🎯 カスタマイズ可能で検出回避型のクラウドブラウザ。自社開発のChromiumを搭載し、ウェブクローラーAIエージェント向けに設計されています。👉今すぐ試す
ブログに戻ります

httpcloakウェブスクレイピング:Pythonによるフルスタックブラウザフィンガープリンツ

Michael Lee
Michael Lee

Expert Network Defense Engineer

22-Jul-2026

要約:

  • httpcloakは、TLS、HTTP/2、HTTP/3、およびTCPにわたってブラウザをエミュレートするPythonのHTTPクライアントであり、TLSハンドシェイクだけではありません。
  • httpcloak.get(url, preset="chrome-146")の呼び出しは、ブラウザのJA3、JA4、およびHTTP/2フィンガープリントを一緒に提供し、ブラウザプロセスは不要です。
  • リクエストには複数のフィンガープリントがあります。JA3ハッシュはGREASEの影響で毎回変わりますが、JA4とHTTP/2フィンガープリントは一定です。
  • httpcloakはJavaScriptを実行しないため、クライアントレンダリングされたページでは空のシェルを返します。このガイドでは、httpcloakからの引用ブロックが0、Scrapelessでのレンダリングからの引用ブロックが10であることを証明しています。
  • ネットワークフィンガープリントが壁となる場合はhttpcloakを使用し、ページがレンダリングを必要とする場合や、課題をクリアしたり、IPローテーションを行う必要がある場合はScrapelessを利用してください。
  • フィンガープリントだけでは到達できないページには、Scrapelessの無料プランから始めてください。

サーバーは、レスポンスのバイトを読み取る前に、いくつかのレイヤーでリクエストのフィンガープリンティングを行うことができます。TLSのClientHelloがその一つです。HTTP/2のSETTINGSフレームが別の一つです。TCPオプションが3つ目になります。TLS層だけを修正したクライアントは他の層で目立ち、複数の層をチェックする検出器は不一致をフラグします。httpcloakは、実際のブラウザのフィンガープリントを借用して全層を一度に処理します。

このガイドは、httpcloakが生成するフィンガープリントを読み取り、なぜそれらの一つが実行ごとに変化し、他が変わらないのかを説明し、httpcloakが越えられない境界を示します。ページが実際のブラウザを必要とする場合、Scrapeless Universal Scraping APIが引き継ぎます。以下のすべての値は、実際の実行からのものです。

httpcloakがエミュレートするもの

httpcloakは、層にわたってブラウザのフィンガープリントを再現するrequestsスタイルのクライアントです。TLS層では、ブラウザのJA3とJA4を提供します。トランスポート層では、HTTP/2のSETTINGSフレーム、ウィンドウサイズ、およびストリームの優先順位を再現し、これらが連携して<あ href="https://datatracker.ietf.org/doc/html/rfc9113" rel="nofollow">HTTP/2プロトコル</あ>で定義されたフィンガープリントを形成します。また、HTTP/3およびTCPオプションにも拡張されます。プリセットを選択すると、<あ href="https://github.com/sardanioss/httpcloak" rel="nofollow">httpcloakリポジトリ</あ>には、chrome-146からfirefox-133safari-18までのブラウザバージョンがリストされています。

httpcloakが行わないことは、ブラウザを実行することです。JavaScriptエンジンもレンダリングもありません。それはフィンガープリントのセットであり、ブラウザではありません。

インストール

httpcloakは、単一のpipインストールです。

bash Copy
pip install httpcloak

フルスタックフィンガープリントを読む

presetを渡すと、httpcloakはそのブラウザのネットワークシグネチャを構築します。以下のリクエストは、フィンガープリンティングサービスに見たレイヤーを報告させます。

python Copy
import httpcloak

response = httpcloak.get("https://tls.peet.ws/api/all", preset="chrome-146", timeout=30)
data = response.json()
print("http版:", data["http_version"])
print("ja3ハッシュ:", data["tls"]["ja3_hash"])
print("ja4:", data["tls"]["ja4"])
print("http2 akamaiハッシュ:", data["http2"]["akamai_fingerprint_hash"])

サービスは、HTTP/2、JA3ハッシュ、JA4フィンガープリント、HTTP/2フィンガープリントを、すべて1つのリクエストから報告します。

text Copy
http版: h2
ja3ハッシュ: 0f368595c1c27a2c9024014615c2a295
ja4: t13d1516h2_8daaf6152771_d8a2da3f94cd
http2 akamaiハッシュ: 52d84b11737d980aef856699f885ca86

1つのリクエスト、複数のフィンガープリント

そのスクリプトを2回実行すると、ja3ハッシュが変わり、ja4http2 akamaiハッシュは同じままです。それは不安定ではありません。<あ href="https://datatracker.ietf.org/doc/html/rfc8701" rel="nofollow">GREASEメカニズム</あ>は、TLS ClientHelloにランダムな予約値を挿入し、JA3はそれらの値をハッシュするため、JA3は接続間で変動し、実際のChromeと同じように動きます。<あ href="https://github.com/FoxIO-LLC/ja4" rel="nofollow">JA4フィンガープリント</あ>はGREASE値を並べ替え除外するため安定し、HTTP/2フィンガープリントは固定されたSETTINGSフレームから生成されるため、こちらも安定しています。この教訓は、リクエストには複数のフィンガープリントがあり、JA3のみを確認すると、耐久性のある信号がJA4とHTTP/2層にあるところでノイズが見えることです。

httpcloakが止まるところ

フルスタックのネットワークフィンガープリントはリクエストをフィンガープリントチェックを通過させるが、ページをレンダリングすることはありません。JavaScriptでコンテンツを構築するサイトでは、httpcloakはサーバーが送信したもの、つまり空のシェルを正確に返します。フィンガープリントの正確さのいかなる量もこれを埋めることはできません。ここでレンダリングツールが必要になります。

シェルにScrapelessのキーを設定します。実行時には実際のキーを使用し、プレースホルダーはソースから取り除いてください。

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

以下のスクリプトは、JavaScriptでレンダリングされた引用ページを2通り取得します: 完全なブラウザフィンガープリンティングを使用したhttpcloakと、レンダリングをオンにしたScrapelessです。

python Copy
import json
import os
import urllib.request

import httpcloak

JS_PAGE = "https://quotes.toscrape.com/js/"

response = httpcloak.get(JS_PAGE, preset="chrome-146", timeout=30)
print("httpcloak status:", response.status_code)
print("httpcloak quote blocks:", response.text.count('class="quote"'))


def scrapeless(url: str) -> str:
    payload = json.dumps(
        {"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": True, "headless": True}}
    ).encode()
    request = urllib.request.Request(
        "https://api.scrapeless.com/api/v2/unlocker/request",
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = scrapeless(JS_PAGE)
print("scrapeless quote blocks:", html.count('class="quote"'))

httpcloakは200をクリーンに取得しましたが、引用はゼロです。これは、引用がJavaScriptによって描画されているため、実行されないからです。Scrapelessはページをレンダリングし、引用が表示されます。

text Copy
httpcloak status: 200
httpcloak quote blocks: 0
scrapeless quote blocks: 10

200は罠です: リクエストは成功するので、何も問題はないように見えますが、コンテンツは存在しません。この2つのツールは異なる問題に対処します。httpcloakは層を通じてブラウザのネットワークフィンガープリンティングを再現します; それはレンダリングせず、課題をクリアせず、IPをローテーションしません。サーバーが測定する内容のより広範なビューについては、ブラウザフィンガープリンティングのガイドがネットワークスタックを超えた信号をカバーしています。

これらをサイト上で実行する前に、その robots.txt と利用規約を読むことを忘れないでください。ロボット排除プロトコルは、サイトが自動クライアントに避けるように求めるパスを示し、それを尊重することでスクレイパーは持続可能なものになります。

フィンガープリンティングだけでは届かないページの準備はできましたか?無料のScrapelessアカウントを作成することと、それらをレンダリングしてください。

結論

httpcloakは、壁がネットワークフィンガープリンティングであるときに適したツールであり、それについて徹底しています: JA3、JA4、HTTP/2、HTTP/3、およびTCPは1つのリクエストから、ブラウザのプリセットによって選択されます。その限界も明確で、JavaScriptを実行せず、クライアントレンダリングされたページの空のシェルを返します。フィンガープリンティングを読み返して、どれが安定しているかを理解し、ハンドシェイクが壁であるところではhttpcloakを使用し、レンダリング、クリアされた課題、または新しいIPが必要な場合はScrapelessにページを渡します。上記のスクリプトから始め、前にあるチェックに合わせてツールをマッチさせてください。

Scrapelessの無料プランから始めるでレンダリングされたページを取得し、Scrapelessの料金を確認して、定期的なジョブのサイズを確認してください。

FAQ

Q: httpcloakはどの層をエミュレートしますか?

httpcloakは、TLS層(JA3とJA4)、HTTP/2層(SETTINGSフレーム、ウィンドウサイズ、優先順位)、HTTP/3、およびTCPオプションでブラウザのフィンガープリンティングを再現します。TLSのみのクライアントは最初のものだけを固定しますが、httpcloakはすべての層がマルチレイヤーディテクターでチェックされてするようにすることを目指しています。

Q: JA3ハッシュは実行間で変更されるのに、JA4は変更されないのはなぜですか?

JA3は、ブラウザがTLS ClientHelloでランダム化するGREASE値を含むため、接続ごとに変わります。JA4はそれらのGREASE値をソートして除外するため、同じクライアントに対しては一定のままになります。また、HTTP/2フィンガープリンティングは固定フレームからくるので、安定しています。変わるJA3と安定したJA4は期待される結果であり、失敗ではありません。

Q: httpcloakはJavaScriptでレンダリングされたページをスクレイピングできますか?

いいえ。httpcloakにはJavaScriptエンジンがないため、クライアントレンダリングされたページでは200ステータスで初期HTMLシェルを返しますが、レンダリングされたコンテンツはありません。これらのページにはScrapelessなどのレンダリングツールを使用し、httpcloakはすでにレスポンス内にコンテンツがあるエンドポイントに保持してください。

Q: エミュレートするブラウザをどのように選択しますか?

preset引数に出荷されたブラウザ名を渡します。例えば、chrome-146, firefox-133, またはSafari-18などです。プリセットはすべての層でフィンガープリンティングを一度に設定するため、1つのブラウザから別のブラウザに切り替える場合は、層ごとの構成ではなく、単一の引数の変更になります。

Q: ネットワークフィンガープリンティングだけではブロックを回避できますか?
指紋チェックだけで十分であり、それ以上は必要ありません。JavaScriptのチャレンジ、行動分析、およびIPの評価は、httpcloakが対処していない別の防御手段ですので、それらが関与している場合は、指紋の上にレンダリング、チャレンジ処理、またはプロキシローテーションが必要になります。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ