検知されにくいWebスクレイピング: Clawbrowser記事カバー

検知されにくいWebスクレイピング: 実用的な設計

Clawbrowser Teamweb-scrapinganti-botfingerprintingproxyguide

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 level

Clawbrowserは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 data

shadow 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が見るもの

  1. TLS fingerprint (JA3/JA4): ClientHelloが不自然ならHTML前にchallengeが出ます。
  2. JavaScript execution: Turnstileには実rendering環境が必要です。
  3. IP reputation: IP reputationは大量のサイト横断で評価されます。
  4. 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

続きを読む

すべての記事 →