Cloudflareブロック対処ガイド:正当なアクセスのためのホワイトハットガイド

Cloudflareの検出がどのように機能するか、住宅用プロキシ、ブラウザグレードのTLS、適切な要求パターン、倫理的なスクレイピングプラクティスを使用して保護されたサイトにアクセスする方法を学びます.

Cloudflareブロック対処ガイド:正当なアクセスのためのホワイトハットガイド

クラウドフレア検出の仕組み

Cloudflareは、すべてのウェブサイトの20%以上を保護する、最も広く展開されているアンチボットサービスです。 自動トラフィックを検出する方法を理解することは、正当なスクレイピングツールを構築する人にとって不可欠です。 Cloudflareは多層検出パイプラインを使用します。

  1. IPの評判のスコアリング: Cloudflareは、グローバルな脅威インテリジェンスデータベースを維持しています。 データセンターIP、既知のVPN範囲、および以前にフラグジされたアドレスは、より高いリスクスコアを受け取ります。
  2. TLSの指紋: クラウドフレア解析 TLS ClientHello メッセージ 接続クライアントが要求されたアイデンティティに一致するかどうかを判断します。
  3. ブラウザの指紋: JavaScriptの課題プローブ キャンバス、WebGL、ナビゲーターの特性他の信号の数十、および数十。
  4. JavaScriptの課題: Cloudflareは、実際のブラウザ環境で正しく実行しなければならないJavaScriptを提供しています。
  5. 行動分析: タイミング、ナビゲーションパターン、マウスの動き、インタラクション信号を解析します。
  6. 機械学習モデル: すべての信号は、継続的に新しい自動化パターンに適応するMLモデルに供給されます。

より広い概要については、 アンチボット検出システムへの包括的なガイド. .

クラウドフレア保護層

クラウドフレア保護層
ティアー検出方法難易度レベル典型的なサイト
基本(無料)IPの評判、基本的なJSの挑戦低い小さなブログ、個人サイト
プロフィール+ WAFルール、レート制限メディア中小企業、SaaS
事業内容+ 高度なボット管理高いEコマース、企業サイト
エンタープライズ+ ML 動力を与えられたボット スコアリング、行動分析非常に高い大手小売店、金融サービス

Cloudflare-Protectedサイトにアクセスするための倫理的フレームワーク

技術的なアプローチを実行する前に、明確な倫理的境界を確立します。

  • まずは API をチェックしてください。 多くのCloudflare保護されたサイトでは、データアクセスのための公式 API を提供しています。 常に好みます。
  • Robots.txt の尊重: 特定のパスをスクレイピングするサイトが明示的に拒否された場合、それらのディレクティブに敬意を表します。
  • サービス利用規約: 自動アクセスに関するサイトが許可されているかを理解する。
  • 公開データのみアクセス: 認証を迂回したり、プライベートデータにアクセスしたりしないでください。
  • サーバーの影響を最小限に抑える: 合理的な料金要求を使用して、ターゲットサーバーを過負荷しません。
  • データライセンスを検討する: 商用利用の場合、データライセンス契約を調べます。
このガイドのテクニックは、公に利用可能なデータにアクセスするための正当なアクセスのために設計されています。 不正なアクセス、クレデンシャル盗難、またはサービス攻撃に対するセキュリティ保護を回避するために使用しないでください。

戦略1:クリーンIPで住宅用プロキシ

最も効果的な最初のステップは、IPアドレスがきれいな評判を持っていることを保証します。 CloudflareのIPは、データセンターとVPN IPを大きく浸透させます。

# Python: Using residential proxies for Cloudflare-protected sites
from curl_cffi import requests as curl_requests
response = curl_requests.get(
    "https://cloudflare-protected-site.com",
    impersonate="chrome",
    proxies={
        "http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
        "https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
    },
    timeout=30
)
if response.status_code == 200:
    print("Access granted")
elif response.status_code == 403:
    print("Blocked — may need additional measures")
elif response.status_code == 503:
    print("Cloudflare challenge page — need browser execution")

ProxyHatの住宅用プロキシ Cloudflareのデータベースに本物の住宅アドレスとして分類されたIPを提供し、IPの評判層を迂回します。 お問い合わせ 住宅用プロキシとVPNの比較 VPN IP が Cloudflare に対して失敗する理由

戦略2:ブラウザグレードのTLS指紋

Cloudflare チェック JA3/JA4 TLS指紋 接続クライアントを識別するため。 Pythonの requests ライブラリ、Go's net/httpNode.js のデフォルトクライアントは、Cloudflare フラグの非ブラウザ TLS 署名をすべて生成します。

戦略2:ブラウザグレードのTLS指紋
クライアントCloudflare 結果なぜ?
PythonリクエストブロックまたはチャレンジOpenSSL TLSの指紋は非ブラウザです
curl cffi (impersonate="chrome")通常パスMimics Chrome BoringSSL指紋
ヘッドレスクローム(Puppeteer/Playwright)通常パスリアルボーリングSSL TLSスタック
ネット/httpブロックまたはチャレンジ暗号/tlsの指紋は特徴的です行きます
uTLS(Chrome hello)で行く通常パスミミッククロム指紋

戦略3: JavaScriptチャレンジの処理

CloudflareのJavaScriptの課題は、実際のブラウザ環境で解決する必要があります。 2つのアプローチがあります。

アプローチA:ヘッドレスブラウザ

// Node.js: Playwright with stealth for Cloudflare challenges
const { chromium } = require('playwright');
async function accessCloudflare(url) {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://gate.proxyhat.com:8080',
      username: 'USERNAME',
      password: 'PASSWORD'
    }
  });
  const context = await browser.newContext({
    locale: 'en-US',
    timezoneId: 'America/New_York',
    viewport: { width: 1920, height: 1080 }
  });
  const page = await context.newPage();
  // Navigate and wait for Cloudflare challenge to resolve
  await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
  // Cloudflare challenges typically redirect after completion
  // Wait for the actual content to load
  await page.waitForSelector('body', { timeout: 30000 });
  // Check if we passed the challenge
  const title = await page.title();
  if (title.includes('Just a moment') || title.includes('Attention Required')) {
    // Challenge not yet resolved — wait longer
    await page.waitForNavigation({ waitUntil: 'networkidle', timeout: 30000 });
  }
  const content = await page.content();
  await browser.close();
  return content;
}

アプローチB:クッキー抽出と再利用

ヘッドレスブラウザで課題を解決し、クッキーを抽出(特に) cf_clearance)、軽量なHTTPクライアントで再利用します。

// Node.js: Extract Cloudflare cookies for reuse
const { chromium } = require('playwright');
async function extractCfCookies(url) {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://gate.proxyhat.com:8080',
      username: 'USERNAME-session-cf1',
      password: 'PASSWORD'
    }
  });
  const context = await browser.newContext({
    locale: 'en-US',
    timezoneId: 'America/New_York',
  });
  const page = await context.newPage();
  await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
  // Wait for challenge resolution
  await page.waitForTimeout(10000);
  // Extract cookies
  const cookies = await context.cookies();
  const cfClearance = cookies.find(c => c.name === 'cf_clearance');
  const userAgent = await page.evaluate(() => navigator.userAgent);
  await browser.close();
  return { cookies, userAgent, cfClearance };
}
// Reuse cookies with got-scraping (same proxy session!)
import { gotScraping } from 'got-scraping';
const { cookies, userAgent } = await extractCfCookies('https://example.com');
const cookieString = cookies.map(c => `${c.name}=${c.value}`).join('; ');
const response = await gotScraping({
  url: 'https://example.com/api/data',
  proxyUrl: 'http://USERNAME-session-cf1:PASSWORD@gate.proxyhat.com:8080',
  headers: {
    'Cookie': cookieString,
    'User-Agent': userAgent,  // Must match the browser that solved the challenge
  }
});

重要: ザ・オブ・ザ・ cf_clearance クッキーは、課題を解決するIPアドレスとユーザーエージェントに拘束されます。 再利用時に同じプロキシセッション(sticky IP)と同一のユーザエージェントを使用する必要があります。

戦略4: パターン最適化のリクエスト

Cloudflareの行動分析は、非人的リクエストパターンをフラグします。 正当なアクセスのためにこれらのパターンに従ってください:

リアルなナビゲーションフロー

# Python: Realistic navigation pattern
from curl_cffi import requests as curl_requests
import time
import random
session = curl_requests.Session(impersonate="chrome")
session.proxies = {
    "http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
    "https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
# Step 1: Visit homepage first
home = session.get("https://example.com")
time.sleep(random.uniform(2.0, 4.0))
# Step 2: Navigate to category (with Referer)
category = session.get(
    "https://example.com/products",
    headers={"Referer": "https://example.com"}
)
time.sleep(random.uniform(1.5, 3.5))
# Step 3: Browse items (with proper Referer chain)
for item_url in item_urls[:20]:
    item = session.get(
        item_url,
        headers={"Referer": "https://example.com/products"}
    )
    time.sleep(random.uniform(1.0, 3.0))

レート制限ガイドライン

レート制限ガイドライン
Cloudflare ティア安全な要求率リクエスト間の遅延
基本/無料20-30 req/min2-3秒
プロフィール10-20 req/min3-6秒
事業内容5-10 req/min6-12秒
エンタープライズ2-5 req/min12-30秒

戦略5:共通のCloudflare応答を処理する

戦略5:共通のCloudflare応答を処理する
ステータスコード意味するアクション
200円成功事例通常、コンテンツを解析する
403の禁止 — IP または指紋ブロック新しいIPに回転し、TLS指紋を確認してください
429レート限定要求率を極端に減らして下さい、要求率を減らして下さい
503のJavaScriptチャレンジヘッドレスブラウザで解決
520-527の特長Cloudflareサーバーエラー遅延後の再試行 — 原発サーバーの問題
# Python: Response handling with retry logic
import time
import random
def cloudflare_resilient_request(session, url, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = session.get(url, timeout=30)
            if response.status_code == 200:
                return response
            if response.status_code == 403:
                # IP flagged — rotate session
                print(f"403 on attempt {attempt + 1} — rotating IP")
                session = create_new_session()
                time.sleep(random.uniform(5, 10))
                continue
            if response.status_code == 429:
                # Rate limited — exponential backoff
                wait = (2 ** attempt) * 5 + random.uniform(0, 5)
                print(f"429 — waiting {wait:.1f}s")
                time.sleep(wait)
                continue
            if response.status_code == 503:
                # JS challenge — need headless browser
                print("503 — JavaScript challenge detected")
                return None  # Escalate to browser-based approach
        except Exception as e:
            print(f"Error: {e}")
            time.sleep(random.uniform(2, 5))
    return None

完全な多層アプローチ

最も信頼できる戦略は、すべてのレイヤーを組み合わせます。

  1. 住宅のプロキシ: ProxyHat住宅IP クリーンIPの評判のため。
  2. ブラウザグレード TLS: curl_cffi または正しい指紋のためのヘッドレスブラウザ。
  3. 一貫したヘッダー: 完全なヘッダーは要求されたブラウザに一致させます。
  4. 自然なタイミング: 人間のブラウジングパターンに従ったランダム化遅延。
  5. クッキーの管理: セッションを通してクッキーを受け入れ、維持します。
  6. リファレンスチェーン: ホームページからターゲットページへの最適なナビゲーションフロー。

包括的な検出削減戦略については、 完全な反検出ガイド. プログラミング言語のプロキシ統合については、ガイドを参照してください。 フィードバック, ノード.jsおすすめ. .

治療しないとき

スクレイピングが正しいアプローチではない状況を認識する:

  • 本サイトには公開APIがあります。 利用可能なときに常に公式 API を使用します。
  • データは認証後にあります。 スクラップによるログイン保護されたデータへのアクセスは通常、ToS 違反です。
  • スクラップを明示的に禁止するサイト: ToSの明確な禁止事項を尊重します。
  • データのライセンスは利用できます: 商用利用の場合、データライセンスの購入は信頼性が高く、法的です。
  • コンテンツの著作権: 再配布のための著作権コンテンツのスクレイピングは、法的懸念を提起します。

詳しくはこちら ProxyHatのドキュメント 責任ある利用ガイドラインおよびサービス利用規約について

よくある質問

始める準備はできましたか?

AIフィルタリングで148か国以上、5,000万以上のレジデンシャルIPにアクセス。

料金を見るレジデンシャルプロキシ
← ブログに戻る