Google là mục tiêu phổ thông khó scrape nhất, và lý do rất đơn giản: nó thấy nhiều lưu lượng hơn bất kỳ ai, nên nó có mô hình phong phú nhất về việc một người tìm kiếm thật trông như thế nào. Đụng vào nó từ một IP datacenter ở bất kỳ mức lưu lượng nào và bạn nhận một 429, một trang "sorry/index", hoặc một soft block nơi kết quả lặng lẽ thưa dần. Bài viết này bàn về điều gì thực sự kích hoạt các chặn của Google và chiến lược proxy cùng giới hạn tốc độ giúp một SERP scraper sống sót trong năm 2026.
Google không dựa vào một tín hiệu duy nhất — nó chồng nhiều tín hiệu và cấm khi điểm tổng hợp vượt qua một vạch:
Với hầu hết mục tiêu, bạn có thể xoay xở với IP datacenter trên dữ liệu công khai. Google là ngoại lệ: việc chấm điểm uy tín ASN của nó đủ hung hãn để proxy datacenter bị bóp gần như ngay lập tức. Các exit residential — ASN người tiêu dùng thật — mới là thứ cho phép một SERP scraper duy trì lưu lượng. Để dành datacenter cho mọi thứ khác và tiêu ngân sách residential ở nơi nó thực sự tạo ra khác biệt.
Xoay vòng dàn trải tải để không một IP đơn lẻ nào trông giống bot, nhưng kỷ luật giữ bạn sống sót là tốc độ mỗi exit, không chỉ là kích cỡ pool. Một nghìn proxy vẫn bị cấm nếu bạn bắn tất cả chúng hết cỡ. Hãy đặt nhịp cho mỗi exit như một con người:
import time, random, itertools
from curl_cffi import requests # browser TLS fingerprint, see notes below
PROXIES = [
"socks5h://USERNAME:[email protected]:913",
"socks5h://USERNAME:[email protected]:913",
]
pool = itertools.cycle(PROXIES)
def serp(query, page=0):
proxy = next(pool)
params = {"q": query, "start": page * 10, "hl": "en"}
r = requests.get("https://www.google.com/search", params=params,
impersonate="chrome",
proxies={"http": proxy, "https": proxy}, timeout=30)
if r.status_code == 429 or "/sorry/" in r.url:
raise RuntimeError("rate-limited - back off and rotate")
return r.text
for q in queries:
html = serp(q)
parse(html)
time.sleep(random.uniform(2.0, 5.0)) # human-paced gap between queries
Độ trễ ngẫu nhiên hóa đang làm việc thực sự: một sleep(3) cố định tự nó là một fingerprint. Hãy biến đổi nó, và dàn trải truy vấn qua các exit để mỗi exit ở dưới ngưỡng mỗi IP của Google.
Kết quả bản địa hóa (thứ hạng, ngôn ngữ, tiền tệ) phụ thuộc vào vị trí của exit, vì vậy hãy chọn proxy ở khu vực địa lý bạn muốn đo và giữ một sticky session cho một truy vấn nhiều trang để tất cả các trang của một lần tìm kiếm đến từ cùng một nơi. Trộn lẫn exit giữa chừng một truy vấn cho bạn kết quả chắp vá từ các locale khác nhau — vô dụng cho việc theo dõi thứ hạng.
Google cũng đọc TLS handshake của bạn. Một lệnh gọi requests thuần gửi đi một JA3 hét lên Python, điều này làm trầm trọng thêm điểm IP. Hãy gửi một fingerprint trình duyệt thật bằng curl_cffi (dùng ở trên) hoặc một trình duyệt thật — xem Né TLS Fingerprinting với curl_cffi. Nếu Google bắt đầu đặt cổng bằng một bức tường đồng ý JS, hãy nâng cấp lên một engine trình duyệt thật như được nêu trong hướng dẫn Turnstile — cùng logic "cần một JS runtime" được áp dụng.
/sorry/ — ngừng đụng exit đó, xoay vòng, và lùi lại theo cấp số nhân. Đập liên tục một IP bị gắn cờ làm kéo dài lệnh cấm./sorry/ thay vì thử lại để rồi bị cấm lâu hơn.Người dùng mới nhận 500MB khi đăng ký, cùng tiền thưởng cho lần nạp đầu tiên. Ưu đãi có thời hạn.