Scrape kết quả tìm kiếm Google bằng proxy (SERP, 2026)

Đăng ngày 12 tháng 6 2026 · ≈9 phút đọc

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.

Điều Gì Kích Hoạt Một Chặn Của Google

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:

Residential Là Bắt Buộc Ở Đây

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, Nhưng Giới Hạn Tốc Độ Mỗi Exit

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.

Sticky Session và Định Vị Địa Lý

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.

Đừng Quên Fingerprint

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.

Xử Lý Việc Bị Chặn Một Cách Khéo Léo

Danh Sách Kiểm Tra

Cho mọi sản phẩm IP · một kho node khổng lồ luôn sẵn sàng bất cứ lúc nào

Đăng ký ngay và nhận tới 100% hoàn tiền cho lần nạp của bạ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.