Cloudflare で保護されたサイトのスクレイピング方法(2026 年ガイド)
Cloudflare は公開ウェブの大きな部分の前段に置かれているため、あるサイトで動くスクレイパーが、次のサイトでは壁にぶつかることがよくあります。通常は HTTP 403 や 503、「Just a moment...」の中間ページ、またはページ上の Turnstile のチェックボックスとして気づきます。このガイドでは、Cloudflare が何を確認しているか、触れてはいけないものに触れずに効く対処法、そしてキャプチャの解決がどこに入るかを説明します。結論はこうです。サイトのスクレイピングが許可されていることを確認し、速度を落とし、通常のクライアントに近いリクエストを送り、ページが必要とする場合は本物のブラウザを使い、それから初めてキャプチャに対処します。Turnstile は、Cloudflare が最もよく使うキャプチャです。Scarnox の Turnstile サポートは近日公開予定です。現在ライブのキャプチャ種別は PopularCaptcha です。
Cloudflare が確認していること
Cloudflare はすべてのリクエストを、いくつかの信号で採点します。
- IP の評判。 クラウドのデータセンターからのアドレスは、家庭用回線からのアドレスよりも低いスコアで始まります。
- リクエストの頻度とパターン。 一つのアドレスから1秒に数百のリクエストが来ると、ヘッダーの内容に関係なくボットに見えます。
- ヘッダーと TLS フィンガープリント。 素の HTTP ライブラリは、主流のブラウザが決して送らないヘッダー、ヘッダーの順序、TLS ハンドシェイクを送ることがよくあります。
- JavaScript の実行。 チャレンジページはスクリプトを実行し、本物のブラウザ環境が存在するかを確認します。
- クッキー。 チャレンジに合格すると、Cloudflare はそのセッションに結びついたクリアランスクッキーを発行します。
高いスコアは気づかれずに通過します。中程度のスコアには対話的なチャレンジが出ます。低いスコアはブロックになります。作業の大部分は、チェックに立ち向かうことではなく、礼儀正しいクライアントとして振る舞ってスコアを上げることです。
ステップ 1: サイトをスクレイピングしてよいか確認する
技術的な作業の前に、サイトの robots.txt と利用規約を読んでください。ブロックは、所有者があなたに何かを伝えている場合が多いです。公開ページをゆっくり、明確な目的のためにスクレイピングするのは一つのことです。所有者が制限したデータに到達するためにブロックを無理に越えるのは別のことで、Scarnox が対応していない使い方です。一般的な論点はウェブスクレイピングの法的概要で扱っています。
ステップ 2: 通常のリクエストを正しく送る
「ブロックされている」と見えるスクレイパーの多くは、単に質の悪いリクエストを送っています。まずこれらを直してください。
- 最新の User-Agent と、ブラウザが送るヘッダー、たとえば
AcceptやAccept-Languageを送る。 - セッションオブジェクトを一つ保持し、ブラウザのように、リクエストをまたいでクッキーを保持する。
- リクエストの間に、少しのランダムなジッターを加えた遅延を入れる。
429や503の応答では、タイトなループでリトライせず、後退する。
import random
import time
import requests
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/124.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
})
def polite_get(url: str, attempts: int = 4) -> requests.Response:
r = None
for attempt in range(attempts):
r = session.get(url, timeout=30)
if r.status_code not in (429, 503):
return r
# ジッター付き指数バックオフ: 約 1、2、4 秒にランダムな揺らぎを加える。
time.sleep(2 ** attempt + random.uniform(0, 1))
return r
これで通過できれば、それで完了です。遅延はそのまま残してください。
ステップ 3: どのチャレンジに直面しているかを特定する
応答が多くを教えてくれます。
- 「Just a moment...」のページ。 JavaScript のチャレンジです。本物のブラウザは、数秒後に通常それだけで通過します。その後、クリアランスクッキーは同じセッションの後続のリクエストで再利用できます。
- フォームやページ上の Turnstile ウィジェット。 キャプチャです。フォームが送信を受け入れる前に、ウィジェットからのトークンが必要です。
- エラーコード付きのブロックページ。 アドレスかリクエストが完全に拒否されています。ペースを変え、リクエストを直すことが、たいてい何よりも役立ちます。ブロックされたものを解決しても、データは得られません。
どれが出ているかを確認すると、無駄な努力を大幅に減らせます。
ステップ 4: 必要な場合は本物のブラウザを使う
ページが JavaScript の実行後にしかコンテンツを表示しない場合、素の HTTP クライアントでは決して見えません。Playwright や Selenium でフルブラウザを動かしてください。ヘッドレスブラウザは検出されやすいため、頼る前にヘッドレスブラウザ検出を読み、実際の訪問者が使う環境に合わせて設定してください。完全な例は JavaScript サイトのガイドにあります。
ステップ 5: IP の評判を確認する
クリーンなリクエストが低いスコアを得る最も一般的な原因は、クラウドのデータセンターのアドレスです。住宅用のアドレスは通常スコアが良く、そのぶん速度と費用が高くなります。そのトレードオフは住宅用とデータセンタープロキシの比較で扱っています。
ローテーションにも独自の落とし穴があります。リクエストごとにアドレスを変えると不自然に見えます。実際の訪問者は、一回の訪問の間ずっと一つのアドレスを保つからです。関連するリクエストのまとまりに対して一つのアドレスを保つスティッキーセッションは、素早いローテーションより良い結果になることが多いです。詳細はスクレイピング用のローテーティングプロキシを参照してください。
ステップ 6: キャプチャの解決はどこに入るか
フォームの評価や、許可された自動化ページで、ウィジェットが実際に表示されることがあります。その場合、Turnstile のトークンはそのフローで必須のステップです。Scarnox の Turnstile サポートは近日公開予定のため、本番のコードをまだそれに対して作らないでください。今日ライブのキャプチャ種別は PopularCaptcha で、これは別のウィジェットを使います。
どのトークン型キャプチャにも共通する一般的なワークフローは同じです。ページから sitekey を読み取り、トークンを要求し、サイトが期待するフォームフィールドにトークンを入れます。トークンは寿命が短いため、すぐに送信してください。ワークフロー全体は PopularCaptcha の Python ガイドで示しており、遭遇するウィジェットの比較はキャプチャの種類の解説にあります。
Turnstile のサポートが開始されたときに備えたい場合は、今から無料トライアルを始められます。クレジットカード不要で、無料トライアルクレジットから始められます。アカウントを作成してください。ライブのキャプチャ種別の現在の料金は、料金ページをご覧ください。
責任を持ったスクレイピング
robots.txtを読み、スクレイピングするサイトの利用規約を尊重してください。- クローラーのレートを制限し、可能な場合はオフピークの時間帯に実行してください。
- レスポンスをキャッシュし、理由もなく同じページを二度取得しないようにしてください。
- 適法な根拠がない限り、個人データの収集は避けてください。
- サイトがアクセスを制限している場合は、止まってください。制限を越えようとしないでください。