不被检测的 Web Scraping: Clawbrowser 文章封面

不被检测的 Web Scraping: 仍然可靠的技术路线

Clawbrowser Teamweb-scrapinganti-botfingerprintingproxyguide

scraper 第一次运行正常。第三次开始出现 403、空 response 或 CAPTCHA 循环。代码没变,站点也没变。变化的是 anti-bot 系统已经建立了你的 session profile,并开始拦截。

TL;DR: 大多数封锁来自四层: network、browser identity、behavior 和 session state。先使用能在 engine 层管理 fingerprints 和 proxy routing 的 anti-detect browser,再让代码专注于侦察、提取、pagination 和扩展。

四层模型的完整说明见 不被封锁的浏览器自动化: 四层防御栈.


写代码前先侦察

直接写 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 的真实 browser。

检查是否有 API

使用 browser 之前,先在 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 更快,但受保护站点可能要求 API call 来自真实 browser session。此时应加载页面并 intercept response。

判断渲染模型

关闭 JavaScript。如果内容还在,HTTP 足够。如果页面空白,需要 browser engine。

关闭 JS 后内容可见? 工具
是,完整可见 curl_cffi or requests with TLS impersonation
部分可见 curl_cffi for static parts, browser for dynamic
否,页面空白 Full browser (Clawbrowser + Playwright/Puppeteer)

选择 scraping stack

工具取决于保护强度和渲染方式。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: 使用 Clawbrowser、managed fingerprints 和 residential proxy。

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 是本地、免费、基于 Chromium 的 anti-detect browser,提供 managed fingerprints、proxy routing、native CDP 和内置 MCP server。


数据提取模式

通过 anti-bot 层后,核心工作是稳定提取结构化数据。

Pagination

pagination 常见三种形式。

URL-based 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 (滚动加载内容):

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

处理动态内容

部分数据只会在 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 中的组件需要通过 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

不要直接访问目标页。先 home、category、cookie banner,再 scrape。behavior 层见 不被封锁的浏览器自动化: 四层防御栈.

async def warm_session(page, site_url):
    await page.goto(site_url)
    await human_delay(2000, 4000)

    # Accept cookies if banner appears

规模化时轮换 profiles

把大量任务分到多个 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 detection 或 session limits 降速、加 delay、warm session
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
本地正常,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

快速诊断脚本

import asyncio
from playwright.async_api import async_playwright

async def diagnose_blocking(target_url):
    async with async_playwright() as p:

Scrape Cloudflare 保护的站点

Cloudflare 同时评估 TLS、JavaScript、behavior 和 IP reputation。

Cloudflare 检查什么

  1. TLS fingerprint (JA3/JA4): ClientHello 不一致会在 HTML 前触发 challenge。
  2. JavaScript execution: Turnstile 需要真实渲染环境。
  3. IP reputation: IP reputation 在大量站点上累计评估。
  4. Request patterns: 同一 session 的重复 request pattern 会被标记。

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 脚本会被 Cloudflare 阻止.


AI agent scraping

Clawbrowser 的 MCP server 让 AI agent 通过 CDP 控制真实 browser sessions,并使用同样的 fingerprints 和 proxy routing。

完整集成指南见 面向 AI Agent 的 CDP Browser: 开发者指南.


FAQ

为什么 scraper 本地能跑,production 失败?

本地通常是 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 层: 从 clawbrowser.ai 复制安装 prompt,粘贴到 AI agent。setup 不到两分钟。

detection model 见 不被封锁的浏览器自动化: 四层防御栈. fingerprinting 细节见 Browser Fingerprinting: Anti-Bot 系统使用的 20+ 个信号.

Continue exploring

Ask AI how Clawbrowser helps

继续阅读

查看全部 →