Cách vượt qua giới hạn tốc độ khi thu thập dữ liệu web

Senior Web Scraping Engineer
Bạn đã bao giờ bắt đầu thu thập dữ liệu từ một trang web, chỉ để phát hiện ra rằng mình bị chặn bởi giới hạn tốc độ? Tôi cũng đã trải qua điều đó. Đó là cảm giác khi cuối cùng bạn đã lấy được dữ liệu chính xác, chỉ để bị dừng lại bởi thông báo "429 Too Many Requests". Nhưng đừng để điều này ngăn cản bạn. Giới hạn tốc độ, mặc dù được thiết kế để kiểm soát lưu lượng truy cập quá mức, nhưng không phải là kết thúc hành trình thu thập dữ liệu của bạn. Bằng cách hiểu giới hạn tốc độ và triển khai các giải pháp sáng tạo, bạn vẫn có thể thu thập dữ liệu cần thiết trong khi vẫn ẩn mình.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu sâu hơn về giới hạn tốc độ là gì, tại sao các trang web sử dụng nó và những cách hiệu quả nhất để bỏ qua nó trong khi thu thập dữ liệu web. Hãy cùng đi qua các bước, sử dụng một số ví dụ về mã và khám phá các phương pháp có thể giúp quá trình thu thập dữ liệu của bạn suôn sẻ hơn.
Giới hạn tốc độ là gì?
Giới hạn tốc độ về cơ bản là một chiến lược được sử dụng bởi các trang web để kiểm soát số lượng yêu cầu mà họ cho phép trong một khoảng thời gian nhất định, thường được áp dụng để duy trì sức khỏe của máy chủ và đảm bảo quyền truy cập công bằng. Các trang web thường giới hạn yêu cầu để ngăn chặn lưu lượng truy cập cao, bảo vệ chống lại việc lạm dụng và bảo vệ tài nguyên cho tất cả người dùng. Ví dụ, một trang web có thể giới hạn yêu cầu lên tới 100 yêu cầu mỗi phút cho mỗi người dùng. Nếu trình thu thập dữ liệu của bạn vượt quá giới hạn này, máy chủ sẽ trả lời với mã trạng thái "429 Too Many Requests", tạm thời chặn quyền truy cập tiếp theo.
Hiểu giới hạn tốc độ giúp xác định cách khắc phục nó. Nhiều trang web dựa vào giới hạn tốc độ để cân bằng quyền truy cập của người dùng và tải của máy chủ. Đối với các trang web nâng cao hơn, giới hạn tốc độ được kết hợp với CAPTCHA hoặc hạn chế IP, làm phức tạp thêm quy trình cho trình thu thập dữ liệu.
Tại sao API và trang web sử dụng giới hạn tốc độ
Các trang web và API triển khai giới hạn tốc độ vì một số lý do, một số trong số đó có thể ảnh hưởng đến mục tiêu thu thập dữ liệu của bạn. Biết những động cơ này có thể giúp bạn tiếp cận cách bỏ qua giới hạn tốc độ mà không gây hại hoặc bị chặn hoàn toàn.
Ngăn chặn quá tải máy chủ
Hãy tưởng tượng lưu lượng truy cập trên một trang web phổ biến: hàng nghìn, thậm chí hàng triệu người dùng truy cập tài nguyên cùng lúc. Giới hạn tốc độ ngăn chặn bất kỳ người dùng nào - hoặc bot - độc chiếm tài nguyên của máy chủ, điều này có thể làm chậm hoặc thậm chí khiến trang web sập. Nó cho phép các máy chủ xử lý lưu lượng truy cập một cách hiệu quả bằng cách giới hạn khối lượng yêu cầu. Đối với trình thu thập dữ liệu, điều này có nghĩa là các yêu cầu quá mức có thể kích hoạt giới hạn tốc độ nhanh hơn trong giờ cao điểm.
Giảm thiểu việc lạm dụng
Giới hạn tốc độ cũng đóng vai trò là rào cản chống lại những kẻ gửi thư rác và bot độc hại. Khi trình thu thập dữ liệu hoặc bot gửi nhiều yêu cầu nhanh chóng, giới hạn tốc độ sẽ hoạt động để ngăn chặn việc lạm dụng, duy trì bảo mật và ngăn chặn các cuộc tấn công như từ chối dịch vụ (DoS). Điều này có thể là vấn đề đối với trình thu thập dữ liệu nhằm mục đích thu thập dữ liệu hiệu quả, vì các trang web sử dụng giới hạn tốc độ để điều tiết hoạt động phi người dùng.
Khuyến khích sử dụng trả phí
Đối với API, giới hạn tốc độ thường là một phần của mô hình định giá theo bậc thang. Người dùng miễn phí có thể phải đối mặt với giới hạn tốc độ thấp hơn, trong khi người đăng ký trả phí có quyền truy cập vào giới hạn cao hơn hoặc thậm chí là quyền truy cập API chuyên dụng. Mô hình này thúc đẩy việc nâng cấp bằng cách hạn chế người dùng miễn phí trong khi kiếm tiền từ quyền truy cập dữ liệu khối lượng lớn. Nhiều API công khai như Twitter và Google sử dụng cách tiếp cận này.
Bạn gặp khó khăn với những thách thức trong việc thu thập dữ liệu web và bị chặn liên tục trên dự án bạn đang làm?
Tôi sử dụng Scrapeless để giúp việc trích xuất dữ liệu trở nên dễ dàng và hiệu quả, tất cả trong một công cụ mạnh mẽ.
Hãy thử nó miễn phí ngay hôm nay!
Cách bỏ qua giới hạn tốc độ trong thu thập dữ liệu web
Mặc dù giới hạn tốc độ có thể khiến việc thu thập dữ liệu trở nên khó khăn, nhưng nhiều kỹ thuật khác nhau có thể giúp bạn bỏ qua hoặc giảm thiểu tác động của nó một cách hiệu quả. Hãy cùng khám phá những giải pháp này với các ví dụ về mã và xem cách bạn có thể triển khai chúng để tránh bị chặn.
1. Sử dụng proxy
Sử dụng nhiều proxy để phân phối yêu cầu trên các IP khác nhau là một chiến lược cổ điển để bỏ qua giới hạn tốc độ. Cách tiếp cận này giúp phân tán lưu lượng truy cập trên nhiều nguồn, khiến các trang web khó phát hiện và chặn trình thu thập dữ liệu của bạn hơn.
python
import requests
from itertools import cycle
# Danh sách proxy
proxies = ["http://proxy1.example.com", "http://proxy2.example.com", "http://proxy3.example.com"]
proxy_pool = cycle(proxies)
url = "https://example.com/data"
for i in range(100):
proxy = next(proxy_pool)
response = requests.get(url, proxies={"http": proxy, "https": proxy})
print(response.status_code)
Mã ở trên sử dụng mẫu proxy luân phiên, trong đó mỗi yêu cầu được gửi qua một máy chủ proxy khác nhau. Bằng cách mô phỏng lưu lượng truy cập từ nhiều vị trí, bạn ít có khả năng bị ảnh hưởng bởi giới hạn tốc độ liên kết với một IP duy nhất.
2. Ngẫu nhiên hóa độ trễ
Hành vi của con người thường không đều, vì vậy việc thêm độ trễ ngẫu nhiên giữa các yêu cầu có thể bắt chước người dùng thực, khiến các quy tắc giới hạn tốc độ khó phát hiện ra mẫu của bạn. Độ trễ ngẫu nhiên khiến trình thu thập dữ liệu của bạn ít dự đoán được hơn, điều này có thể giúp nó ẩn mình.
python
import time
import random
import requests
url = "https://example.com/data"
for i in range(100):
response = requests.get(url)
print(response.status_code)
# Độ trễ ngẫu nhiên từ 1 đến 5 giây
time.sleep(random.uniform(1, 5))
Bằng cách sử dụng random.uniform(1, 5)
, bạn đang giới thiệu các khoảng nghỉ tự nhiên giữa các yêu cầu, làm giảm khả năng bị ảnh hưởng bởi giới hạn tốc độ. Cách tiếp cận này hoạt động tốt với các trang web cho phép lưu lượng truy cập vừa phải nhưng áp dụng các giới hạn nghiêm ngặt đối với yêu cầu đột biến.
3. Luân phiên User Agent
Máy chủ web kiểm tra các tiêu đề như User-Agent để xác định khách hàng thực hiện yêu cầu. Bằng cách luân phiên các chuỗi User-Agent, trình thu thập dữ liệu của bạn có thể bắt chước các trình duyệt, thiết bị hoặc hệ điều hành khác nhau, khiến nó có vẻ như các yêu cầu đến từ nhiều người dùng.
python
import requests
import random
url = "https://example.com/data"
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15",
"Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"
]
for i in range(100):
headers = {"User-Agent": random.choice(user_agents)}
response = requests.get(url, headers=headers)
print(response.status_code)
Luân phiên User-Agent tiêu đề khiến các máy chủ khó phát hiện hoạt động thu thập dữ liệu hơn. Đây là một cách hiệu quả để bỏ qua giới hạn tốc độ bằng cách phân phối yêu cầu trên các cấu hình khách hàng khác nhau.
4. Sử dụng Exponential Backoff
Khi làm việc với API, việc triển khai chiến lược Exponential Backoff là một cách phổ biến để thích ứng khi bị ảnh hưởng bởi giới hạn tốc độ. Với Exponential Backoff, bạn nhân đôi độ trễ sau mỗi lần bị giới hạn, giảm dần tốc độ yêu cầu cho đến khi quyền truy cập được khôi phục.
python
import requests
import time
url = "https://api.example.com/data"
retry_delay = 1
for i in range(100):
response = requests.get(url)
if response.status_code == 429: # Bị giới hạn tốc độ
print("Đạt giới hạn tốc độ, đang lùi lại...")
time.sleep(retry_delay)
retry_delay *= 2 # Nhân đôi độ trễ mỗi lần bị giới hạn tốc độ
else:
print(response.status_code)
retry_delay = 1 # Đặt lại độ trễ sau yêu cầu thành công
Kỹ thuật này thường được sử dụng với các API áp dụng giới hạn tốc độ nghiêm ngặt. Bằng cách lùi lại mỗi khi bạn bị giới hạn, bạn có thể tránh bị chặn liên tục trong khi vẫn giữ cho trình thu thập dữ liệu của bạn hoạt động.
5. Quản lý Phiên và Cookie
Khi các trang web áp dụng giới hạn tốc độ dựa trên phiên hoặc cookie, việc sử dụng quản lý phiên trong các yêu cầu có thể giúp mô phỏng các phiên người dùng liên tục. Cách tiếp cận này hoạt động tốt đối với các trang web theo dõi hành vi của người dùng theo thời gian.
python
import requests
url = "https://example.com/data"
session = requests.Session() # Phiên liên tục
for i in range(100):
response = session.get(url)
print(response.status_code)
Sử dụng phiên cho phép các yêu cầu của bạn duy trì cookie giữa các cuộc gọi, điều này có thể bắt chước các mẫu duyệt web của người dùng thực và giảm khả năng bị ảnh hưởng bởi giới hạn tốc độ.
Kết luận
Bỏ qua giới hạn tốc độ là một kỹ năng cần thiết trong việc thu thập dữ liệu web, đặc biệt là khi thu thập dữ liệu hiệu quả và tránh bị phát hiện. Giới hạn tốc độ được đặt ra để bảo vệ tài nguyên của trang web và cung cấp quyền truy cập công bằng cho tất cả người dùng, nhưng với các kỹ thuật phù hợp - như luân phiên proxy, giới thiệu độ trễ ngẫu nhiên, quản lý tiêu đề, triển khai chiến lược Exponential Backoff và sử dụng phiên liên tục - trình thu thập dữ liệu có thể khắc phục những hạn chế này một cách có trách nhiệm. Hãy nhớ rằng, thu thập dữ liệu web hiệu quả bao gồm tôn trọng chính sách của trang web và tìm kiếm các giải pháp bền vững giúp cả trình thu thập dữ liệu và môi trường máy chủ của bạn cân bằng.
Tại Scrapeless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định hiện hành và chính sách bảo mật của trang web. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm pháp lý đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động thu thập dữ liệu nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem lại các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.