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 levelClawbrowser 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:
breakXử 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 dataTrí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 appearsXoay 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ì
- TLS fingerprint (JA3/JA4): ClientHello không khớp sẽ bị challenge trước khi nhận HTML.
- JavaScript execution: Turnstile cần môi trường render thật.
- IP reputation: IP reputation được đánh giá trên hàng triệu site.
- 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
Bài viết liên quan

Tự động hóa trình duyệt không bị chặn: 4 lớp phòng thủ
Vì sao browser automation bị chặn và cách khắc phục ở mọi lớp: danh tính trình duyệt, mạng, hành vi và quản lý session. Hướng dẫn cấu trúc cho developer.
Đọc bài viết →
Giải thích Browser Fingerprinting: Hơn 20 signal Anti-Bot System dùng để phát hiện automation
Tài liệu đầy đủ về browser fingerprinting, các signal quan trọng và vì sao coherence hiệu quả hơn spoofing cho developer AI agent và automation engineer.
Đọc bài viết →