scraperは最初の実行では動きます。3回目には403、空のresponse、またはCAPTCHAループになります。コードもサイトも変わっていません。anti-botシステムがsessionの特徴を学習し、ブロックし始めただけです。
TL;DR: ブロックの多くはnetwork、browser identity、behavior、session stateの4層で起きます。fingerprintsとproxy routingをengineレベルで管理するanti-detect browserから始め、コードは調査、抽出、pagination、スケールに集中させます。
4層モデルの詳細は ブロックされにくいブラウザ自動化: 4層の防御スタック.
コードを書く前の調査
いきなりscraperを書くと作り直しになりがちです。10分の調査で正しいstackを選べます。
anti-botシステムを特定する
対象サイトでDevToolsを開き、response headersを確認します。
| Header | anti-botシステム |
|---|---|
cf-ray, server: cloudflare |
Cloudflare Bot Management |
x-akamai-transformed |
Akamai Bot Manager |
x-datadome |
DataDome |
x-px-* headers |
PerimeterX (now HUMAN) |
| 該当なし | 商用anti-botなし、または独自実装の可能性 |
保護が弱いサイトはcurl_cffiで十分です。Cloudflare配下ならmanaged fingerprints付きの実ブラウザが必要です。
APIの有無を確認する
browser scraperを作る前にNetworkでXHR/Fetchを見ます。多くのサイトはJSON endpointからデータを読みます。
# If the site loads product data from an API endpoint
from curl_cffi import requests
response = requests.get(
"https://target-site.com/api/v2/products?category=electronics&page=1",endpointは速いですが、保護されたサイトでは実ブラウザsessionからのAPI callを期待することがあります。その場合はページを読み込み、responseをinterceptします。
rendering modelを確認する
JavaScriptを無効化します。contentが残るならHTTPで十分です。空になるならbrowser engineが必要です。
| JSなしでcontentが見える? | 使うツール |
|---|---|
| はい、全て表示 | curl_cffi or requests with TLS impersonation |
| 一部のみ | curl_cffi for static parts, browser for dynamic |
| いいえ、空ページ | Full browser (Clawbrowser + Playwright/Puppeteer) |
scraping stackを選ぶ
保護レベルとrendering modelでツールを選びます。HTTPで足りるのにbrowserを使うと重く、保護されたSPAにHTTPだけで挑むと詰まります。
判断フロー
anti-botなし + server-rendered HTML: curl_cffiとTLS impersonationを使います。
from curl_cffi import requests
response = requests.get(
"https://unprotected-site.com/products",
impersonate="chrome136"anti-botなし + JavaScript-rendered: 標準のheadless browserを使います。
anti-bot + server-rendered HTML: curl_cffiとresidential proxyを使います。
anti-bot + JavaScript-rendered: managed fingerprintsとresidential proxy付きのClawbrowserを使います。
from playwright.async_api import async_playwright
async def scrape_protected_site():
async with async_playwright() as p:
# Clawbrowser handles fingerprints, TLS and proxy at the engine levelClawbrowserはlocalで無料のChromiumベースanti-detect browserです。managed fingerprints、proxy routing、native CDP、組み込みMCP serverを備えています。
データ抽出パターン
anti-bot層を越えたら、構造化データを安定して取り出す段階です。
Pagination
paginationには主に3つの形があります。
URLベースのpagination
async def scrape_paginated(page, base_url, max_pages=50):
all_items = []
for page_num in range(1, max_pages + 1):
await page.goto(f"{base_url}?page={page_num}")
await human_delay(2000, 4000)Infinite scroll (scrollで読み込むcontent):
async def scrape_infinite_scroll(page, max_scrolls=30):
all_items = []
previous_count = 0
for _ in range(max_scrolls):"Load more" button:
async def scrape_load_more(page):
while True:
load_more = await page.query_selector('[data-testid="load-more"]')
if not load_more:
break動的contentの扱い
click、accordion、hoverの後にだけ出るデータがあります。
async def extract_product_details(page, product_url):
await page.goto(product_url)
await human_delay(1000, 2000)
# Click "Specifications" tab to reveal hidden datashadow DOMから抽出する
shadow DOM内のcomponentはshadow root経由で読みます。
# Pierce through shadow DOM to extract data
data = await page.evaluate("""
() => {
const host = document.querySelector('product-card');
const shadow = host.shadowRoot;scrapingのsession管理
scraperは人間より多くのページを連続で開きます。sessionの一貫性が重要です。
Session warming
いきなりtarget pageへ行かず、home、category、cookie bannerの順に進めます。behavior層は ブロックされにくいブラウザ自動化: 4層の防御スタック.
async def warm_session(page, site_url):
await page.goto(site_url)
await human_delay(2000, 4000)
# Accept cookies if banner appearsスケール時のprofile rotation
大量のURLは複数のClawbrowser profilesに分散します。各profileはfingerprint、cookies、storage、proxyを個別に持ちます。
import asyncio
from playwright.async_api import async_playwright
async def scrape_batch(profile_name, urls):
async with async_playwright() as p:| 規模 | 推奨アプローチ |
|---|---|
| < 100 pages/day | Single profile, residential proxy, 3-5s delays |
| 100-1,000 pages/day | 3-5 rotating profiles, sticky residential sessions |
| 1,000-10,000 pages/day | 10+ profiles, proxy pool, session warming |
| 10,000+ pages/day | Distributed setup, multiple Clawbrowser instances, backoff logic |
ブロックを診断する
症状を見ると、失敗している層が分かります。
| 症状 | 原因候補 | 対処 |
|---|---|---|
| 最初のrequestでブロック | IP reputationまたはbrowser fingerprint | residential proxyとanti-detect browserに切り替える |
| 5-10ページ後にブロック | behavior検知またはsession limit | 遅くし、delayを入れ、sessionをwarmする |
| CAPTCHA on every page | Fingerprint leak | Browser is leaking automation signals, switch to managed fingerprints |
| 403 after proxy rotation | Browser fingerprint unchanged | New IP but same broken fingerprint, fix the browser layer |
| localでは動きproductionで失敗 | Datacenter IP | productionにresidential proxyを追加 |
| 空ページ / spinnerが続く | JavaScript challenge failed | Browser can't pass Cloudflare/Akamai JS check, needs real engine |
| 手動訪問とデータが違う | Geo or locale mismatch | Proxy location doesn't match fingerprint timezone/language |
簡易診断script
import asyncio
from playwright.async_api import async_playwright
async def diagnose_blocking(target_url):
async with async_playwright() as p:Cloudflare保護サイトをscrapeする
CloudflareはTLS、JavaScript、behavior、IP reputationを同時に見ます。
Cloudflareが見るもの
- TLS fingerprint (JA3/JA4): ClientHelloが不自然ならHTML前にchallengeが出ます。
- JavaScript execution: Turnstileには実rendering環境が必要です。
- IP reputation: IP reputationは大量のサイト横断で評価されます。
- Request patterns: 同じsessionの反復requestはflagされます。
workflow
全層を同時に整えます。TLS/JSはanti-detect browser、IPはresidential proxy、timingはコードで管理します。
async def scrape_cloudflare_site(target_url, profile="cf-scraper"):
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(
f"http://127.0.0.1:9222?profile={profile}"
)Cloudflareの詳細は Playwright scriptsがCloudflareにブロックされる理由.
AI agent scraping
ClawbrowserのMCP serverを使うと、AI agentがCDP経由で実ブラウザsessionを操作できます。fingerprintsとproxy routingはコード実行時と同じです。
完全な連携ガイドは AI agents向けCDP Browser: Developer Guide.
FAQ
localでは動くのにproductionで失敗するのはなぜですか?
localはresidential IP、productionはdatacenter IPであることが多いです。residential proxyを追加し、managed fingerprintsを確認します。
HTTP clientとbrowserのどちらを使うべきですか?
server-rendered HTMLでanti-botなしならHTTPで十分です。JavaScript renderingやchallengeがあるならbrowserを使います。
Cloudflareを使っているかどうかはどう確認しますか?
DevToolsのresponse headersでcf-rayまたはserver: cloudflareを探します。
proxiesなしでscrapeできますか?
保護のないサイトなら可能です。CloudflareやAkamai配下、または大規模ではresidential proxiesがほぼ必要です。
検知されにくいWeb scrapingを始める
安定したscrapingは、調査、適切なツール、きれいなbrowser infrastructureから始まります。
Install Clawbrowser でbrowser identityとnetwork層を処理します。install promptを clawbrowser.ai からコピーし、AI agentへ貼り付けます。setupは2分以内です。
detection modelは ブロックされにくいブラウザ自動化: 4層の防御スタック. fingerprintingの詳細は Browser fingerprinting: anti-botシステムが見る20以上のシグナル.
Continue exploring
Ask AI how Clawbrowser helps
続きを読む


