Web scraping không bị phát hiện: ảnh bìa minh họa bài viết Clawbrowser

Web scraping không bị phát hiện: kỹ thuật vẫn hiệu quả

Clawbrowser Teamweb-scrapinganti-botfingerprintingproxyhuong-dan

Scraper chạy tốt ở lần đầu. Đến lần thứ ba, bạn gặp 403, response rỗng hoặc vòng CAPTCHA. Code không đổi. Site cũng không đổi. Hệ thống anti-bot đã dựng profile của session và bắt đầu chặn.

TL;DR: đa số block đến từ bốn lớp: network, browser identity, hành vi và session state. Hãy bắt đầu bằng anti-detect browser xử lý fingerprints và proxy routing ở mức engine; code chỉ nên tập trung vào khảo sát, extraction, pagination và scale.

Mô hình bốn lớp đầy đủ nằm trong Tự động hóa browser không bị chặn: 4 lớp phòng thủ.


Khảo sát trước khi viết code

Viết scraper ngay thường dẫn đến phải viết lại. 10 phút khảo sát giúp chọn đúng stack.

Xác định hệ thống anti-bot

Mở DevTools trên site đích và xem response headers.

Header Hệ thống anti-bot
cf-ray, server: cloudflare Cloudflare Bot Management
x-akamai-transformed Akamai Bot Manager
x-datadome DataDome
x-px-* headers PerimeterX (now HUMAN)
Không có header nào ở trên Có thể không dùng anti-bot thương mại, hoặc dùng giải pháp riêng

Site không bảo vệ có thể dùng curl_cffi; site có Cloudflare cần browser thật với managed fingerprints.

Kiểm tra có API không

Trước khi dùng browser, mở Network và lọc XHR/Fetch. Nhiều site tải dữ liệu từ 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 nhanh hơn, nhưng site được bảo vệ có thể yêu cầu request đến từ session browser thật. Khi đó hãy load page bằng browser và intercept response.

Đánh giá cách render

Tắt JavaScript. Nếu nội dung vẫn hiện, HTTP đủ dùng. Nếu trang trắng, bạn cần browser engine.

Nội dung hiện khi tắt JS? Công cụ
Có, hiện đầy đủ curl_cffi or requests with TLS impersonation
Một phần curl_cffi for static parts, browser for dynamic
Không, trang trắng Full browser (Clawbrowser + Playwright/Puppeteer)

Chọn stack scraping

Công cụ phụ thuộc vào mức bảo vệ và cách render. Dùng browser đầy đủ khi HTTP đủ dùng sẽ tốn tài nguyên; dùng HTTP cho SPA được bảo vệ sẽ mất thời gian.

Cây quyết định

Không anti-bot + HTML server-rendered: dùng curl_cffi với TLS impersonation.

from curl_cffi import requests

response = requests.get(
    "https://unprotected-site.com/products",
    impersonate="chrome136"

Không anti-bot + JavaScript-rendered: dùng headless browser tiêu chuẩn.

Anti-bot + HTML server-rendered: dùng curl_cffi với residential proxy.

Anti-bot + JavaScript-rendered: dùng Clawbrowser với managed fingerprints và 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 là anti-detect browser local, miễn phí, dựa trên Chromium, có managed fingerprints, proxy routing, native CDP và MCP server tích hợp.


Mẫu trích xuất dữ liệu

Sau lớp anti-bot, nhiệm vụ là lấy dữ liệu có cấu trúc một cách ổn định.

Pagination

Pagination thường có ba dạng.

Pagination theo URL

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 (nội dung tải khi 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

Xử lý nội dung động

Một số dữ liệu chỉ xuất hiện sau click, mở accordion hoặc 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

Trích xuất từ shadow DOM

Component trong shadow DOM cần đọc qua shadow root.

# Pierce through shadow DOM to extract data
data = await page.evaluate("""
    () => {
        const host = document.querySelector('product-card');
        const shadow = host.shadowRoot;

Quản lý session cho scraping

Scraper truy cập nhiều trang hơn người thật. Session phải nhất quán theo thời gian.

Session warming

Đừng vào thẳng trang đích: home, category, cookie banner rồi mới scrape. Lớp hành vi được mô tả trong Tự động hóa browser không bị chặn: 4 lớp phòng thủ.

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

    # Accept cookies if banner appears

Xoay profile khi scale

Chia tải qua nhiều profile Clawbrowser, mỗi profile có fingerprint, cookies, storage và proxy riêng.

import asyncio
from playwright.async_api import async_playwright

async def scrape_batch(profile_name, urls):
    async with async_playwright() as p:
Quy mô Cách làm
< 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

Chẩn đoán block

Triệu chứng thường cho biết lớp nào đang lỗi.

Triệu chứng Nguyên nhân có thể Cách sửa
Bị chặn ở request đầu IP reputation hoặc browser fingerprint Dùng residential proxy và anti-detect browser
Chạy 5-10 trang rồi bị chặn Behavior hoặc giới hạn session Chậm lại, thêm 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
Chạy local được, production lỗi Datacenter IP Thêm residential proxy cho production
Trang trắng / spinner mãi JavaScript challenge failed Browser can't pass Cloudflare/Akamai JS check, needs real engine
Dữ liệu khác khi truy cập thủ công Geo or locale mismatch Proxy location doesn't match fingerprint timezone/language

Script chẩn đoán nhanh

import asyncio
from playwright.async_api import async_playwright

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

Scrape site được Cloudflare bảo vệ

Cloudflare kết hợp TLS, JavaScript, behavior và IP reputation.

Cloudflare kiểm tra gì

  1. TLS fingerprint (JA3/JA4): ClientHello không khớp sẽ bị challenge trước khi nhận HTML.
  2. JavaScript execution: Turnstile cần môi trường render thật.
  3. IP reputation: IP reputation được đánh giá trên hàng triệu site.
  4. Request patterns: request lặp lại trong cùng session bị đánh dấu nhanh.

Workflow

Giữ sạch mọi lớp: anti-detect browser cho TLS/JS, residential proxy cho IP, timing trong code.

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}"
        )

Chi tiết Cloudflare xem tại vì sao script Playwright bị Cloudflare chặn.


Scraping với AI agent

MCP server của Clawbrowser cho AI agent điều khiển session browser thật qua CDP, cùng fingerprints và proxy routing như code của bạn.

Hướng dẫn tích hợp đầy đủ ở CDP browser cho AI agent: hướng dẫn developer.


FAQ

Vì sao scraper chạy local nhưng lỗi ở production?

Local thường dùng IP dân cư, production dùng IP datacenter. Thêm residential proxy và kiểm tra managed fingerprints.

Nên dùng HTTP client hay browser?

HTTP đủ cho HTML server-rendered không anti-bot. Với JavaScript rendering hoặc challenge, dùng browser đầy đủ.

Làm sao biết site dùng Cloudflare?

Tìm cf-ray hoặc server: cloudflare trong response headers của DevTools.

Có scrape không cần proxies được không?

Được với site không bảo vệ. Sau Cloudflare/Akamai hoặc ở quy mô lớn, thường cần residential proxies.


Bắt đầu web scraping không bị phát hiện

Scraping ổn định bắt đầu từ khảo sát, chọn đúng công cụ và hạ tầng browser sạch.

Install Clawbrowser để xử lý browser identity và network: copy prompt cài đặt từ clawbrowser.ai rồi dán vào AI agent. Setup mất dưới hai phút.

Mô hình detection xem tại Tự động hóa browser không bị chặn: 4 lớp phòng thủ. Chi tiết fingerprinting xem tại Browser fingerprinting: hơn 20 tín hiệu anti-bot dùng để phát hiện automation.

Continue exploring

Ask AI how Clawbrowser helps

Đọc tiếp

Xem tất cả bài viết →