从 0 搭一个关键词排名监控:核心思路 + 可运行代码

很多做 SEO 工具的朋友问过我:排名监控到底怎么做?今天从 0 讲一遍完整思路,带可运行的代码。

先说清楚:排名监控这件事,难点不在"查一次排名",而在"每天稳定地查 + 存历史 + 对比变化"。查一次排名,调一个接口就行;难的是让这件事每天自动跑、不出错、数据还能用。

一、整体思路

排名监控 = 四步循环:

  1. 定时任务:每天(或每几小时)触发一次
  2. 查排名:对每个关键词,查 Google 搜索结果
  3. 存历史:把每次的排名结果存下来
  4. 对比告警:今天的排名和昨天比,变了就通知

二、查排名

下面以 SerpBase 的 /google/search 接口为例(1 积分一次)。返回的 JSON 里,organic 数组就是自然搜索结果,每条带 ranktitlelink

python 复制代码
import requests

def fetch_rank(keyword):
    r = requests.post(
        "https://api.serpbase.dev/google/search",
        headers={"X-API-Key": "你的key"},
        json={"q": keyword, "hl": "zh-CN", "gl": "cn"},
        timeout=10,
    )
    r.raise_for_status()
    data = r.json()

    # 找到自己的域名排第几
    organic = data.get("organic", [])
    for item in organic:
        if "yoursite.com" in (item.get("link") or ""):
            return item.get("rank")
    return None  # 没排进前 10

三、存历史

排名数据要存下来才有用。最简单的用 SQLite,数据量大了换 PostgreSQL:

python 复制代码
import sqlite3

conn = sqlite3.connect("rank.db")
conn.execute("""
    CREATE TABLE IF NOT EXISTS rank_history (
        keyword TEXT,
        rank INTEGER,
        date TEXT
    )
""")

def save_rank(keyword, rank):
    conn.execute(
        "INSERT INTO rank_history VALUES (?,?,?)",
        (keyword, rank, datetime.now().strftime("%Y-%m-%d")),
    )
    conn.commit()

四、对比告警

今天和昨天的排名对比,变化超过阈值就通知:

python 复制代码
def check_change(keyword, today_rank):
    row = conn.execute(
        "SELECT rank FROM rank_history WHERE keyword=? ORDER BY date DESC LIMIT 1 OFFSET 1",
        (keyword,),
    ).fetchone()
    if not row:
        return
    yesterday = row[0]
    if today_rank and yesterday and abs(today_rank - yesterday) >= 3:
        send_alert(f"{keyword}: {yesterday} -> {today_rank}")

五、定时跑

用 GitHub Actions 每天定时执行,免费:

yaml 复制代码
name: rank-monitor
on:
  schedule:
    - cron: "0 1 * * *"   # 每天 1 点 UTC(北京 9 点)
jobs:
  monitor:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
      - run: pip install requests
      - run: python monitor.py
        env:
          SERPBASE_API_KEY: ${{ secrets.SERPBASE_API_KEY }}

六、几个注意点

  1. rank 会随地区变 :同一个词,上海和北京查,排名可能不同。固定用同一组 hl/gl 查,数据才可比。
  2. 别高频查:排名变化是小时级的,一天查 1-2 次足够,查太多纯浪费。
  3. 本地词要用 Maps:如果监控"上海 牙科诊所"这种,光查 search 不够,得用 Maps 端点带坐标。

七、成本

几十个词,一天查一次,一个月在 Starter 档($0.50/千次)内,几美元的事。积分不过期,用多少扣多少。

八、还能扩展

  • 多语言 :加 gl 参数查不同国家
  • 图片 :加 /google/images 看自己的图有没有进图片包
  • AI Overview:看自己的品牌有没有被 AI 摘要提到

完整参数和响应字段参考:serpbase.dev/docs。这套思路,我从 0 搭到能跑,一个下午就够。

相关推荐
ShadowYD4 小时前
Agent Loop:一个让 AI 编程 Agent 从"会写代码"进化到"闭环交付"的开源 Skill(适配国内外主流 Code Agent)
后端
考虑考虑5 小时前
nohup启动java程序
后端·自动化运维
Gigavision6 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
IPdodo_6 小时前
跨境 API 调用不稳定怎么办:出口、超时重试与链路监控的实践
网络·python·网络协议
aramae6 小时前
模拟实现strcmp()(C语言)
c语言·开发语言·后端
Madison-No76 小时前
搭建项目测试环境
linux·运维·服务器·python
计算机编程-吉哥7 小时前
YOLO26 vs YOLO11 vs YOLOv8:深度学习咖啡果实成熟度分割系统【计算机毕业设计选题推荐】
人工智能·python·深度学习·yolo·django·毕业设计
大衛說7 小时前
11 · 异常处理与日志
python
auto_go8 小时前
Python 实战指南(7)——账本动不动就崩?先把“魔法字符串”和“裸报错”干掉
python