← 返回专栏
· 5 分钟阅读

不用付费工具,怎么免费跟踪 SEO 排名?

排名追踪是SEO里最被高估的部分。用Google Search Console、免费API和自建Python追踪器,就能准确监控关键词排名,完全不用每月花99美元买Ahrefs或Semrush。

我花了三个月时间纠结关键词排名。每天早上,我打开排名追踪工具,输入关键词,滑过广告位,数我的页面出现在第几位。第12位。第9位。第7位。然后又回到第11位。再到15位。然后6位。我手动追踪40个关键词,每天吃掉我30分钟。

最糟糕的是什么?我做的方式是错的。

手动查排名本质上就不可靠。Google 会根据位置、搜索历史、设备和其他几十个信号个性化搜索结果。我早上在办公桌前看到的排名,和另一个城市的人看到的排名不一样,甚至和我在无痕模式下看到的都不一样。我一直在根据虚假的数据做决策。

当我终于理解了排名追踪真正的原理——以及你其实有多不需要付费工具——我搭了一套系统,数据比任何 $99/月的追踪工具都好,只用了免费工具加一个 Python 脚本。这篇指南会讲清楚我学到的所有东西。

为什么大多数排名追踪建议是错的

打开任何 SEO 博客,你都会看到同样的建议:“每天追踪排名。用 Ahrefs、Semrush 或 SE Ranking。关注位置变化并相应优化。”

这个建议有三个问题:

问题 1:排名是个性化的。 Google 并不提供一个统一的排名。同样的查询对不同用户返回不同的结果,取决于位置、语言、搜索历史、Google 账号活动和设备。一个从单一数据中心的单一位置检查的排名追踪工具,只是从成千上万种可能的结果集中采样一个。“第7位”这个报告可能是某些用户的第3位,另一些用户的第15位。

问题 2:排名本身就会波动。 我亲眼看过关键词一天之内上下波动5-10个位置,而我这端什么都没改。Google 在持续测试不同的结果排序。如果你对每次波动都做反应,你会把自己逼疯,做一堆根本无效的修改。

问题 3:位置不能预测流量。 我有一个关键词排在第4位,一个月只带来3次点击。另一个关键词排在第11位,带来40次点击。为什么?搜索量、SERP 特性(精选摘要、People Also Ask、本地包)和点击率差异。排名追踪工具告诉你位置。它不告诉你真正重要的东西:流量、参与度和转化。

这不代表排名追踪没用。它意味着你需要追踪正确的东西,正确解读数据,不要为给你虚假精确感的工具多付钱。

排名追踪真正该关注什么

在搭追踪系统之前,让我说清楚什么值得追踪:

看平均位置趋势,不是每日快照。 单日排名是噪音。7天或30天平均位置能抹平波动,显示真正的趋势。你的平均位置在几周内是否在改善?那是信号。一夜掉了3个位置?那是噪音。

看展示和点击,不只是位置。 Google Search Console 给你展示和点击数据,针对你网站排名所涉及的每个关键词。这比原始位置有价值得多,因为它包含了搜索量和 SERP 特性。一个第15位的结果,在高搜索量查询中,上面还有一个精选摘要,可能获得零展示。一个第5位的利基查询结果,可能获得稳定流量。

看页面级表现,不要纠结单个关键词。 与其追踪100个单独的关键词,不如追踪每个页面在其所有关键词上的综合表现。一篇博客文章可能为200个不同的查询排名。一个个追踪不可持续。追踪页面的聚合表现告诉你内容是否有效。

看竞争对手动向,不只是你自己的。 当你的排名下降时,第一个问题应该是”谁抢了我的位置?“而不是”我哪里做错了?“有时候你什么都没做错——竞争对手发布了更好的内容或者拿到了一条强反向链接。上下文很重要。

方法 1:Google Search Console(你唯一需要的排名追踪工具)

Google Search Console 是现有最准确的排名追踪工具,而且是免费的。数据直接来自 Google——不是第三方爬虫从某个随机数据中心抓的。

大多数指南忽略了一点:GSC 不显示你”关键词 X 的排名”。它显示的是你网站在 Google 识别到你的所有关键词上的聚合表现。这实际上比排名追踪更好,因为它反映的是真实用户行为,不是模拟查询。

设置 GSC 用于排名追踪

如果你还没做,先在 Google Search Console 里验证你的网站。我推荐域名验证(DNS TXT 记录),因为它自动覆盖所有子域名和 http/https 两个版本。资源级验证(HTML 文件或 meta 标签)只覆盖特定的协议和子域名。

验证完之后,效果 > 搜索结果报告就是你的排名追踪仪表盘。用法如下:

1. 开启”平均排名”指标。 默认情况下 GSC 显示点击、展示和 CTR。勾选”平均排名”复选框来添加位置数据。现在你会看到每个查询在所选时间段内的平均排名位置。

2. 按页面过滤来追踪特定内容。 点击”添加过滤器 > 页面”,输入一个 URL。现在你会看到该页面排名的所有查询,包括每个查询的位置数据。这是页面级追踪——比关键词级有用得多,因为它展示了页面表现的完整图景。

3. 对比日期范围来看趋势。 点击日期选择器并选择”对比”。我默认用”最近28天 vs 前28天”作为对比。这会显示每个查询的位置是上升还是下降,并给出精确差值。绿色箭头表示改善,红色表示下降。

4. 导出建立历史记录。 GSC 只保留16个月的数据。如果你要做长期追踪,每月导出数据并存起来。我每个月保留一个 CSV,包含列:查询、页面、点击、展示、CTR、位置。一年后,我可以画出 GSC 界面无法展示的趋势图。

Queries 报告:你的关键词情报源

效果报告中的查询标签页列出了所有触发你网站出现在 Google 搜索结果中的搜索查询。这是金矿。我是这样挖掘的:

按位置升序排序,找触手可及的机会。 你排在第4-15位的查询是你最大的机会。你已经在第一页或第二页顶部——一点小小的内容改进或内链提升就能把你推入前三。我维护一个4-15位区间的实时查询列表,每月审视一次。

按展示降序排序,找可见性缺口。 高展示低 CTR 意味着你的页面出现在结果中但用户不点击。这通常意味着标题或 meta 描述太弱,或者 SERP 特性(比如精选摘要或广告)把你的结果挤到首屏以下。我重写任何展示超100且 CTR 低于2%的查询对应的标题和描述。

按点击降序排序,找赚钱关键词。 这些是真正带来流量的查询。加大投入——创建相关内容、构建内链、优化落地页的转化。

关注”新”查询。 当你对比日期范围时,GSC 会显示首次出现的查询。这些是 Google 开始将你的网站与新主题关联起来的早期信号。如果新查询与你的内容相关,考虑为它创建专门内容。

Pages 报告:内容级追踪

在效果报告中从”查询”切到”页面”。这会显示每个页面在所有关键词上的综合表现。我大部分分析时间花在这里。

识别下滑的页面。 按位置差值列排序(在对比模式下)。平均位置下滑的页面需要注意——可能需要内容更新、新的内链或技术修复。

识别上升的页面。 位置改善的页面在起作用。分析原因:你是不是最近更新了内容?是不是获得了新反向链接?是不是加了内链?复制任何有效的做法。

找到有潜力但表现不佳的页面。 高展示低点击的页面有可见性但参与度差。这通常是标题/meta 描述的问题,不是排名问题。改一下标题就能在不改变位置的情况下让 CTR 翻倍。

GSC 的局限(以及如何绕过)

GSC 并不完美。以下是我学会绕过的局限:

数据延迟。 GSC 数据通常延迟2-3天。你能看到的最新数据也是2天前的。要做到实时追踪,你需要手动 SERP 检查或基于 API 的工具(后面会讲)。

采样。 GSC 在界面中每个查询最多显示1,000行。如果你的网站排名涉及数千个查询,界面会截断。用 GSC API 获取完整数据——API 每次请求最多返回50,000行。

没有精确位置追踪。 GSC 显示的是时间段内的平均位置,不是特定时刻的位置。这实际上更有利于趋势分析,但很难知道”我现在是第3位还是第5位?”

聚合,不是按用户。 GSC 数据是所有用户的聚合。你无法看到某个特定位置、特定用户的排名。做本地排名追踪需要其他方法。

16个月数据保留期。 如前所述,如果需要长期历史记录,每月导出。

方法 2:无痕 SERP 检查(用于快速抽查)

有些时候你只是想知道”我在 Google 搜这个的时候我的页面会出现吗?“无痕检查法是最简单的:

  1. 打开一个新的无痕/隐私窗口
  2. 搜索目标关键词
  3. 手动数你的位置

这个方法粗糙但对快速检查很有用。以下方法可以提高准确度:

在 URL 末尾加 &pws=0 来禁用个性化。 搜索后,在 Google 搜索 URL 末尾加上 &pws=0。这告诉 Google 对结果去个性化。并不完美——Google 多年前就移除了这个参数的完整效果——但有帮助。

使用 &num=100 每页看更多结果。&num=100 可以看到100条结果而不是10条。即使你的页面在第5页,也能不用翻页就找到。

在搜索工具中切换位置。 点击”搜索工具 > 所有国家/地区”并设置特定国家,查看本地化结果。要看城市级结果,在 URL 后面加 &near=城市名

两个参数组合。 类似 https://www.google.com/search?q=your+keyword&pws=0&num=100 这样的 URL 给你一个去个性化的前100条结果视图。我给前20个关键词存了模板 URL 书签,每周检查一次。

局限很明显:这是手动的、耗时,而且仍然不是完全去个性化的。但作为快速检查——“我的页面至少在前100名吗?“——它是有效的。

方法 3:免费 SERP API 实现自动化排名检查

想要自动排名追踪但不想付钱给 Ahrefs 或 Semrush?免费 SERP API 是出路。以下是我在用的:

Serper.dev(每月 2,500 次免费搜索)

Serper.dev 通过 API 提供 Google SERP 结果。免费额度每月 2,500 次搜索——足够追踪 80 个关键词每天的排名(80 × 31 天 = 2,480)。

这是我用来查排名的一个简单 Python 脚本:

import requests, json

SERPER_API_KEY = "your_api_key"
keyword = "free seo audit"
target_domain = "zens.ink"

response = requests.post(
    "https://google.serper.dev/search",
    headers={"X-API-KEY": SERPER_API_KEY, "Content-Type": "application/json"},
    json={"q": keyword, "num": 100}
)

results = response.json().get("organic", [])
position = None
for i, result in enumerate(results, 1):
    if target_domain in result.get("link", ""):
        position = i
        url = result["link"]
        title = result["title"]
        break

if position:
    print(f"Position {position}: {title}")
    print(f"URL: {url}")
else:
    print(f"{target_domain} not found in top 100 for '{keyword}'")

这会返回你的排名页面的精确位置、标题和 URL。多跑几个关键词,你就有了一个基础排名追踪器。

Brave Search API(每月 2,000 次免费查询)

Brave Search API 是另一个免费选项。免费额度每月 2,000 次查询。它不是 Google SERP 的克隆——有自己的索引——但作为第二个数据点很有用。

import requests

BRAVE_API_KEY = "your_api_key"
keyword = "free seo audit"
target_domain = "zens.ink"

response = requests.get(
    "https://api.search.brave.com/res/v1/web/search",
    headers={"X-Subscription-Token": BRAVE_API_KEY, "Accept": "application/json"},
    params={"q": keyword, "count": 20}
)

results = response.json().get("web", {}).get("results", [])
for i, result in enumerate(results, 1):
    if target_domain in result.get("url", ""):
        print(f"Brave position {i}: {result['title']}")
        break

Google Custom Search API(每天 100 次免费搜索)

Google 的 Custom Search JSON API 每天给你 100 次免费搜索(每月 3,000 次)。你需要在 Google Cloud Console 里创建一个自定义搜索引擎(CSE)。默认情况下,CSE 搜索整个网络(如果你没限制到特定网站),通过 API 给你 Google 搜索结果。

import requests

API_KEY = "your_google_api_key"
CSE_ID = "your_custom_search_engine_id"
keyword = "free seo audit"
target_domain = "zens.ink"

response = requests.get(
    "https://www.googleapis.com/customsearch/v1",
    params={"key": API_KEY, "cx": CSE_ID, "q": keyword, "num": 10}
)

for i, item in enumerate(response.json().get("items", []), 1):
    if target_domain in item.get("link", ""):
        print(f"Position {i}: {item['title']}")
        print(f"URL: {item['link']}")
        break

限制是每次请求最多 10 条结果,而且 CSE 结果并不完全等同于普通 Google 搜索结果(Google 对 CSE 应用了不同的排名信号)。但它是另一个免费数据点。

三个 API 对比

我每周对我的前 20 个关键词跑全部三个 API:

  • Serper.dev 最接近真实 Google SERP,因为它直接抓取 Google。
  • Brave Search 提供不同视角——如果你的页面同时在 Google 和 Brave 排名,这比只在一个上面排名信号更强。
  • Google CSE 使用 Google 的索引但排名略有不同。适合交叉验证。

每月总成本:$0。可用总查询量:约 7,500。对100+关键词的每周追踪绰绰有余。

方法 4:用 Python 搭建自己的 DIY 排名追踪器

为每个关键词运行单独的脚本很繁琐。以下是我搭建完整排名追踪器的方法:每周运行、结果存 CSV、生成趋势报告。

#!/usr/bin/env python3
"""
DIY Rank Tracker — Zero cost, fully automated.
Tracks keyword positions using Serper.dev free API.
Stores results in CSV for historical trend analysis.
"""

import requests, csv, json, os
from datetime import datetime, timedelta

SERPER_API_KEY = os.environ.get("SERPER_API_KEY", "")
TARGET_DOMAIN = "zens.ink"
DATA_FILE = "rank_history.csv"

KEYWORDS = [
    "free seo audit",
    "keyword research without ahrefs",
    "geo optimization",
    "technical seo audit free",
    "keyword clustering free",
    "search intent analysis",
    "on-page seo checklist",
    "backlink analysis free",
    "content gap analysis free",
    "core web vitals check",
    "fix indexing issues",
    "serp analysis without tools",
    "rank tracking without paid tools",
    "seo without ahrefs",
    "free seo tools for developers",
]

def check_rank(keyword, domain):
    """Check ranking position for a keyword using Serper.dev."""
    try:
        response = requests.post(
            "https://google.serper.dev/search",
            headers={
                "X-API-KEY": SERPER_API_KEY,
                "Content-Type": "application/json"
            },
            json={"q": keyword, "num": 100},
            timeout=15
        )
        results = response.json().get("organic", [])
        for i, result in enumerate(results, 1):
            if domain in result.get("link", ""):
                return {
                    "position": i,
                    "url": result["link"],
                    "title": result["title"]
                }
        return {"position": None, "url": None, "title": None}
    except Exception as e:
        print(f"  Error checking '{keyword}': {e}")
        return {"position": None, "url": None, "title": None}

def save_results(results, filename):
    """Append results to CSV file."""
    file_exists = os.path.isfile(filename)
    with open(filename, "a", newline="") as f:
        writer = csv.writer(f)
        if not file_exists:
            writer.writerow(["date", "keyword", "position", "url", "title"])
        for r in results:
            writer.writerow([
                r["date"], r["keyword"],
                r["position"] if r["position"] else "100+",
                r["url"] or "", r["title"] or ""
            ])

def generate_report(filename, days=30):
    """Generate a trend report comparing current vs. past positions."""
    if not os.path.isfile(filename):
        print("No history file found.")
        return

    rows = []
    with open(filename, "r") as f:
        reader = csv.DictReader(f)
        for row in reader:
            rows.append(row)

    today = datetime.now().date()
    past = today - timedelta(days=days)

    print(f"\n{'='*60}")
    print(f"Rank Trend Report — Last {days} days")
    print(f"{'='*60}")
    print(f"{'Keyword':<35} {'Current':<10} {'Previous':<10} {'Change':<10}")
    print(f"{'-'*35} {'-'*10} {'-'*10} {'-'*10}")

    for keyword in KEYWORDS:
        keyword_rows = [r for r in rows if r["keyword"] == keyword]
        if not keyword_rows:
            continue

        # Get most recent position
        recent = [r for r in keyword_rows if datetime.strptime(r["date"], "%Y-%m-%d").date() >= past]
        if recent:
            current = recent[-1]["position"]
        else:
            current = keyword_rows[-1]["position"]

        # Get position from ~30 days ago
        older = [r for r in keyword_rows if datetime.strptime(r["date"], "%Y-%m-%d").date() < past]
        previous = older[-1]["position"] if older else "N/A"

        # Calculate change
        if current != "N/A" and previous != "N/A":
            try:
                delta = int(previous) - int(current)
                change = f"+{delta}" if delta > 0 else str(delta) if delta < 0 else "—"
                if delta > 0:
                    change = f"↑{delta}"
                elif delta < 0:
                    change = f"↓{abs(delta)}"
            except ValueError:
                change = "—"
        else:
            change = "—"

        print(f"{keyword:<35} {current:<10} {previous:<10} {change:<10}")

if __name__ == "__main__":
    today = datetime.now().strftime("%Y-%m-%d")
    print(f"Checking rankings for {TARGET_DOMAIN} on {today}...")
    print(f"Keywords: {len(KEYWORDS)}\n")

    results = []
    for keyword in KEYWORDS:
        rank = check_rank(keyword, TARGET_DOMAIN)
        pos_str = str(rank["position"]) if rank["position"] else "100+"
        print(f"  {keyword:<40} → Position {pos_str}")
        rank["date"] = today
        rank["keyword"] = keyword
        results.append(rank)

    save_results(results, DATA_FILE)
    print(f"\nResults saved to {DATA_FILE}")

    if os.path.isfile(DATA_FILE):
        generate_report(DATA_FILE, days=28)

这个脚本做三件事:

  1. 检查当前排名——通过 Serper.dev 对所有追踪关键词
  2. 存储结果——存到 CSV 文件做历史追踪
  3. 生成趋势报告——对比当前和之前的位置

我每周日通过 cron 运行它。输出看起来像:

Checking rankings for zens.ink on 2026-08-05...
Keywords: 15

  free seo audit                            → Position 8
  keyword research without ahrefs           → Position 12
  geo optimization                          → Position 100+
  ...

Results saved to rank_history.csv

============================================================
Rank Trend Report — Last 28 days
============================================================
Keyword                              Current    Previous   Change
----------------------------------- ---------- ---------- ----------
free seo audit                       8          11         ↑3
keyword research without ahrefs     12          15         ↑3
geo optimization                     100+       100+       —

设置自动化 Cron

在任何 Linux 服务器上,甚至 GitHub Action 上,你都可以自动化这个:

# Add to crontab — runs every Sunday at 9 AM
0 9 * * 0 cd /path/to/tracker && SERPER_API_KEY=your_key python3 rank_tracker.py >> tracker.log 2>&1

或者用 GitHub Actions 实现零服务器设置:

name: Weekly Rank Tracking
on:
  schedule:
    - cron: '0 9 * * 0'
jobs:
  track:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - run: pip install requests
      - run: python3 rank_tracker.py
        env:
          SERPER_API_KEY: ${{ secrets.SERPER_API_KEY }}
      - uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: "Weekly rank tracking update"

GitHub Action 每周运行,检查排名,把更新的 CSV 提交到你的仓库,不花一分钱。

方法 5:Bing Webmaster Tools(被低估的替代方案)

所有人都关注 Google 排名,但 Bing 支撑了相当一部分搜索流量——尤其通过 Windows 搜索、Edge 浏览器,以及像 ChatGPT 网页浏览这样的 AI 搜索体验。

Bing Webmaster Tools 是免费的,提供类似 GSC 的排名数据,但是针对 Bing 搜索引擎的。搜索表现报告显示查询、展示、点击和平均位置。

为什么这很重要:Bing 的索引喂养多个 AI 搜索体验。如果你的网站在 Bing 上排名好,它更可能出现在 AI 生成的答案中。同时追踪 Bing 和 Google 排名,让你更完整地看到自己的搜索可见性。

界面没有 GSC 精致,但数据很有价值:

关键词研究工具。 Bing 的关键词研究工具显示关键词的搜索量趋势。我把它当作 Ahrefs 关键词探索器的免费替代品,用来做初步的搜索量估算。

SEO 报告。 Bing 自动扫描你的网站并生成 SEO 报告,列出需要修复的具体问题。相当于免费的迷你技术审计。

站点资源管理器。 展示 Bingbot 如何看你的网站,哪些页面被索引,以及任何爬取问题。

我每月检查一次 Bing Webmaster Tools。花10分钟,经常能发现 GSC 里错过的机会——那些在 Bing 上带来比 Google 更多流量的关键词,或者 Bing 比 Google 索引更快的页面。

如何解读排名数据而不把自己搞疯

有数据是一回事。正确解读是另一回事。以下是我遵循的原则:

原则 1:绝不对单一数据点做反应

一天之内3个位置的变动说明不了什么。Google 在不断重排结果。我至少等7天才下结论说某个排名变化是真的,等30天才采取行动。

例外: 如果一个页面一夜之间从第3位掉到第50位以上,立刻调查。这不属于正常波动——通常意味着技术问题(页面挂了、robots.txt 屏蔽、意外 noindex、服务器错误)或人工处罚。

原则 2:用档位追踪位置

与其纠结精确位置,不如把关键词分成几档:

  • 前 3: 核心位置。这些获得最多点击。维持和防守。
  • 4-10 位: 第一页。强可见性。努力提升。
  • 11-20 位: 第二页。接近突破。集中优化这里,快速见效。
  • 21-50 位: 被索引了但埋得很深。需要实质性内容或链接改进。
  • 50+ 或未上榜: 还没有竞争力。考虑这个关键词是否值得追。

从一档跳到另一档(比如 11-20 到 4-10)比从第13位到第11位更有意义。

原则 3:把位置变化和你的操作关联起来

当你的位置改善时,识别你做了什么:

  • 就该主题发布了新内容
  • 更新了已有内容
  • 添加了内链
  • 获得了一条新反向链接
  • 修复了技术问题
  • 什么都没做(自然波动)

简单记录一份带日期的 SEO 操作日志。当排名变化时,检查1-2周前发生了什么。时间长了,你就会知道哪些操作真正对网站有效果。

我把它放在一个简单的文本文件里:

2026-07-15: Published GSC guide (2,800 words)
2026-07-18: Updated internal links from 5 posts to GSC guide
2026-07-20: Earned backlink from dev.to article
2026-07-25: Updated keyword clustering article (added FAQ schema)
2026-08-01: Fixed broken internal links (12 found and fixed)

原则 4:关注 SERP,不只是你的位置

你的位置可以不变,但流量剧变。为什么?SERP 特性。

如果 Google 在你的第3位结果上方加了一个精选摘要,你的 CTR

想给自己的站点做同样的分析?

ZensInk Pro 把这个流程自动化了。一条命令,从种子词到内容计划。

查看 Pro →