我手上跑着 5 个 side project,每个都想做点 SEO。但市面上能用的排名追踪工具全是给 agency 准备的——Ahrefs $99/月起,SEMrush $130/月起。对一个还在 MVP 阶段的小项目来说,这笔钱投出去肉疼。
不投的话,我完全不知道"react server components 教程"这种我花了 3 周打底的关键词,到底有没有从第 47 名爬到第 30 名。Google Search Console 数据滞后 2-3 天,免费工具又只能看自家站。
所以我给自己写了一个小工具。每天早上 8 点自动跑一遍我关心的关键词,存到 SQLite 里。一共写了不到 80 行 Python。下面是过程和成本。
老规矩,先试试自己爬。Python 写个 requests,模拟浏览器,parse HTML。20 分钟后 IP 被 ban。
换个方案:用 Playwright 跑 headless Chrome,加住宅代理。一个月下来:
这还没算上"我的网站突然被 Google 标记"的风险。一个小项目不值得冒这个险。
我对比了四个 SERP API,按"独立开发者友好"程度排:
$3 = 10,000 次搜索这个组合对我正合适。我每天只用 100 次左右,10,000 次能撑一个季度。
我用 /google/search 端点,1 次搜索 1 credit。核心代码:
import requests
import sqlite3
from datetime import date
API_KEY = "你的 key"
DB = "ranks.db"
def get_serp(keyword: str, gl: str = "us", hl: str = "en") -> list[dict]:
r = requests.post(
"https://api.serpbase.dev/google/search",
headers={"X-API-Key": API_KEY},
json={"q": keyword, "num": 20, "gl": gl, "hl": hl, "device": "desktop"},
timeout=15,
)
r.raise_for_status()
return r.json().get("organic", [])
def find_my_rank(keyword: str, my_domain: str, gl: str = "us") -> int | None:
for i, item in enumerate(get_serp(keyword, gl=gl), start=1):
link = item.get("link", "")
if my_domain in link:
return i
return None
def save_rank(keyword: str, domain: str, rank: int | None):
conn = sqlite3.connect(DB)
conn.execute(
"INSERT INTO ranks (date, keyword, domain, rank) VALUES (?, ?, ?, ?)",
(date.today().isoformat(), keyword, domain, rank),
)
conn.commit()
conn.close()
每天跑一次,把"哪个关键词、哪个网站、今天第几名"写进 SQLite。一个月下来我就有了一条完整曲线。
我的实际用量:
实际上我没买按 $0.30 的 Enterprise 包——我用 $3 的 Starter Boost 撑了 3 个月(10,000 次 ÷ 3,000/月 ≈ 3 个月)。Boost 过期后我换 $10 的 Starter 包(20,000 次,$0.50/1k,不过期),又够跑半年。
对独立开发者来说,这个成本结构才是友好的:先花 $3 试,跑通了再决定要不要升级。
做了主流程之后,我又给其中一个本地服务类的 side project 加了地图排名监控。
两个端点串着用:
/google/maps/search 找商家(每次 2 credit)feature_id 之后调 /google/maps/detail 拿完整商家信息(每次 2 credit)def find_place(query: str, lat: float, lng: float):
r = requests.post(
"https://api.serpbase.dev/google/maps/search",
headers={"X-API-Key": API_KEY},
json={"q": query, "lat": lat, "lng": lng, "zoom": 14},
)
r.raise_for_status()
return r.json()["places"]
def get_place_detail(feature_id: str) -> dict:
r = requests.post(
"https://api.serpbase.dev/google/maps/detail",
headers={"X-API-Key": API_KEY},
json={"feature_id": feature_id},
)
r.raise_for_status()
return r.json()["place"]
lat/lng/zoom 这三个参数很重要——传了之后 SERP 会模拟"在这个坐标点附近搜"的结果,跟你从 Google Maps 网页端搜的体验一致。本地 SEO 不传坐标等于白搜。
加这个模块之后,我的用量翻倍——但 $3 的额度还是撑得住。
ai_overview 字段(Google 自己生成的 AI 总结)。我没把它当成一个排名——AI Overview 是抢流量的,不是抢排名的。我只追踪 organic。hl=en&gl=us 和 hl=zh&gl=cn 出来的结果完全不同。我的 SaaS 是面向全球的,所以两个区都查。我现在的方案:
成本几乎可以忽略。关键是现在我每天都能看到自己的排名曲线,知道哪篇文章在涨、哪篇在掉、哪个关键词被 AI Overview 抢了流量。
独立开发者做 SEO 的最大障碍不是"不懂",是"看不到"。看不到就没法迭代。$3 起步的工具就能把这件事闭环了,比 $99/月的工具更适合早期项目。
新手可以先用免费 100 次额度(注册就送,不用绑卡)验证自己的查询逻辑:https://serpbase.dev/register
剩下的就看你的网站到底要打什么关键词了。