很多做 SEO 工具的朋友问过我:排名监控到底怎么做?今天从 0 讲一遍完整思路,带可运行的代码。
先说清楚:排名监控这件事,难点不在"查一次排名",而在"每天稳定地查 + 存历史 + 对比变化"。查一次排名,调一个接口就行;难的是让这件事每天自动跑、不出错、数据还能用。
一、整体思路
排名监控 = 四步循环:
- 定时任务:每天(或每几小时)触发一次
- 查排名:对每个关键词,查 Google 搜索结果
- 存历史:把每次的排名结果存下来
- 对比告警:今天的排名和昨天比,变了就通知
二、查排名
下面以 SerpBase 的 /google/search 接口为例(1 积分一次)。返回的 JSON 里,organic 数组就是自然搜索结果,每条带 rank、title、link。
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 }}
六、几个注意点
rank会随地区变 :同一个词,上海和北京查,排名可能不同。固定用同一组hl/gl查,数据才可比。- 别高频查:排名变化是小时级的,一天查 1-2 次足够,查太多纯浪费。
- 本地词要用 Maps:如果监控"上海 牙科诊所"这种,光查 search 不够,得用 Maps 端点带坐标。
七、成本
几十个词,一天查一次,一个月在 Starter 档($0.50/千次)内,几美元的事。积分不过期,用多少扣多少。
八、还能扩展
- 多语言 :加
gl参数查不同国家 - 图片 :加
/google/images看自己的图有没有进图片包 - AI Overview:看自己的品牌有没有被 AI 摘要提到
完整参数和响应字段参考:serpbase.dev/docs。这套思路,我从 0 搭到能跑,一个下午就够。