SEO

Giám sát SEO Theo Vùng với Xoay vòng Proxy

3 min read Published Updated 591 words

Google phục vụ các kết quả tìm kiếm tự nhiên khác nhau cho cùng một truy vấn tùy thuộc vào nguồn gốc địa lý của yêu cầu — ngay cả khi tính năng cá nhân hóa bị tắt. Một truy vấn tìm "best coffee beans" từ IP trung tâm dữ liệu ở New York trả về SERP khác so với cùng truy vấn từ IP dân cư ở Berlin. Sự khác biệt không chỉ mang tính hình thức. Nó được thiết lập bởi các thuật toán xếp hạng theo khu vực của Google, việc bản địa hóa nội dung và sự tương tác giữa các tham số gl (quốc gia), hl (ngôn ngữ) và cr (giới hạn quốc gia). Việc chạy giám sát SEO theo vùng địa lý mà không hiểu các cơ chế này chắc chắn sẽ dẫn đến dữ liệu sai lệch. Bài viết này giải thích lý do SERP khác nhau giữa các khu vực, cách luân chuyển proxy giảm thiểu phát hiện và quy trình vận hành để theo dõi thứ hạng trên 30+ thị trường.

Tại sao SERP khác nhau giữa các khu vực — ccTLD, gl, hl và Cá nhân hóa

Google xác định SERP "địa phương" thông qua sự kết hợp của các tín hiệu. Đơn giản nhất là TLD của miền tìm kiếm — google.de so với google.co.jp. Nhưng chỉ sử dụng ccTLD là không đủ. Google cũng đọc tham số gl để ghi đè quốc gia được giả định. Ví dụ: google.com?gl=DE buộc hiển thị kết quả tiếng Đức ngay cả trên miền toàn cầu. Tham số hl đặt ngôn ngữ giao diện, ảnh hưởng đến ngôn ngữ kết quả nhưng không ảnh hưởng đến trọng số địa lý. Một yêu cầu với hl=en&gl=JP trả về kết quả tiếng Nhật bằng tiếng Anh — một nguồn gây nhầm lẫn phổ biến.

Ngoài các tham số, Google áp dụng định vị địa lý dựa trên IP. Nếu bạn gửi yêu cầu từ IP Mỹ đến google.de, Google vẫn có thể phục vụ hỗn hợp kết quả tiếng Anh và tiếng Đức vì nó phát hiện nguồn gốc IP. Đây là vấn đề cốt lõi đối với giám sát SEO: địa chỉ IP làm lộ vị trí của người dùng. Việc tắt cá nhân hóa qua pws=0 sẽ loại bỏ lịch sử người dùng, nhưng không tắt suy luận vị trí. Cách duy nhất đáng tin cậy để mô phỏng người dùng địa phương là định tuyến lưu lượng qua một IP thuộc về thị trường mục tiêu — lý tưởng nhất là IP dân cư.

IP dân cư so với IP trung tâm dữ liệu — Phát hiện và Tránh Captcha

Google chủ động phân loại các dải IP. IP trung tâm dữ liệu — AWS, GCP, DigitalOcean — bị gắn cờ là không phải con người trong vòng vài giây. Các thử nghiệm nội bộ của chúng tôi cho thấy tỷ lệ thất bại 60–80% đối với IP trung tâm dữ liệu khi truy vấn Google với các tham số gl; nhiều yêu cầu trả về captcha hoặc SERP bị cắt bớt. Mặt khác, IP dân cư hòa nhập với lưu lượng thông thường. Nhưng các pool proxy dân cư có vấn đề riêng: độ trễ cao, băng thông hạn chế và độ chính xác định vị địa lý thay đổi. Một IP "dân cư" từ nhà cung cấp proxy thực tế có thể là NAT của nhà mạng di động mà Google ánh xạ đến một khu vực khác.

Tránh captcha không phải là "ẩn" — mà là bắt chước một trình duyệt thực. Gửi User-Agent chính xác, Accept-Language khớp với hl và một Cookie jar mới cho mỗi phiên. Hệ thống phát hiện bot của Google cũng xem xét thời gian yêu cầu. Một loạt 100 truy vấn trong 2 giây từ cùng một IP sẽ kích hoạt captcha. Giới hạn 1–2 yêu cầu mỗi phút cho mỗi IP. Sử dụng pool ít nhất 50 IP cho mỗi thị trường để duy trì thông lượng. Sự đánh đổi: độ trễ và chi phí cao hơn so với tỷ lệ captcha thấp hơn. Chúng tôi chấp nhận tỷ lệ captcha 5–10% là bình thường và thử lại với một IP khác.

Quy trình theo dõi thứ hạng trên 30+ quốc gia

Mô hình vận hành khá đơn giản: một IP cho mỗi thị trường, một phiên mới cho mỗi truy vấn. Không tái sử dụng cookie giữa các thị trường. Đoạn shell sau đây hiển thị một probe curl tối thiểu cho SERP tiếng Đức sử dụng proxy dân cư:

#!/bin/bash
# Query Google for "SEO tools" with German gl and English hl, via a residential proxy
PROXY="http://user:pass@residential-proxy-pool:8080"
curl -s --proxy "$PROXY" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
  -H "Accept-Language: en-US,en;q=0.9,de;q=0.8" \
  -H "Cookie: NID=...; CONSENT=..." \
  "https://www.google.com/search?q=SEO+tools&gl=DE&hl=en&pws=0&num=10" \
  | grep -oP '(?<=&url=)[^&]+' | head -10

Lệnh này lấy 10 URL tự nhiên hàng đầu. Đối với hệ thống sản xuất, hãy thay thế proxy tĩnh bằng một endpoint luân chuyển trả về IP mới cho mỗi yêu cầu. Các công cụ như proxy-chain hoặc script Python tùy chỉnh sử dụng requests với một session cho mỗi IP hoạt động tốt. Lưu trữ danh sách proxy của mỗi thị trường trong một tệp riêng và luân chuyển chúng theo chu kỳ.

Đối với hơn 30 quốc gia, bạn cần hơn 30 pool proxy — mỗi pool phải chứa ít nhất 20–50 IP để tránh giới hạn tốc độ. Một pool duy nhất gồm các IP toàn cầu là không đủ vì định vị địa lý của Google sẽ định tuyến sai. Chúng tôi sử dụng tệp cấu hình ánh xạ mã quốc gia đến các endpoint proxy:

{
  "DE": "http://user:pass@de-residential.zone:8080",
  "JP": "http://user:pass@jp-residential.zone:8080",
  "BR": "http://user:pass@br-residential.zone:8080"
}

Mỗi truy vấn thị trường chạy trong một luồng riêng hoặc tác vụ bất đồng bộ, với thời gian chờ 60 giây cho mỗi IP sau mỗi 10 yêu cầu. Nhịp độ này giữ tỷ lệ captcha dưới 3% ở hầu hết các thị trường. Phần khó không phải là mã — mà là tìm nguồn proxy dân cư đáng tin cậy với định vị địa lý đã được xác minh. Nhiều nhà cung cấp tuyên bố "DE" nhưng lại định tuyến qua các trung tâm dữ liệu Frankfurt. Xác thực bằng cách kiểm tra ASN của IP và so sánh với suy luận vị trí của Google (ví dụ: sử dụng header X-Robots-Tag hoặc một kết quả địa phương đã biết).

Sự đánh đổi: Tính mới so với Chi phí

Chạy 30 thị trường mỗi giờ với proxy dân cư tốn khoảng $200–$500 mỗi tháng chỉ riêng phí proxy, tùy thuộc vào nhà cung cấp và khối lượng dữ liệu. Bạn có thể giảm chi phí bằng cách sử dụng IP trung tâm dữ liệu cho các thị trường nơi Google ít tích cực hơn — thường là các quốc gia nhỏ hơn. Nhưng dữ liệu sẽ nhiễu hơn. Giải pháp thay thế là chấp nhận chu kỳ làm mới 24 giờ và xử lý hàng loạt các truy vấn vào ban đêm, khi tỷ lệ captcha giảm. Không có bữa trưa miễn phí. Nếu bạn cần theo dõi thứ hạng hàng ngày trên 30 quốc gia, hãy dự trù ngân sách cho proxy dân cư và cơ chế thử lại mạnh mẽ. Bất cứ thứ gì ít hơn đều tạo ra kết quả trông có vẻ chính xác nhưng về cơ bản là sai — và điều đó còn tệ hơn là không có dữ liệu nào cả.