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:
- Danh tiếng IP. Địa chỉ từ trung tâm dữ liệu đám mây bắt đầu với điểm thấp hơn địa chỉ từ kết nối gia đình.
- Tốc độ và mẫu request. Hàng trăm request mỗi giây từ một địa chỉ trông như bot, bất kể header nói gì.
- Header và dấu vân tay TLS. Một thư viện HTTP trần thường gửi header, thứ tự header và bắt tay TLS mà không trình duyệt phổ biến nào gửi.
- Thực thi JavaScript. Trang thử thách chạy script và kiểm tra có một môi trường trình duyệt thật hay không.
- Cookie. Sau khi vượt qua thử thách, Cloudflare cấp một cookie thông hành gắn với phiên đó.
Đ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:
- Gửi một User-Agent hiện đại và các header mà trình duyệt sẽ gửi, như
AcceptvàAccept-Language. - Giữ một đối tượng session để cookie tồn tại qua các request, như một trình duyệt sẽ làm.
- Thêm độ trễ giữa các request, kèm một chút jitter ngẫu nhiên.
- Lùi lại khi gặp
429và503, thay vì retry trong một vòng lặp dày đặ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:
- Trang "Just a moment...". Đây là thử thách JavaScript. Một trình duyệt thật thường tự vượt qua sau vài giây. Cookie thông hành khi đó có thể được dùng lại cho các request sau trong cùng phiên.
- Widget Turnstile trên form hoặc trang. Đây là captcha. Nó cần một token từ widget trước khi form chấp nhận việc gửi.
- Trang chặn kèm mã lỗi. Địa chỉ hoặc request đã bị từ chối hoàn toàn. Thay đổi nhịp độ và sửa request thường giúp hơn bất cứ thứ gì khác. Giải quyết không biến một lần chặn cứng thành dữ liệ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
- Đọc
robots.txtvà tôn trọng điều khoản của trang bạn scrape. - Giới hạn tốc độ crawler của bạn, và chạy vào giờ thấp điểm nếu có thể.
- Cache phản hồi để bạn không bao giờ tải cùng một trang hai lần mà không có lý do.
- Tránh thu thập dữ liệu cá nhân trừ khi bạn có cơ sở pháp lý cho việc đó.
- Nếu một trang đã hạn chế truy cập, hãy dừng lại. Đừng cố vượt qua hạn chế.