做 SEO 的应该都写过竞品周报------每周手动查竞品排什么词、谁进前五、谁掉了。一次小半天,还容易漏。
这篇文章讲怎么把竞品周报做成全自动:每周一早上 9 点,一份报告自动生成发到群/邮箱。全程不用人管。
整体思路
竞品周报 = 定时抓 → 对比上周 → 生成报告 → 推送。
下面以 SerpBase 的 /google/search 接口为例。
第一步:竞品词表
先把要监控的词列好。两类:
- 竞品品牌词:竞品名、竞品产品名
- 行业核心词:你所在的行业高频词
python
KEYWORDS = [
"竞品A",
"竞品B",
"行业词1",
"行业词2",
]
第二步:定时抓取
python
import requests
from datetime import datetime
def fetch_top5(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()
organic = r.json().get("organic", [])
return [
{"rank": i + 1, "title": x.get("title", "")[:30], "link": x.get("link", "")}
for i, x in enumerate(organic[:5])
]
第三步:存历史,对比
每周抓一次,存下来,对比上周:
python
import json, os
def load_prev():
if os.path.exists("prev.json"):
return json.load(open("prev.json", encoding="utf-8"))
return {}
def save_curr(data):
json.dump(data, open("prev.json", "w", encoding="utf-8"), ensure_ascii=False)
def build_report():
prev = load_prev()
curr = {kw: fetch_top5(kw) for kw in KEYWORDS}
lines = ["## 竞品 SERP 周报", f"时间: {datetime.now():%Y-%m-%d}", ""]
for kw in KEYWORDS:
lines.append(f"### {kw}")
old = prev.get(kw, [])
new = curr[kw]
if old and new:
# 找出变化
for item in new:
rank = item["rank"]
before = next((p["rank"] for p in old if p["link"] == item["link"]), None)
mark = ""
if before and before != rank:
mark = f" (从{before}变)"
lines.append(f"{rank}. {item['title']}{mark}")
else:
for item in new:
lines.append(f"{item['rank']}. {item['title']}")
lines.append("")
save_curr(curr)
return "\n".join(lines)
第四步:推送
生成完报告,推送到目标。两种常见:
发邮件:
python
import smtplib
from email.mime.text import MIMEText
def send_email(body):
msg = MIMEText(body, "plain", "utf-8")
msg["Subject"] = "竞品 SERP 周报"
msg["From"] = "you@example.com"
msg["To"] = "team@example.com"
with smtplib.SMTP("smtp.example.com", 587) as s:
s.starttls()
s.login("you", "pass")
s.send_message(msg)
发群(飞书/钉钉 webhook):调 webhook 就行,几行代码。
第五步:定时跑
GitHub Actions 每周一早上:
yaml
name: competitor-weekly
on:
schedule:
- cron: "0 1 * * 1" # 周一 1 点 UTC(北京 9 点)
jobs:
weekly:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- run: pip install requests
- run: python weekly.py
env:
SERPBASE_API_KEY: ${{ secrets.SERPBASE_API_KEY }}
效果
以前:每周手动 2-3 小时,容易漏。
现在:周一早上自动生成,看一眼变化就行。
注意
- 固定
hl/gl:周报对比才有意义 - 别盯太细:一天的变化可能是噪声,周维度看趋势
- 成本:几十个词一周一次,一个月几美元
完整参数和响应字段参考:serpbase.dev/docs。这套周报,我搭完就没再手动做过。