最近在做一个出海项目,需要监控产品在不同国家的Google搜索排名。一开始以为很简单,写个爬虫就完了。实际做下来才发现,"多语言"和"多地区"是两个完全不同的坑。
相关服务:日本CN2服务器租用
这篇帖子把我的解决方案放出来,给有同样需求的开发者参考。
一、为什么需要多语言搜索数据
做全球化产品的同学应该都有这个痛点:同一个关键词,在美国搜和在日本搜,结果完全不同。
比如你做了一个SaaS产品,定价页叫"Pricing"。你在美国搜"best project management tool",你的产品可能排第5。但你换成日本市场,搜"プロジェクト管理ツール おすすめ",你的产品可能根本不在前100。
这不是翻译的问题,是搜索意图和本地竞争环境完全不同。
如果你只监控英文市场的排名,你对全球市场的认知就是盲人摸象。
二、传统方案的坑
我一开始的方案是:写一个Python脚本,用requests直接请求Google,然后解析HTML提取排名。
很快发现三个问题:
第一,Google会根据你的IP返回对应国家的结果。 我的服务器在美国,搜"best vpn"返回的是美国的结果,不是日本的。要拿日本的结果,要么用日本的代理,要么用Google的gl参数。
第二,语言也是个变量。 Google的hl参数控制返回结果的语言。同一个query,hl=en和hl=ja返回的snippet完全不同,排名也可能不同。
第三,反爬。 Google的反爬机制是全球最狠的,连续请求几十次就会被封IP。自己搭代理池维护成本太高。
折腾了两周,我放弃了自建方案,改用搜索API。
三、解决方案:SerpBase的地理定位API
最后选了SerpBase,原因很简单:便宜,而且支持200+国家和语言组合。
核心是两个参数:
gl:国家代码,比如us、gb、jp、dehl:语言代码,比如en、ja、de、fr
POST一个JSON,就能拿到对应国家和语言的搜索结果。不用搭代理,不用管反爬。
四、实战代码
4.1 基础请求
import requests
import os
API_KEY = os.getenv("SERPBASE_API_KEY")
URL = "https://api.serpbase.dev/google/search"
def search_google(query, gl="us", hl="en"):
payload = {
"q": query,
"gl": gl,
"hl": hl,
"page": 1
}
headers = {
"Content-Type": "application/json",
"X-API-Key": API_KEY
}
resp = requests.post(URL, json=payload, headers=headers, timeout=15)
data = resp.json()
if data.get("status") != 0:
print(f"Error: status={data.get('status')}")
return None
return data
几个注意事项:
- SerpBase的搜索接口是POST,不是GET
- 认证用
X-API-Key头部 - 返回的JSON里
status为0才是成功,其他状态码含义不同(1020是余额不足,1029是限流) - 有机结果的字段名是
rank和link,不是position和url
4.2 批量多国家查询
def search_multiple_countries(query, countries):
"""
对同一个query,查询多个国家的搜索结果
"""
results = {}
for country_code in countries:
data = search_google(query, gl=country_code, hl=country_code)
if data and data.get("organic"):
top_result = data["organic"][0]
results[country_code] = {
"rank_1_title": top_result.get("title"),
"rank_1_link": top_result.get("link"),
"total_results": len(data["organic"])
}
else:
results[country_code] = None
return results
# 示例:查询同一个关键词在5个国家的排名
countries = ["us", "gb", "jp", "de", "br"]
query = "project management tool"
results = search_multiple_countries(query, countries)
for country, data in results.items():
if data:
print(f"[{country.upper()}] Top 1: {data['rank_1_title']}")
else:
print(f"[{country.upper()}] No results")
4.3 监控自己产品在多国的排名
def check_rank(query, target_domain, gl="us", hl="en"):
"""
查询目标域名在指定国家的排名
"""
data = search_google(query, gl=gl, hl=hl)
if not data or not data.get("organic"):
return 0
for item in data["organic"]:
if target_domain in item.get("link", ""):
return item.get("rank", 0)
return 0 # 不在前100
# 示例:监控我的产品在不同国家的排名
target = "myproduct.com"
query = "best project management tool"
countries = {
"us": "en",
"gb": "en",
"jp": "ja",
"de": "de",
"fr": "fr"
}
for gl, hl in countries.items():
rank = check_rank(query, target, gl=gl, hl=hl)
print(f"[{gl.upper()}] Rank: {rank if rank > 0 else 'Not in top 100'}")
五、几个实用技巧
1. 国家代码和语言代码要配对。
gl=jp + hl=ja是正确的,gl=jp + hl=en也是合法的,但返回的结果会混入英文内容。根据你的实际需求选择。
2. 注意时区和本地化因素。
同一个query,在不同时间搜索结果可能不同。Google会考虑用户的本地时间、节日等因素。如果你在做竞品监控,建议每天固定时间跑一次。
3. 用page参数翻页。
默认返回第1页(前10条)。如果需要更多结果,用page=2、page=3翻页。但注意每翻一页消耗一个credit。
4. 保存原始数据。
每次查询的结果建议存到数据库里,方便后续分析。排名是会波动的,单次查询没有意义,趋势才有价值。
六、成本
我监控了50个关键词,5个国家,每天查一次。

计算:50 × 5 × 30 = 7,500次/月
SerpBase的Starter Boost是$3/10,000次,够我用一个多月。常规价格$0.50/1,000次,一个月大概$3.75。
作为对比,之前用另一家SERP API,同样的量要$150/月。
七、总结
做全球化产品,多语言搜索数据是刚需。传统方案(自建爬虫+代理池)维护成本太高,用搜索API是更务实的选择。
SerpBase的地理定位功能基本满足我的需求:200+国家语言组合,结构化JSON返回,按量付费,价格也在可接受范围内。
如果你也在做出海产品,需要监控多国搜索排名,可以参考上面的代码。有其他问题欢迎评论区交流。