クラウドフレア検出の仕組み
Cloudflareは、すべてのウェブサイトの20%以上を保護する、最も広く展開されているアンチボットサービスです。 自動トラフィックを検出する方法を理解することは、正当なスクレイピングツールを構築する人にとって不可欠です。 Cloudflareは多層検出パイプラインを使用します。
- IPの評判のスコアリング: Cloudflareは、グローバルな脅威インテリジェンスデータベースを維持しています。 データセンターIP、既知のVPN範囲、および以前にフラグジされたアドレスは、より高いリスクスコアを受け取ります。
- TLSの指紋: クラウドフレア解析 TLS ClientHello メッセージ 接続クライアントが要求されたアイデンティティに一致するかどうかを判断します。
- ブラウザの指紋: JavaScriptの課題プローブ キャンバス、WebGL、ナビゲーターの特性他の信号の数十、および数十。
- JavaScriptの課題: Cloudflareは、実際のブラウザ環境で正しく実行しなければならないJavaScriptを提供しています。
- 行動分析: タイミング、ナビゲーションパターン、マウスの動き、インタラクション信号を解析します。
- 機械学習モデル: すべての信号は、継続的に新しい自動化パターンに適応する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 署名をすべて生成します。
| クライアント | 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/min | 2-3秒 |
| プロフィール | 10-20 req/min | 3-6秒 |
| 事業内容 | 5-10 req/min | 6-12秒 |
| エンタープライズ | 2-5 req/min | 12-30秒 |
戦略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
完全な多層アプローチ
最も信頼できる戦略は、すべてのレイヤーを組み合わせます。
- 住宅のプロキシ: ProxyHat住宅IP クリーンIPの評判のため。
- ブラウザグレード TLS:
curl_cffiまたは正しい指紋のためのヘッドレスブラウザ。 - 一貫したヘッダー: 完全なヘッダーは要求されたブラウザに一致させます。
- 自然なタイミング: 人間のブラウジングパターンに従ったランダム化遅延。
- クッキーの管理: セッションを通してクッキーを受け入れ、維持します。
- リファレンスチェーン: ホームページからターゲットページへの最適なナビゲーションフロー。
包括的な検出削減戦略については、 完全な反検出ガイド. プログラミング言語のプロキシ統合については、ガイドを参照してください。 フィードバック, ノード.jsと おすすめ. .
治療しないとき
スクレイピングが正しいアプローチではない状況を認識する:
- 本サイトには公開APIがあります。 利用可能なときに常に公式 API を使用します。
- データは認証後にあります。 スクラップによるログイン保護されたデータへのアクセスは通常、ToS 違反です。
- スクラップを明示的に禁止するサイト: ToSの明確な禁止事項を尊重します。
- データのライセンスは利用できます: 商用利用の場合、データライセンスの購入は信頼性が高く、法的です。
- コンテンツの著作権: 再配布のための著作権コンテンツのスクレイピングは、法的懸念を提起します。
詳しくはこちら ProxyHatのドキュメント 責任ある利用ガイドラインおよびサービス利用規約について






