
SEO professional cần track ranking từ multiple country - Google SERP localize theo IP gốc của user, ranking #3 từ US có thể là #15 từ VN. Tool SaaS (AccuRanker, SerpFox, Nightwatch) tiện nhưng đắt cho agency lớn ($100-500/mo). Self-host SERP tracker với TND IPv4 dedicated rẻ hơn 5-10x, kiểm soát data, ToS-compliant. Bài này hướng dẫn build SERP tracker Python + Node.js với TND IPv4, handle rate limit, store data, plus alternative SaaS có proxy custom.
Mục lục
1. Vì sao SEO cần proxy multi-country
- Google SERP localize: Cùng keyword "best vps hosting" hiển thị result khác nhau giữa user US, UK, DE, JP, VN. Phải scrape từ IP đúng country.
- Avoid IP rate limit: Google detect "human-like" pattern theo IP. 1 IP scrape nhiều > bị CAPTCHA hoặc temp ban. Rotate IP giảm risk.
- Hide intent: Search history của 1 IP ảnh hưởng personalized result. Fresh IP cho clean SERP.
- Multi-client isolation: Agency track 10 client, mỗi client 1 IP riêng → không mix history.
2. Option 1: SaaS SERP tracker với custom proxy
Nhiều tool SaaS cho phép gắn proxy custom thay vì dùng pool internal:
| Tool | Giá khởi điểm | Custom proxy support | Use case |
|---|---|---|---|
| AccuRanker | $129/mo | Enterprise only | Agency premium |
| SerpFox | $10/mo | Có (Pro+) | Small agency, freelancer |
| Nightwatch | $32/mo | Có | Mid-size agency |
| Whitespark | $25/mo | Limited | Local SEO |
| SerpApi (API service) | $50/mo | Built-in residential pool | Dev integrate |
Nếu chỉ track 5-20 keyword cho 1-2 client, SaaS tier $10-30 + TND IPv4 1-2 IP đủ.
3. Option 2: Self-host SERP scraper Python
Cho agency tracking 100+ keyword, self-host rẻ hơn nhiều.
Python với requests + BeautifulSoup
import requests
from bs4 import BeautifulSoup
import time, random
PROXIES_POOL = [
{'http': 'http://us01_S21130_P60:•••@23.155.xxx.10:2021',
'https': 'http://us01_S21130_P60:•••@23.155.xxx.10:2021'},
{'http': 'http://us02_S21131_P60:•••@23.155.xxx.11:2021',
'https': 'http://us02_S21131_P60:•••@23.155.xxx.11:2021'},
# ... 8 more
]
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
'Accept-Language': 'en-US,en;q=0.9',
}
def search_serp(keyword, country='us', proxy_idx=0):
url = f'https://www.google.{country}/search'
params = {'q': keyword, 'hl': 'en', 'gl': country, 'num': 20}
proxy = PROXIES_POOL[proxy_idx % len(PROXIES_POOL)]
r = requests.get(url, params=params, headers=HEADERS, proxies=proxy, timeout=15)
if r.status_code != 200:
return None
soup = BeautifulSoup(r.text, 'html.parser')
results = []
for i, item in enumerate(soup.select('div.g')[:20]):
title = item.select_one('h3')
link = item.select_one('a[href^="http"]')
if title and link:
results.append({
'position': i + 1,
'title': title.text,
'url': link['href']
})
return results
# Loop track keyword
keywords = ['mua proxy ipv4', 'mua vps tnd', 'antidetect browser']
for i, kw in enumerate(keywords):
serp = search_serp(kw, 'vn', proxy_idx=i)
print(f'\n{kw}:')
for r in serp[:5]:
print(f" #{r['position']}: {r['title']}")
time.sleep(random.uniform(8, 12)) # Polite delay
4. Option 2: Self-host SERP scraper Node.js
import axios from 'axios';
import * as cheerio from 'cheerio';
import { HttpsProxyAgent } from 'https-proxy-agent';
const PROXIES = [
'http://us01_S21130_P60:•••@23.155.xxx.10:2021',
'http://us02_S21131_P60:•••@23.155.xxx.11:2021',
];
async function searchSERP(keyword, country = 'us', proxyIdx = 0) {
const agent = new HttpsProxyAgent(PROXIES[proxyIdx % PROXIES.length]);
const url = `https://www.google.${country}/search`;
const { data } = await axios.get(url, {
params: { q: keyword, hl: 'en', gl: country, num: 20 },
httpsAgent: agent,
headers: {
'User-Agent': 'Mozilla/5.0 ...',
'Accept-Language': 'en-US,en;q=0.9'
},
timeout: 15000
});
const $ = cheerio.load(data);
const results = [];
$('div.g').slice(0, 20).each((i, el) => {
const title = $(el).find('h3').first().text();
const url = $(el).find('a[href^="http"]').first().attr('href');
if (title && url) {
results.push({ position: i + 1, title, url });
}
});
return results;
}
const keywords = ['mua proxy ipv4', 'mua vps tnd', 'antidetect browser'];
for (let i = 0; i < keywords.length; i++) {
const serp = await searchSERP(keywords[i], 'vn', i);
console.log(`\n${keywords[i]}:`);
serp.slice(0, 5).forEach(r => console.log(` #${r.position}: ${r.title}`));
await new Promise(r => setTimeout(r, 8000 + Math.random() * 4000));
}
5. Best practice: rate limit, user-agent, retry
| Practice | Chi tiết |
|---|---|
| Delay 8-12s/request | Tránh trigger CAPTCHA Google. Random hóa để look human. |
| Rotate User-Agent | 5-10 UA phổ biến rotate, không stick 1 UA |
| Rotate IP | Mỗi 50-100 request đổi IP TND khác |
| Handle 429/503 | Backoff exponential (30s, 60s, 120s), không retry ngay |
| Skip CAPTCHA page | Detect /sorry/index URL, đổi IP ngay |
| Don't bulk parallel | Sequential request, không async 50 cùng lúc |
| Cache result | Lưu DB, không re-scrape cùng kw trong 24h |
| Respect robots.txt | Google không cho scrape /search nhưng cho phép qua Google Search API official |
6. Use case: agency 100 keyword 10 client
Setup:
- 10 TND IPv4 dedicated US (1 IP per client): 950k/tháng
- 1 VPS nhỏ chạy scraper cron daily: 199k/tháng (TND Cloud VPS 20)
- Database PostgreSQL store history
- Dashboard Grafana hoặc Metabase show ranking trend
- Tổng infra: ~1.2M VND/tháng cho 10 client × 100 keyword = 1000 SERP/ngày
So với SaaS AccuRanker $129/mo × 10 client / tháng = $1290 = ~32M VND - tiết kiệm 26x.
7. ToS compliance Google SERP scraping
Google ToS không cho phép automated scraping /search endpoint. Tuy nhiên thực tế:
- Scrape small-scale (100-1000 query/day) với delay polite: Google không bother
- Bulk scrape (10k+ query/day) bị block + CAPTCHA persistent
- Vẫn rủi ro nếu Google muốn enforce
Legal alternatives:
- Google Search Console API: Free, official, nhưng chỉ data của site bạn own
- Google Custom Search JSON API: Paid ($5/1000 query), official, data SERP đầy đủ
- SerpApi / DataForSEO: Paid API, họ scrape thay bạn, tuân thủ rate limit
Khuyến nghị: dùng SerpApi/DataForSEO ($50-100/mo) cho production agency, scraper self-host chỉ cho R&D + small client.
Tổng kết
Track SERP multi-country cần proxy IPv4 từ country target. SaaS (SerpFox, Nightwatch) tier $10-32 + 1-2 TND IPv4 đủ cho freelancer. Agency 100+ keyword/client nên self-host hoặc dùng SerpApi. Tuân thủ ToS Google bằng polite scraping (delay 8-12s, rotate UA, không bulk). TND IPv4 dedicated cố định lâu dài + clean reputation phù hợp cho SERP tracking.
Tham khảo thêm:
- Proxy cho Playwright automation
- Proxy cho AI agent
- IPv4 Dedicated vs Residential
- SOCKS5 vs HTTP cho scraper
Mua Proxy IPv4 Dedicated US + VN tại TND
Flat 95.000 VNĐ/IP/tháng. Fresh IP dedicated cho SERP tracking: IP cố định, clean reputation (verify AbuseIPDB <5%), không bị Google flag bulk. Unlimited traffic. Setup 60 giây.
Tham gia nhóm Vibe Coder Việt Nam
Bạn đang code cùng Claude, Codex, Gemini, Cursor hay Windsurf? Vào nhóm Facebook để trao đổi tip, debug giúp nhau, chia sẻ workflow vibe coding, và update tool mới mỗi tuần. Cộng đồng dev tự host stack đang grow nhanh tại Việt Nam.


