盯关键词排名是站长的日常,但手动搜有几个致命伤:不同浏览器、不同账号、不同时间搜出来的结果都不一样,你记录的“排名”其实是随机数;一天搜十遍的时间成本也不值。正经做法是用接口拿结构化的搜索结果,一次跑完整个关键词清单,数据还可追溯。
SERP 数据接口里 SerpAPI 是老牌选择:免费档每月 100 次搜索、不需要绑卡,结构化 JSON 直接返回自然结果列表,付费档 Developer 计划每月 75 美元含 5000 次。先算清免费额度这笔账:100 次/月,意味着核心词表控制在 20 个以内、每周全量查一次,是免费档的正确用法;每天都要盯的词留三五个高频位。写代码时请求之间留间隔,把额度用在刀刃上。
import requests, time, csv
API_KEY = "your_serpapi_key"
DOMAIN = "example.com"
def track(keyword):
r = requests.get("https://serpapi/search.json",
params={"engine": "google", "q": keyword,
"api_key": API_KEY}, timeout=30)
for i, item in enumerate(r.json().get("organic_results", []), 1):
if DOMAIN in item.get("link", ""):
return i, item["link"]
return None, ""
rows = []
for kw in [l.strip() for l in open("keywords.txt") if l.strip()]:
pos, url = track(kw)
rows.append([kw, pos, url, time.strftime("%F %H:%M")])
print(kw, pos, flush=True)
time.sleep(2)
csv.writer(open("rank_log.csv", "a", newline="")).writerows(rows)
rank_log.csv 攒起来就是排名历史库,每周和上周对比就能画出趋势,不用装任何看板工具。百度侧没有公开的排名 API,SerpAPI 也不出百度结果的稳定口径,国内的排名监控要么用爱站、站长工具这类第三方平台的批量查询,要么自己写慢速抓取——后者风险自负,前面收录核查那篇讲过的分寸同样适用:低频、加延时、被验证码拦住就停手。
# 每周对比:上周 vs 本周的排名变化
import csv
from collections import defaultdict
last, now = defaultdict(int), defaultdict(int)
for kw, pos, url, ts in list(csv.reader(open("rank_log.csv"))):
pass # 按日期切两段分别取最新快照后逐词相减
# 简化版:直接用 pandas
# df = pd.read_csv("rank_log.csv", names=["kw","pos","url","ts"])
# df["date"] = df["ts"].str[:10]
# print(df.pivot_table(index="kw", columns="date", values="pos"))
验证脚本准确性只用一招:抽三个词手工搜一遍,位置对得上就信。注意手工核对也要用无痕窗口,不然个性化干扰会让你怀疑脚本出了错。排名追踪这条数据流铺好之后,后面几篇的波动分析、CTR 分析都吃它的产出。
再交代两个高频踩坑点。一是额度超了别硬刷:SerpAPI 超额不会扣费但会直接拒绝请求,脚本里要对非 200 响应做保护,把当轮剩余关键词跳过、下次再查,不然白白空跑一轮;二是结果稳定性问题,同一关键词隔几分钟查两次,位置偶尔会差一两位,这是搜索引擎端固有的抖动,分析趋势时以“周”为粒度做平均,别纠结单次查询的个位波动。关键词清单的维护也有讲究:每月把查了半年排名从没进过前 50 的词清出去,腾出额度给新词——追踪列表本身就该是个活的清单,不是一次建好永不动的死档案。
相关阅读:排名数据贵在连续。《SEO 自动化总清单:日、周、月、季各该跑什么》把本篇排进每周组,免费额度刚好够用,跑满一个月就能画出自己的排名曲线。
A5创业网 版权所有