Giới hạn tốc độ khi cào dữ liệu: cào nhanh đến đâu là vừa
Cập nhật:
Giới hạn tốc độ (rate limit) khi cào dữ liệu là ngưỡng số request mà website chấp nhận từ một nguồn trong một khoảng thời gian; vượt ngưỡng, bạn nhận lỗi 429, trang CAPTCHA hoặc bị chặn hẳn. Cách cào bền là đi chậm hơn ngưỡng đó: đọc robots.txt và điều khoản, giới hạn số kết nối đồng thời trên mỗi domain, thêm độ trễ ngẫu nhiên, lùi lại theo cấp số nhân khi bị từ chối, và chia tải cho đủ số IP. Bài này giải thích website đo tốc độ theo những gì, cách tự đặt nhịp trong code và cách tính bạn thực sự cần bao nhiêu IP.
Website đo tốc độ của bạn theo những gì
Nhiều người nghĩ rate limit chỉ tính theo IP, nên cứ thêm IP là cào nhanh hơn. Thực tế website có thể đếm request theo nhiều khoá cùng lúc, và thêm IP chỉ giải quyết được một trong số đó. Hiểu website đang đếm theo khoá nào giúp bạn sửa đúng chỗ thay vì mua thêm proxy vô ích.
| Khoá đếm | Ví dụ | Thêm IP có giúp không |
|---|---|---|
| Địa chỉ IP | Mỗi IP chỉ được một số request mỗi phút | Có, chia tải cho nhiều IP |
| Dải IP hoặc ASN | Cả một subnet hay một nhà cung cấp hạ tầng bị siết chung | Ít, nếu các IP nằm cùng dải |
| Cookie, phiên | Một phiên duyệt quá nhiều trang trong thời gian ngắn | Không, phải giảm nhịp mỗi phiên |
| Tài khoản, API key | Hạn mức request của mỗi tài khoản đăng nhập | Không, hạn mức gắn với tài khoản |
| Vân tay trình duyệt, hành vi | Cùng một mẫu header, cùng nhịp đều đặn | Không, phải sửa cách gửi request |
Đọc robots.txt, điều khoản và header trước khi cào
Mở https://ten-mien/robots.txt để xem những đường dẫn website không muốn bot truy cập. Một số website còn khai báo Crawl-delay, tức số giây nên chờ giữa hai request; không phải công cụ nào cũng đọc chỉ thị này, nhưng đó là gợi ý rõ ràng nhất về nhịp mà chủ website chấp nhận. Đọc thêm điều khoản sử dụng: có website cấm thu thập tự động, có website cung cấp API chính thức hoặc file dữ liệu tải về, vốn nhanh và ổn định hơn nhiều so với cào HTML.
Khi đã chạy, hãy để ý header phản hồi. Retry-After đi kèm mã 429 hoặc 503 cho biết bao lâu nữa mới nên thử lại. Một số API trả thêm các header dạng X-RateLimit-Remaining hoặc RateLimit-Remaining cho biết còn bao nhiêu request trong cửa sổ hiện tại. Code tốt đọc các header này và tự giảm tốc, thay vì đợi đến khi bị chặn mới phản ứng.
Tự đặt nhịp trong code
Nguyên tắc chung là giới hạn ở hai tầng: số request đồng thời trên mỗi domain và khoảng cách tối thiểu giữa hai request trên cùng một IP. Bắt đầu chậm, theo dõi tỷ lệ lỗi, rồi mới tăng dần.
- Scrapy: đặt
CONCURRENT_REQUESTS_PER_DOMAIN,DOWNLOAD_DELAYvà bậtAUTOTHROTTLE_ENABLED = Trueđể Scrapy tự giãn nhịp theo độ trễ phản hồi. Xem cách gắn proxy ở trang cài proxy cho Scrapy. - Python requests: sau mỗi request trên một IP, chờ
time.sleep(base + random.uniform(0, jitter)). Độ trễ ngẫu nhiên tránh nhịp đều như máy. - Token bucket: mỗi IP có một xô chứa tối đa N lượt, nạp lại một lượt sau mỗi khoảng cố định; request chỉ được gửi khi xô còn lượt. Cách này cho phép bùng ngắn nhưng giữ tốc độ trung bình ổn định.
- Giới hạn đồng thời: dùng
asyncio.Semaphorehoặc hàng đợi proxy rảnh để mỗi IP chỉ xử lý một request tại một thời điểm. - Tách theo domain: nếu cào nhiều website, mỗi domain cần bộ đếm riêng; website nhỏ chịu tải kém hơn nhiều so với sàn lớn.
Backoff: lùi lại khi bị từ chối
Khi nhận 429, 503 hoặc trang thử thách, đừng thử lại ngay. Backoff theo cấp số nhân nghĩa là lần thử lại thứ nhất chờ một khoảng, lần thứ hai gấp đôi, lần thứ ba gấp bốn, kèm một phần ngẫu nhiên để các luồng không cùng thử lại một lúc. Nếu có Retry-After, ưu tiên giá trị đó. Sau vài lần thất bại liên tiếp trên một IP, cho IP đó nghỉ hẳn một thời gian và giảm tốc độ chung của cả job.
Một lỗi phổ biến là chỉ chuyển request bị 429 sang IP khác mà không giảm nhịp. Kết quả là cả nhóm IP lần lượt chạm ngưỡng. Chi tiết về mã lỗi này và cách đọc nó nằm trong bài lỗi 429 Too Many Requests.
Tính số IP bạn cần
Không có con số chung cho mọi website, nên bạn phải tự đo. Chạy thử với một IP ở nhịp chậm, tăng dần cho đến khi bắt đầu thấy 429 hoặc CAPTCHA, rồi lấy khoảng một nửa mức đó làm nhịp an toàn cho mỗi IP. Sau đó áp dụng phép tính đơn giản: số IP cần bằng tổng số request mỗi giờ chia cho số request an toàn của một IP mỗi giờ, làm tròn lên và cộng thêm vài IP dự phòng.
Ví dụ giả định: bạn cần tải 6.000 trang trong 5 giờ, tức 1.200 trang mỗi giờ. Nếu đo được một IP chạy ổn ở khoảng 200 trang mỗi giờ, bạn cần 6 IP, cộng thêm 1 đến 2 IP dự phòng cho lúc có IP phải nghỉ. Nếu kết quả ra quá nhiều IP, hãy xem lại phạm vi: có thật cần tải lại mọi trang mỗi lần không. Bài cần bao nhiêu proxy có thêm cách ước lượng cho các việc khác ngoài cào dữ liệu.
Giảm số request trước khi tăng số IP
- Dùng API chính thức hoặc sitemap nếu website có, thay vì duyệt từng trang danh mục.
- Lưu cache và gửi
If-Modified-SincehoặcETagđể chỉ tải lại trang đã thay đổi. - Chỉ cào trường dữ liệu bạn cần; đừng tải ảnh, CSS, font khi chỉ cần HTML.
- Lên lịch chạy vào giờ thấp điểm của website đích.
- Gộp các job trùng nhau để không cào cùng một URL nhiều lần trong ngày.
Proxy phù hợp cho cào dữ liệu có kiểm soát
Với cào dữ liệu công khai, proxy IPv4 datacenter dùng riêng thường là lựa chọn hợp lý: nhanh, không giới hạn băng thông, mỗi IP chỉ một mình bạn dùng nên không bị người khác làm bẩn. Chọn quốc gia của IP theo nội dung bạn cần xem, vì nhiều website trả giá, tồn kho hay kết quả khác nhau theo vị trí. Xem thêm proxy cho cào dữ liệu và kịch bản cào dữ liệu thực tế để chọn cấu hình.
Proxy không phải giấy phép để cào bất cứ thứ gì. Hãy tôn trọng điều khoản website, không thu thập dữ liệu cá nhân trái phép và không gây quá tải cho máy chủ người khác.
Câu hỏi thường gặp
Website có thể chặn dù tôi đã dùng nhiều IP không?
Có. Nếu website đếm theo phiên, tài khoản, vân tay trình duyệt hoặc cả dải IP, thêm IP không đủ. Bạn cần giảm nhịp, sửa header và hành vi, hoặc dùng API chính thức.
robots.txt có bắt buộc phải tuân theo không?
robots.txt là quy ước, không phải rào chắn kỹ thuật, nhưng nó thể hiện ý muốn của chủ website và thường đi cùng điều khoản sử dụng. Tuân theo nó là cách cào có trách nhiệm và giảm rủi ro pháp lý.
Nên đặt độ trễ bao nhiêu giây giữa hai request?
Không có con số chung. Bắt đầu chậm, theo dõi tỷ lệ lỗi và thời gian phản hồi, rồi tăng dần. Nếu robots.txt có Crawl-delay, dùng nó làm mức tối thiểu.
Proxy ISP có giúp cào nhanh hơn không?
Thường không cần. Tốc độ cho phép phụ thuộc nhịp request, không phải loại IP. Proxy ISP chỉ đáng cân nhắc khi website đích chặn riêng dải datacenter.
Băng thông có bị giới hạn khi cào nhiều không?
Proxy IPv4 và ISP của VinaProxy không giới hạn băng thông. Giới hạn bạn cần lo là ngưỡng request của website đích.
Chia tải cào dữ liệu cho nhiều IP riêng
Proxy IPv4 datacenter riêng ở 7 nước, không giới hạn băng thông, IP cố định suốt thời gian thuê, kích hoạt tự động sau khi thanh toán.
Xem bảng giá