Scarnox · Blog

Cách scrape trang được Cloudflare bảo vệ (hướng dẫn 2026)

Cloudflare đứng trước một phần lớn của web công khai, nên một scraper chạy được trên một trang có thể gặp bức tường ở trang tiếp theo. Bạn thường nhận ra điều đó qua HTTP 403 hoặc 503, một trang "Just a moment...", hoặc một ô Turnstile trên trang. Hướng dẫn này giải thích Cloudflare đang kiểm tra điều gì, những cách khắc phục hiệu quả mà không đụng vào thứ bạn không nên đụng, và giải captcha nằm ở đâu trong bức tranh. Đáp án ngắn gọn: xác nhận bạn được phép scrape trang, chậm lại, gửi request giống một client bình thường, dùng trình duyệt thật khi trang cần JavaScript, và chỉ sau đó mới xử lý captcha. Turnstile là captcha Cloudflare dùng phổ biến nhất. Scarnox sắp hỗ trợ Turnstile. Captcha đang hoạt động hiện nay là PopularCaptcha.

Cloudflare đang kiểm tra điều gì

Cloudflare chấm điểm mọi request dựa trên nhiều tín hiệu:

Điểm cao thì qua mà không ai hay. Điểm trung bình nhận một thử thách tương tác. Điểm thấp bị chặn. Phần lớn công việc là nâng điểm bằng cách cư xử như một client tử tế, không phải bằng cách chống lại kiểm tra.

Bước 1: kiểm tra bạn có nên scrape trang không

Trước mọi công việc kỹ thuật, hãy đọc robots.txt và điều khoản dịch vụ của trang. Một lần chặn thường là chủ trang đang nói với bạn điều gì đó. Scrape các trang công khai một cách chậm rãi và với mục đích rõ ràng là một chuyện. Vượt qua một lần chặn để tiếp cận dữ liệu mà chủ trang đã hạn chế là chuyện khác, và đó là cách dùng mà Scarnox không hỗ trợ. Tổng quan pháp lý bao quát các câu hỏi chung.

Bước 2: làm cho request thường đúng

Nhiều scraper trông như "bị chặn" thực chất chỉ đang gửi những request kém. Hãy sửa những điều này trước:

import random
import time
import requests

session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/124.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
})

def polite_get(url: str, attempts: int = 4) -> requests.Response:
    r = None
    for attempt in range(attempts):
        r = session.get(url, timeout=30)
        if r.status_code not in (429, 503):
            return r
        # Backoff lũy thừa kèm jitter: khoảng 1, 2, 4 giây cộng nhiễu.
        time.sleep(2 ** attempt + random.uniform(0, 1))
    return r

Nếu cách này giúp bạn vượt qua, bạn đã xong. Giữ độ trễ đó.

Bước 3: xác định bạn đang gặp thử thách nào

Phản hồi cho bạn biết rất nhiều:

Kiểm tra bạn đang thấy cái nào sẽ tiết kiệm rất nhiều công sức lãng phí.

Bước 4: dùng trình duyệt thật khi trang cần

Nếu trang chỉ hiển thị nội dung sau khi JavaScript chạy, một client HTTP thuần sẽ không bao giờ thấy nó. Hãy điều khiển một trình duyệt đầy đủ bằng Playwright hoặc Selenium. Headless browser có thể bị phát hiện, nên hãy đọc phát hiện headless browser trước khi dựa vào nó, và cấu hình nó khớp với môi trường mà một khách truy cập thật sẽ có. Hướng dẫn trang JavaScript có một ví dụ đầy đủ.

Bước 5: kiểm tra danh tiếng IP của bạn

Địa chỉ trung tâm dữ liệu đám mây là nguyên nhân phổ biến nhất khiến một request sạch vẫn nhận điểm thấp. Địa chỉ dân cư thường được chấm điểm tốt hơn, với cái giá là tốc độ và chi phí cao hơn. Sự đánh đổi được trình bày trong proxy dân cư và proxy datacenter.

Xoay vòng cũng có cạm bẫy riêng. Đổi địa chỉ ở mỗi request trông không tự nhiên, vì một khách truy cập thật giữ một địa chỉ trong suốt một lần truy cập. Phiên cố định, trong đó một địa chỉ được giữ cho một nhóm request liên quan, thường hoạt động tốt hơn xoay nhanh. Proxy xoay vòng cho scraping đi sâu vào chi tiết.

Bước 6: captcha giải quyết nằm ở đâu

Đôi khi widget thực sự xuất hiện, trên một form bạn đang kiểm thử hoặc trên một trang bạn được phép tự động hóa. Khi đó một token Turnstile là bước bắt buộc trong luồng. Scarnox sắp hỗ trợ Turnstile, nên đừng xây dựng code production dựa trên nó lúc này. Loại captcha đang hoạt động hôm nay là PopularCaptcha, dùng một widget khác.

Quy trình chung cho bất kỳ captcha dạng token nào đều giống nhau. Bạn đọc sitekey từ trang, yêu cầu một token, và đặt token vào trường form mà trang mong đợi. Token có thời hạn ngắn, nên hãy gửi ngay. Hướng dẫn Python cho PopularCaptcha chỉ quy trình đó từ đầu đến cuối, và các loại captcha được giải thích so sánh các widget bạn sẽ gặp.

Nếu bạn muốn sẵn sàng khi hỗ trợ Turnstile ra mắt, bạn có thể bắt đầu dùng thử ngay. Bắt đầu với tín dụng dùng thử miễn phí, không cần thẻ: tạo tài khoản. Để biết giá hiện tại của loại captcha đang hoạt động, xem trang giá.

Scrape có trách nhiệm

Bước tiếp theo