Trả lời nhanh
Trình scraper nên xử lý các phản hồi 403, 429 và CAPTCHA như thế nào?
Xem chúng là tín hiệu, không phải trở ngại. Khi gặp 429, đợi Retry-After rồi giảm tốc độ truy cập ở máy chủ đó. Khi gặp 403, thử lại một lần sau khi tạm dừng, rồi dừng hẳn và kiểm tra quy tắc trang web. Khi gặp CAPTCHA, dừng máy chủ đó: không giải quyết tự động. CrawlRelay proxy dân cư, từ 0,50 US$/GB, phân bổ tải và định vị vị trí; không phải cách để qua mặt quyết định của trang web. Không cần KYC. Thanh toán bằng crypto.
Ba tín hiệu tóm tắt
| 429 Quá Nhiều Yêu Cầu | Bạn truy cập quá nhanh. Tuân thủ Retry-After, lùi lại, giảm kết nối đồng thời theo máy chủ |
|---|---|
| 403 Forbidden | Yêu cầu này bị từ chối. Thử lại một lần sau khi tạm dừng, rồi dừng và xem lại |
| CAPTCHA hoặc trang thách thức | Trang web muốn kiểm tra bạn có phải người thật không. Dừng máy chủ đó và giảm tốc độ |
| Tiêu chuẩn về quy tắc thu thập dữ liệu | robots.txt, RFC 9309; Crawl-delay là phần mở rộng phổ biến |
| Những gì chúng tôi không hỗ trợ | Giải CAPTCHA, plugin tàng hình, giả mạo dấu vân tay thiết bị |
Mỗi tín hiệu đang nói gì với trình thu thập dữ liệu của tôi?
- 429 lịch sự nhất: nội dung có sẵn, nhưng không theo tốc độ của bạn. RFC 6585 định nghĩa nó, thường kèm header
Retry-Afterthông báo thời điểm nên trở lại. - 403 là từ chối yêu cầu này. Có thể sửa được (quốc gia sai, thiếu header, truy cập quá nhanh) hoặc cuối cùng (trang web không cho phép truy cập tự động nội dung đó).
- CAPTCHA hoặc trang thách thức, thường đi kèm mã 403 hoặc 503, có nghĩa là hệ thống quản lý bot của trang nghi ngờ lưu lượng của bạn. Đây là bước leo thang: sau khi bị bỏ qua tín hiệu 429.
Cả ba đều là tín hiệu gia tăng. Các trang web nếu thấy mình bị bỏ qua 429 sẽ nâng lên 403 và thách thức, rồi cấm lâu trên toàn bộ dải IP, gây hại cho mọi người dùng dải IP đó.
Trình thu thập dữ liệu của tôi nên làm gì với mỗi tín hiệu?
| Tín hiệu | Phản hồi đầu tiên | Nếu tiếp tục | Dừng khi |
|---|---|---|---|
| 429 | Chờ Retry-After hoặc lùi dần theo hàm mũ có sự dao động | Giảm một nửa số kết nối đồng thời trên máy chủ đó | Retry-After tăng hay 429 vẫn xuất hiện khi gửi một yêu cầu mỗi lần |
| 403 | Thử lại một lần sau tạm dừng, cùng quốc gia | So sánh với trình duyệt từ quốc gia giống vậy; kiểm tra robots.txt và điều khoản | Lần 403 thứ hai trên cùng mẫu URL |
| CAPTCHA / thách thức | Ngừng máy chủ vài phút | Tiếp tục với tốc độ thấp hơn nhiều | Thách thức lặp lại ngay cả tốc độ thấp: trang không cho truy cập tự động |
| 503 kèm Retry-After | Chờ theo yêu cầu | Ngừng máy chủ | Hầu hết yêu cầu lỗi trong hơn vài phút |
Làm sao để xây dựng trình thu thập dữ liệu đáp ứng đúng?
Đặt quy tắc trong trình lấy dữ liệu, không phải mỗi spider. Trình này gửi một yêu cầu mỗi lần trên mỗi máy chủ, tuân thủ robots.txt và Crawl-delay, chờ Retry-After, và dừng hỏi máy chủ sau ba lần từ chối liên tiếp. Xử lý 4xx robots.txt như cho phép và 5xx như cấm hoàn toàn, theo RFC 9309.
import time
import urllib.robotparser
from urllib.parse import urlsplit
import requests
PROXY = "http://USERNAME-country-us:[email protected]:7777"
USER_AGENT = "ExampleCrawler/1.0 (+https://example.com/crawler-info)"
class PoliteFetcher:
"""One request at a time per host; robots.txt, Crawl-delay and Retry-After honoured."""
def __init__(self, min_interval=1.0, max_refusals=3):
self.min_interval, self.max_refusals = min_interval, max_refusals
self.http = requests.Session()
self.http.proxies = {"http": PROXY, "https": PROXY}
self.http.headers["User-Agent"] = USER_AGENT
self.robots, self.next_time, self.refusals = {}, {}, {}
def _robots(self, root):
if root not in self.robots:
rp = urllib.robotparser.RobotFileParser(root + "/robots.txt")
try:
r = self.http.get(root + "/robots.txt", timeout=(10, 30))
if r.status_code >= 500:
rp.parse(["User-agent: *", "Disallow: /"]) # unreachable: assume disallow
else:
rp.parse(r.text.splitlines() if r.status_code == 200 else []) # 4xx: allowed
except requests.RequestException:
rp.parse(["User-agent: *", "Disallow: /"])
self.robots[root] = rp
return self.robots[root]
def get(self, url):
scheme, host = urlsplit(url)[:2]
if self.refusals.get(host, 0) >= self.max_refusals:
return None # this host said no: stop asking
rp = self._robots("%s://%s" % (scheme, host))
if not rp.can_fetch(USER_AGENT, url):
return None
delay = max(self.min_interval, rp.crawl_delay(USER_AGENT) or 0)
wait = self.next_time.get(host, 0) - time.monotonic()
if wait > 0:
time.sleep(wait)
r = self.http.get(url, timeout=(10, 30))
pause = delay
if r.status_code in (429, 503):
retry_after = r.headers.get("Retry-After", "")
pause = max(delay, int(retry_after) if retry_after.isdigit() else 60)
refused = r.status_code in (403, 429) or "captcha" in r.text[:5000].lower()
self.refusals[host] = self.refusals.get(host, 0) + 1 if refused else 0
self.next_time[host] = time.monotonic() + pause
return r
fetcher = PoliteFetcher()
resp = fetcher.get("https://example.com/")
print(resp.status_code if resp is not None else "skipped")Những gì có thể sửa được khi gặp 403?
Một số nguyên nhân 403 do bạn, và sửa chúng là hợp lý:
- Quốc gia sai. Nhiều trang chỉ phục vụ một khu vực. Hướng đến quốc gia với
-country-<code>proxy di động 4G. - Thiếu header. Gửi
Accept,Accept-Languagevà user agent trung thực kèm URL liên hệ. User agent giả trình duyệt trên client HTTP thô thường bị từ chối. - Tốc độ của bạn. 403 bắt đầu sau N lần yêu cầu là vấn đề tốc độ; hãy giảm tốc.
Những gì không phải cách sửa: đổi user agent để giả nhiều người khác nhau, giả dấu vân tay trình duyệt, hoặc thay IP để vượt chặn cố ý của trang. Nếu trang lọc dải hosting để chặn truy cập tự động, IP proxy dân cư không đồng nghĩa được phép truy cập.
Tại sao không chỉ giải CAPTCHA?
Bởi vì CAPTCHA là trang web hỏi bạn một câu mà bạn sẽ trả lời sai. Việc giải tự động biến một trình thu thập dữ liệu lịch sự thành công cụ nhằm vượt qua kiểm soát truy cập, điều này làm tăng rủi ro pháp lý của bạn: các vụ án tại Mỹ năm 2026 về việc lấy dữ liệu tìm kiếm, Google kiện SerpApi và Reddit kiện SerpApi cùng các vụ khác, đưa ra cáo buộc bị cáo đã vượt qua hệ thống chống bot theo quy định chống vượt rào của DMCA. Các tòa án chưa giải quyết dứt điểm, nhưng rủi ro là có thật.
CrawlRelay không hỗ trợ giải CAPTCHA hay né tránh phát hiện bot, và Chính sách Sử dụng Chấp nhận được cấm các hành vi này qua cổng dịch vụ. Nếu bạn cần dữ liệu bị chặn thử thách, hãy liên hệ trang web để được cấp quyền, sử dụng API của nó hoặc xin cấp phép dữ liệu.
Khi nào tôi nên liên hệ với trang web?
Khi bạn cần nhiều hơn những gì mặc định cho phép. Nhiều trang web cung cấp API, nguồn cấp dữ liệu, chương trình đối tác hoặc đơn giản là hạn mức cao hơn cho crawler tự nhận dạng và giải thích mục đích. Đặt URL liên hệ vào user agent của bạn, giữ một trang mô tả crawler và cách người dùng có thể từ chối, và phản hồi nhanh các báo cáo lạm dụng. Một crawler có thể liên hệ sẽ nhận cảnh báo trước khi bị chặn.
403, 429 và CAPTCHA: các câu hỏi
Proxy dân cư có ngăn CAPTCHA không?
Đừng trông đợi vào điều đó. Một proxy dân cư thay đổi IP mà trang web thấy, không phải cách trình thu thập dữ liệu của bạn hoạt động: CAPTCHA do tốc độ hoặc hành vi của bạn vẫn xảy ra và đó là ý đồ. Nếu thử thách vẫn xuất hiện ở tần suất yêu cầu thấp, trang web không muốn truy cập tự động vào nội dung đó.
Tôi nên chờ bao lâu sau lỗi 429 không có Retry-After?
Bắt đầu với vài giây và tăng gấp đôi thời gian chờ sau mỗi lần gặp lỗi 429 mới, thêm khoảng thời gian ngẫu nhiên và tối đa khoảng một phút. Khi các yêu cầu thành công trở lại, giảm tốc độ so với mức gây ra lỗi 429 và tăng dần nếu tỷ lệ lỗi giữ ổn định.
Việc thay đổi IP để tránh giới hạn tần suất có được phép không?
Việc xoay IP phân phối tải qua các proxy và chọn vị trí là bình thường. Nhưng dùng xoay IP để giữ dưới giới hạn mỗi IP trong khi vẫn giữ tốc độ bị trang web từ chối là hành vi né tránh. Hầu hết điều khoản sử dụng cấm việc này, và Chính sách Sử dụng Chấp nhận được của chúng tôi cũng vậy.
User agent nào nên gửi cho trình thu thập dữ liệu của tôi?
Hãy dùng user agent của riêng bạn: tên, phiên bản và URL giải thích crawler cũng như cách liên hệ với bạn, ví dụ như ExampleCrawler/1.0 (+https://example.com/crawler-info). Đừng dùng tên crawler khác như Googlebot hay GPTBot.
Nguồn (4)
- RFC 9309: Giao thức Loại trừ Robots — IETF (2022-09)
- RFC 6585: Các mã trạng thái HTTP bổ sung (429) — IETF (2012-04)
- Reddit kiện SerpApi LLC — Loeb & Loeb (2026-08)
- Google kiện SerpApi: tòa cho phép chúng tôi bác đơn — SerpApi (2026-07-21)
Proxy dân cư cho trình thu thập lịch sự
1,50 US$ cho 1 GB, 0,50 US$/GB từ 50 GB.