最近在做一个出海项目,需要监控产品在不同国家的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、de
  • hl:语言代码,比如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个国家,每天查一次。

200+ 国家和地区一键切换:全球化产品如何做多语言搜索数据采集

计算:50 × 5 × 30 = 7,500次/月

SerpBase的Starter Boost是$3/10,000次,够我用一个多月。常规价格$0.50/1,000次,一个月大概$3.75。

作为对比,之前用另一家SERP API,同样的量要$150/月。


七、总结

做全球化产品,多语言搜索数据是刚需。传统方案(自建爬虫+代理池)维护成本太高,用搜索API是更务实的选择。

SerpBase的地理定位功能基本满足我的需求:200+国家语言组合,结构化JSON返回,按量付费,价格也在可接受范围内。

如果你也在做出海产品,需要监控多国搜索排名,可以参考上面的代码。有其他问题欢迎评论区交流。