老板甩下一句话:“我要每天早八点看到关键词排名截图。”手动查?三百个词查到午饭都凉。把数据搬回来最省事的办法,就是直接连上搜索SEO优化平台的API,用Python让机器半夜跑,醒来收表。下面这份笔记把踩坑点都标好了,抄作业就能跑通。
先搞清楚:平台到底给了什么接口
市面上常见的搜索SEO优化平台,无论名字多花哨,对外提供的都是REST风格接口,返回格式清一色JSON。注册账号后,后台会生成三样东西:API域名、用户密钥、套餐配额。先把这三行复制到备忘录,等会儿代码里直接粘贴,少敲一次就少一次手滑。
官方文档通常藏在“开发者中心”里,点进去先看速率限制。大多数平台单IP每分钟六十次,超出就锁你十分钟。提前把频率算进代码,省得半夜被拉黑还找不到原因。
把Python环境一次配到位
Windows、Mac都一样,装官方最新Python,勾选“Add to PATH”,省得后面手动配环境变量。打开终端,pip install requests pandas,这两包足够。requests负责握手,pandas把JSON秒变Excel,老板要看表直接发他。
怕冲突就建个虚拟环境:python -m venv seoapi,激活后装包,干净利索。PyCharm、VS Code随便挑,新建项目时选刚才的venv,自动提示补全,写代码像开挂。
拿钥匙开门:生成签名
平台为了防蹭数据,要求每次请求带签名。套路不复杂:把参数按字母排序,拼接上密钥,做一次MD5。代码十行就能搞定:
import hashlib def sign(params, secret): sorted_str = '&'.join([f"{k}={v}" for k, v in sorted(params.items())]) return hashlib.md5(f"{sorted_str}{secret}".encode()).hexdigest()
把函数保存成auth.py,后面所有脚本直接import,改密钥只动一处,维护省大事。
第一次握手:拉一条关键词排名
以某平台为例,接口地址https://api.xxx.com/v1/rank,必填字段:key、keyword、domain、se。se写baidu,返回电脑端排名;写baidu-mobile,返回手机端。上代码:
import requests, auth, json params = { "key": "你的key", "keyword": "Python SEO", "domain": "example.com", "se": "baidu" } params["sign"] = auth.sign(params, "你的密钥") resp = requests.get("https://api.xxx.com/v1/rank", params=params, timeout=10) print(json.dumps(resp.json(), ensure_ascii=False, indent=2))
终端返回里,rank字段就是实时位置,pos 0代表第一名,pos 9代表第十名。没进前十返回null,记得做空值判断,别让脚本崩。
批量查:把三百个词一次性拖回来
单条查询太浪费配额,平台都提供批量接口,最多一百词一包。把关键词扔进txt,一行一个,读文件循环打包:
with open("keywords.txt", encoding="utf-8") as f: kw_list = [line.strip() for line in f if line.strip()] chunk_size = 100 for i in range(0, len(kwlist), chunksize): chunk = kwlist[i:i+chunksize] params = { "key": "你的key", "keywords": ",".join(chunk), "domain": "example.com", "se": "baidu" } params["sign"] = auth.sign(params, "你的密钥") resp = requests.get("https://api.xxx.com/v1/rank_batch", params=params, timeout=20) df = pandas.DataFrame(resp.json()["data"]) df.tocsv(f"rank{i//100}.csv", index=False)
跑完脚本,目录里多出一堆csv,合并后就是完整排名表。配额消耗直接减半,速度翻十倍。
数据清洗:让表格一眼看懂
平台返回的字段多到眼花,保留keyword、rank、rankurl、updatetime四列就够。用pandas一行删除多余列:
df = df[["keyword", "rank", "rankurl", "updatetime"]]
再把null替换成“>50”,老板一眼知道哪些词掉出首页。最后排序,rank升序,前十名自动排前面,截图发群里,气场直接拉满。
定时任务:让电脑半夜自己跑
Windows打开“任务计划程序”,新建触发器,每天六点执行pythonw.exe,参数填脚本绝对路径,勾选“不管用户是否登录”。Linux更简单,crontab -e加一行:
0 6 * /usr/bin/python3 /home/user/rank.py >> /home/user/rank.log 2>&1
日志重定向到文件,出错随时翻,生产环境稳如老狗。
异常处理:别让脚本一言不合就罢工
网络抽风、平台维护,返回码非200是常态。加一层判断:
if resp.status_code != 200: print(f"接口异常,状态码:{resp.status_code}, 内容:{resp.text}") time.sleep(60) continue
再加try包裹JSON解析,解析失败记录原文,方便第二天甩给平台客服。脚本跑通宵,早上收表,心情舒爽。
进阶玩法:把数据喂给可视化看板
排名只是原始食材,炒成菜老板才买单。用pandas按日期聚合,计算环比升降,生成折线图。streamlit搭个网页,三行代码:
pip install streamlit streamlit run app.py
app.py里读csv,st.linechart(df.groupby("date")["top10count"].sum()),浏览器自动打开,手机也能看。老板开会掏出手机,折线嗖嗖往上,加薪理由自己长腿就跑过来。
常见坑合集
1. 时间戳单位:有的平台要秒,有的要毫秒,差一位签名就错,文档看仔细。2. URL编码:关键词里带空格,sign之前先quote,否则“Python 教程”和“Python教程”算两条签名。3. 配额刷新:不是自然日,是账号注册满二十四小时,别傻等零点。4. 白名单IP:换了Wi-Fi记得后台加新IP,不然返回“权限不足”,查半天还怪代码。
完整脚本模板:复制就能跑
把下面内容存成rank.py,填上三处密钥,双击脚本,排名自动落盘。
import requests, pandas, json, time, auth KEY = "你的key" SECRET = "你的密钥" DOMAIN = "example.com" def fetchrank(kwlist): chunk_size = 100 all_data = [] for i in range(0, len(kwlist), chunksize): chunk = kwlist[i:i+chunksize] params = {"key": KEY, "keywords": ",".join(chunk), "domain": DOMAIN, "se": "baidu"} params["sign"] = auth.sign(params, SECRET) try: resp = requests.get("https://api.xxx.com/v1/rank_batch", params=params, timeout=20) if resp.status_code == 200: all_data.extend(resp.json()["data"]) else: print(f"异常:{resp.text}") except Exception as e: print(f"网络错误:{e}") time.sleep(1) df = pandas.DataFrame(all_data) df = df[["keyword", "rank", "rankurl", "updatetime"]] df["rank"] = df["rank"].fillna(">50") df.tocsv(f"rank{int(time.time())}.csv", index=False) if name == "main": with open("keywords.txt", encoding="utf-8") as f: kw_list = [line.strip() for line in f if line.strip()] fetchrank(kwlist)
收尾:让数据替你上班
搜索SEO优化平台数据API对接,说难其实就两步:把签名算对,把频率控好。脚本跑顺后,每天睁眼就有新鲜排名表,时间省下来做内容、做外链,流量蹭蹭往上爬。别再手工查词,把活交给Python,你负责躺赢。