如何大规模追踪 Google 排名,而无需自行构建爬虫

了解如何使用 SERP API 大规模追踪 Google 排名,采集关键词位置、目标域名、地区、设备和历史排名快照,而不需要维护自己的爬虫。

talor ai
最後更新於
3 分鐘閱讀

追踪一个 Google 排名很简单。

打开浏览器,输入关键词,找到自己的页面,记下位置。完成。

但如果要每天追踪 5,000 个关键词,还要区分国家、城市、语言和设备,事情就完全不是一个量级了。这时候,自建爬虫很容易从“聪明方案”变成一个每天都要喂的数据小怪兽。

对 SEO 团队来说,排名追踪不只是看“今天排第几”。

更有价值的是趋势:

哪些关键词上升或下降?
哪些页面掉了?
哪些竞品出现了?
Mobile 排名是否变了?
不同城市或语言的结果是否不同?

要稳定回答这些问题,你需要可重复的 SERP 数据。SERP API 可以提供结构化搜索结果,让你不必自己维护浏览器自动化、代理路由、CAPTCHA 处理和解析逻辑。

快速回答

要大规模追踪 Google 排名,可以使用 SERP API 针对每个关键词、市场、语言和设备获取 Google 结果。然后提取自然搜索结果,匹配目标域名,保存排名位置,并比较每日快照。

实际流程通常是:

关键词列表
→ SERP API 请求
→ 提取自然搜索结果
→ 匹配目标域名
→ 保存排名快照
→ 比较历史变化

为什么不建自己的 Google 爬虫?

你当然可以自建爬虫。很多团队都试过。

第一版通常能跑。然后问题开始慢慢出现:

问题

影响

HTML 变化

搜索页版面变了,解析器就坏

地区差异

国家、城市、语言和设备会影响结果

封锁和 CAPTCHA

自动化流程不稳定

SERP features

广告、Maps、Shopping、Images、PAA 让解析更复杂

扩展成本

关键词越多,重试、队列、存储和监控越多

数据一致性

历史对比需要稳定字段

一次性实验可以用爬虫。
长期排名追踪,最后会变成基础设施工作。

大多数 SEO 团队真正需要的是排名数据,不是爬虫工程。

排名追踪应该采集哪些数据?

一个可用的排名追踪器,不应该只保存关键词和排名。

字段

为什么重要

keyword

被追踪的查询

target_domain

要监控的网站

position

自然搜索排名

matched_url

实际排名页面

title

Google 显示的结果标题

snippet

可见摘要

country

市场上下文

language

搜索语言

location

城市或地区

device

Desktop 或 mobile

collected_at

用于历史比较的时间戳

没有国家、语言、设备和时间戳,排名数据就会失去上下文。

美国 desktop SERP 的第 3 名,不等于 London mobile SERP 的第 3 名。

Step 1:准备关键词和市场

先从一组小数据开始。

KEYWORDS = [
    "best project management software",
    "crm software for small business",
    "email marketing tools",
]

MARKETS = [
    {
        "country": "us",
        "language": "en",
        "location": "United States",
        "device": "desktop",
    },
    {
        "country": "gb",
        "language": "en",
        "location": "London, England, United Kingdom",
        "device": "mobile",
    },
]

TARGET_DOMAIN = "example.com"

正式使用时,关键词通常来自 SEO 数据库、Google Search Console 导出、内容计划或竞品监控清单。

Step 2:发送 Google SERP API 请求

把请求层和解析逻辑分开。

import os
import requests


SERP_API_KEY = os.getenv("TALORDATA_API_KEY")
SERP_ENDPOINT = os.getenv("TALORDATA_SERP_ENDPOINT")


def call_serp_api(payload):
    if not SERP_API_KEY:
        raise RuntimeError("Missing TALORDATA_API_KEY")

    headers = {
        "Authorization": f"Bearer {SERP_API_KEY}",
        "Content-Type": "application/json",
    }

    response = requests.post(
        SERP_ENDPOINT,
        json=payload,
        headers=headers,
        timeout=30,
    )

    response.raise_for_status()
    return response.json()


def fetch_google_results(keyword, market):
    payload = {
        "engine": "google",
        "q": keyword,
        "gl": market["country"],
        "hl": market["language"],
        "location": market["location"],
        "device": market["device"],
        "num": 10,
        "output": "json",
    }

    return call_serp_api(payload)

SERP API 的价值在于,每次请求都能带上搜索上下文:关键词、国家、语言、地区和设备。

Step 3:提取自然搜索结果

不同 API 的字段名称可能略有差异,所以解析器要保持弹性。

from urllib.parse import urlparse


def clean_text(value):
    if not value:
        return ""
    return " ".join(str(value).split())


def get_domain(url):
    if not url:
        return ""

    parsed = urlparse(url)
    return parsed.netloc.replace("www.", "")


def get_organic_results(serp_json):
    return (
        serp_json.get("organic_results")
        or serp_json.get("organic")
        or serp_json.get("results")
        or []
    )


def normalize_organic_results(serp_json):
    rows = []

    for index, item in enumerate(get_organic_results(serp_json), start=1):
        url = item.get("link") or item.get("url") or ""

        rows.append({
            "position": item.get("position") or item.get("rank") or index,
            "title": clean_text(item.get("title")),
            "url": url,
            "domain": get_domain(url),
            "snippet": clean_text(item.get("snippet") or item.get("description")),
        })

    return rows

这样就能得到一组干净的自然搜索结果,后续可以和目标域名匹配。

Step 4:匹配目标域名

排名追踪通常就是在回答一个问题:

我的域名有没有出现在这个 SERP 里?排第几?

def find_target_ranking(results, target_domain):
    target = target_domain.replace("www.", "").lower()

    for item in results:
        domain = item["domain"].lower()

        if domain == target or domain.endswith("." + target):
            return {
                "position": item["position"],
                "matched_url": item["url"],
                "title": item["title"],
                "snippet": item["snippet"],
            }

    return {
        "position": None,
        "matched_url": "",
        "title": "",
        "snippet": "",
    }

如果没有找到目标域名,保留 None。不要随便塞一个 99,除非你的报表系统明确定义了这个规则。

Step 5:保存排名快照

第一版用 CSV 就够。

import csv
from datetime import datetime, timezone


CSV_COLUMNS = [
    "keyword",
    "target_domain",
    "country",
    "language",
    "location",
    "device",
    "position",
    "matched_url",
    "title",
    "snippet",
    "collected_at",
]


def export_rankings(rows, filename="google_rankings.csv"):
    with open(filename, mode="w", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=CSV_COLUMNS)
        writer.writeheader()
        writer.writerows(rows)

然后执行追踪流程:

def run_tracking():
    collected_at = datetime.now(timezone.utc).isoformat()
    output_rows = []

    for keyword in KEYWORDS:
        for market in MARKETS:
            serp_json = fetch_google_results(keyword, market)
            organic_results = normalize_organic_results(serp_json)
            ranking = find_target_ranking(organic_results, TARGET_DOMAIN)

            output_rows.append({
                "keyword": keyword,
                "target_domain": TARGET_DOMAIN,
                "country": market["country"],
                "language": market["language"],
                "location": market["location"],
                "device": market["device"],
                "position": ranking["position"],
                "matched_url": ranking["matched_url"],
                "title": ranking["title"],
                "snippet": ranking["snippet"],
                "collected_at": collected_at,
            })

    export_rankings(output_rows)


if __name__ == "__main__":
    run_tracking()

这会输出一份排名快照。

每天跑一次,就有了排名历史。

什么时候 CSV 不够用?

CSV 适合测试。
一旦你每天追踪排名,就应该改用数据库。

一张基础表可以这样设计:

字段

类型

id

UUID 或 integer

keyword

Text

target_domain

Text

position

Integer 或 null

matched_url

Text

country

Text

language

Text

location

Text

device

Text

collected_at

Timestamp

后续可以做:

  • 排名趋势图

  • 关键词变动提醒

  • 页面掉排名报告

  • 竞品可见度报告

  • 本地 SEO 看板

  • 每周 SEO 摘要

扩展检查清单

当追踪规模变大,真正难的就不是几段代码,而是运维。

可以用这份清单检查:

项目

建议

排程

按日、按周或按小时执行

队列

把大量关键词拆成任务

重试

对失败请求做 backoff retry

去重

避免重复追踪同一组 keyword + market

存储

保存每次快照,不只保存最新结果

监控

追踪 API 错误、空结果、异常下跌

成本控制

不要过度频繁追踪稳定关键词

报告

区分排名变化和 SERP feature 变化

规模一大,rank tracking 就是数据管线。
让它保持简单,才会稳。

Best practices

固定追踪同一组关键词。
如果每天换关键词,趋势就很难判断。

每一行都保存 location、language、country、device 和 timestamp。
没有上下文的排名,只是一个飘在空中的数字。

自然搜索、广告、Local Pack、Shopping、Maps 要分开。
它们回答的是不同问题。

开发阶段保留原始响应。
这有助于排查字段缺失和解析问题。

不要每小时追踪所有关键词,除非真的有业务需要。
数据多,不等于数据更有价值。

查看排名下跌时,要看上下文。
可能是新竞品出现,也可能是 SERP feature 变化、地区差异,或者你的页面确实失去相关性。

FAQ

什么是 Google 排名追踪?

Google 排名追踪是指持续监控某个网站在特定关键词搜索结果中的排名位置。好的排名追踪还会保存市场、语言、设备、URL 和时间戳。

不自建爬虫也能追踪 Google 排名吗?

可以。SERP API 可以返回结构化 Google 搜索结果,你可以直接提取 position、URL、title、snippet 和 domain,而不需要维护自己的爬虫。

为什么 SERP API 比自建爬虫更适合排名追踪?

自建爬虫需要长期处理解析、封锁、地区、重试和版面变化。SERP API 能提供更干净的数据层,更适合长期排名追踪。

多久追踪一次排名比较合适?

活跃 SEO 项目通常可以每日追踪。变化较慢的网站,每周追踪也可以。高频追踪应留给重要关键词、产品发布或波动市场。

Desktop 和 mobile 要分开追踪吗?

要。Desktop 和 mobile 结果可能不同。应把 device 作为独立字段保存,避免报表混在一起。

可以追踪本地排名吗?

可以。加入 city 或 region 等 location 字段,并在每次排名快照中保存。本地 SEO 不应只看国家级搜索结果。

立即開展您的數據業務

加入全球最強大的代理網絡

免費試用