竞品 SERP 周报自动化:每周一早上 9 点自动生成

做 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 小时,容易漏。

现在:周一早上自动生成,看一眼变化就行。

注意

  1. 固定 hl/gl:周报对比才有意义
  2. 别盯太细:一天的变化可能是噪声,周维度看趋势
  3. 成本:几十个词一周一次,一个月几美元

完整参数和响应字段参考:serpbase.dev/docs。这套周报,我搭完就没再手动做过。

相关推荐
ShineWinsu4 小时前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
星核0penstarry1 天前
企业 API 向后兼容实战:版本控制、废弃字段通知与灰度发布策略
人工智能·后端·api·接口隔离原则·版本控制·架构设计·后端架构
treasure1401 天前
Django复习笔记(2026年10月)
后端·python·django·api·web·drf
用户298698530142 天前
Python 将 Word 文档转换为 XML 的实践要点
后端·python·api
用户298698530143 天前
Python 实战:Markdown 转 PDF 的代码实现与页面设置
python·api·markdown
Tanshu_API君3 天前
白银期货行情数据接入:从上海期货交易所合约到实时报价
api·金属·白银·白银价格·白银历史价格
EnCi Zheng4 天前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
千木SilvaMux4 天前
10款国产模型写离职证明实测:为什么两极分化
llm·api
用户298698530145 天前
Python 实现 Markdown 与 Word 文档互转
python·api·markdown
むはちひつなゃ初见5 天前
LLM API 上线 FAQ 与排障清单:从 401/429 到 fallback 验收
llm·api·故障排查