欢迎光临
我们一直在努力

把 SERP 结果打包成 RSS Feed:SERP API 做内容监控

一个常见需求

内容运营 / SEO 团队想知道:

  • 关键词的 PAA(People Also Ask)有没有新问题出现
  • 竞品有没有新页面进前 10
  • 搜索结果里有没有新的"知识图谱"信息

每天手动查:不现实。SERP API + RSS Feed 自动化:把 SERP 变化变成可订阅的 feed,用 Feedly / Inoreader 一目了然。

方案

SerpBase 拉 SERP 数据 → diff 昨天的数据 → 变化项生成 RSS XML → 部署到云函数或自己的服务器 → 订阅源地址固定,放进 RSS 阅读器。

完整代码

import requests
import json
import time
from datetime import datetime, timezone
from pathlib import Path

SERPBASE_KEY = "your-serpbase-key"
ENDPOINT = "https://api.serpbase.dev/google/search"
STATE_FILE = Path("serp_state.json")

KEYWORDS = [
"your brand keyword 1",
"your brand keyword 2",
"your industry keyword 1",
]

def fetch_serp(keyword, gl="us", hl="en"):
r = requests.post(
ENDPOINT,
headers={"X-API-Key": SERPBASE_KEY},
json={"q": keyword, "gl": gl, "hl": hl, "num": 10},
timeout=10,
)
r.raise_for_status()
return r.json()

def load_state():
if STATE_FILE.exists():
return json.loads(STATE_FILE.read_text())
return {}

def save_state(state):
STATE_FILE.write_text(json.dumps(state, indent=2))

def build_rss(items, title="SERP Monitor Feed"):
"""生成 RSS 2.0 XML"""
now = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S +0000")

items_xml = ""
for item in items[:30]: # RSS 最多 30 条
items_xml += f"""
<item>
<title>
{item['title']}</title>
<link>
{item['link']}</link>
<description><![CDATA[
{item['description']}]]></description>
<pubDate>
{item['pubDate']}</pubDate>
<guid isPermaLink="false">
{item['guid']}</guid>
</item>"""

return f"""<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>
{title}</title>
<link>https://serp-monitor.example.com/</link>
<description>Daily SERP changes for monitored keywords</description>
<language>en-us</language>
<lastBuildDate>
{now}</lastBuildDate>
{items_xml}
</channel>
</rss>"""

def collect_changes():
state = load_state()
today = datetime.utcnow().date().isoformat()
new_items = []
new_state = {}

for kw in KEYWORDS:
try:
data = fetch_serp(kw)

# 收集变化项
today_paa = [q.get("question", q) for q in data.get("people_also_ask", [])]
today_organic = [
{"title": item.get("title", ""), "link": item.get("link", ""), "snippet": item.get("snippet", "")}
for item in data.get("organic", [])
]

yesterday = state.get(kw, {})

# 1. PAA 新增
yesterday_paa = set(yesterday.get("paa", []))
new_paa = set(today_paa) yesterday_paa
for q in new_paa:
new_items.append({
"title": f"[{kw}] 新 PAA: {q}",
"link": f"https://www.google.com/search?q={requests.utils.quote(kw)}",
"description": f"People Also Ask 新增问题: {q}",
"pubDate": datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S +0000"),
"guid": f"paa-{kw}{hash(q)}",
})

# 2. Organic 前 10 新增
yesterday_titles = set(item["title"] for item in yesterday.get("organic", []))
for item in today_organic:
if item["title"] not in yesterday_titles:
new_items.append({
"title": f"[{kw}] 新进前 10: {item['title']}",
"link": item["link"],
"description": item["snippet"],
"pubDate": datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S +0000"),
"guid": f"organic-{kw}{hash(item['link'])}",
})

# 3. Knowledge Graph 变化
today_kg = data.get("knowledge_graph", {})
yesterday_kg = yesterday.get("kg", {})
if today_kg.get("description") != yesterday_kg.get("description"):
new_items.append({
"title": f"[{kw}] KG 更新",
"link": f"https://www.google.com/search?q={requests.utils.quote(kw)}",
"description": f"知识图谱描述变化:\\n旧: {yesterday_kg.get('description', '(none)')}\\n新: {today_kg.get('description', '(none)')}",
"pubDate": datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S +0000"),
"guid": f"kg-{kw}{today}",
})

# 保存今天状态
new_state[kw] = {
"paa": today_paa,
"organic": today_organic,
"kg": today_kg,
}

time.sleep(0.2)
except Exception as e:
print(f"Error processing {kw}: {e}")

save_state(new_state)
return new_items

def main():
items = collect_changes()
rss = build_rss(items)

Path("feed.xml").write_text(rss, encoding="utf-8")
print(f"Generated feed with {len(items)} items")

if __name__ == "__main__":
main()

部署

方案 1:GitHub Pages(免费,推荐)

  • repo 启用 Pages
  • workflow 跑完生成 feed.xml,commit 到 repo
  • 订阅 URL:https://<user>.github.io/<repo>/feed.xml
  • .github/workflows/serp-feed.yml:

    name: SERP Feed Generator
    on:
    schedule:
    cron: '0 0 * * *' # 每天 UTC 0:00
    workflow_dispatch:
    jobs:
    feed:
    runs-on: ubuntulatest
    steps:
    uses: actions/checkout@v3
    uses: actions/setuppython@v4
    with:
    python-version: '3.11'
    run: pip install requests
    name: Generate feed
    env:
    SERPBASE_KEY: ${{ secrets.SERPBASE_KEY }}
    run: python serp_feed.py
    run: |
    git config user.name "github-actions[bot]"
    git config user.email "actions@users.noreply.github.com"
    git add feed.xml
    git commit -m "Update SERP feed" || exit 0
    git push

    方案 2:Cloud Function + 对象存储

    更专业但配置多。适合团队场景。

    订阅

    把 feed URL 加进 RSS 阅读器:

    • Feedly
    • Inoreader
    • NetNewsWire(Mac)
    • Feedbin(付费,跨平台)

    每天变化项自动推送到阅读器,跟订阅公众号一样。

    实际效果

    我订阅了 50 个关键词,每天 5-15 条变化:

    [serp api pricing] 新 PAA: "SERP API vs web scraping 哪个便宜"
    [best serp api 2026] 新 PAA: "SERP API 一个月多少钱"
    [serp api for llm] 新进前 10: SERP API for LLM: A 2026 Guide
    [cheap serp api] KG 更新: 知识图谱描述从 "SERP API service" 变成 "Affordable SERP API for developers"

    每天早上咖啡时间扫一遍,5 分钟知道整个领域的变化。

    RSS XML 细节

    RSS 2.0 规范要求:

    • <channel> 必填:title / link / description
    • <item> 必填:title / link / description(其一)
    • <pubDate> 用 RFC 822 格式(如 Wed, 19 Jun 2026 09:00:00 +0000)
    • <guid> 全局唯一 ID,推荐 <guid isPermaLink="false"> + hash

    我用 hash(item) 生成 GUID,保证同一变化不会重复出现在 feed 里。

    几个关键设计

    1. 不要把全部 SERP 数据放 RSS

    如果每天生成 100 条 item,RSS 阅读器会刷屏。SERP 数据本身变化不大,真正"新"的项一天 5-15 条。

    2. 用 lastBuildDate 而不是 pubDate per item

    lastBuildDate 在 channel 级别,代表"这个 feed 最后生成时间"。每个 item 用 pubDate 表示"变化发生时间"。

    3. GUID 稳定

    同一变化不要每次重新生成 GUID(否则 RSS 阅读器会重复推送)。用 hash(keyword + change_type + identifier)。

    4. 失败的 keyword 跳过

    不写入 RSS,但 state 要标记"(今天没拉到)",方便人工 review。

    适用场景

    • 内容运营:每天看领域内 SERP 变化,抢新出现的 PAA 写文章
    • SEO 团队:监控核心关键词 SERP 波动
    • 产品经理:看竞品 SERP 变化(新页面、新 PAA)
    • 学术研究:长期收集特定关键词 SERP 数据

    不适合:

    • 实时性要求 < 1 小时(RSS 阅读器一般 1 小时 pull 一次)
    • 高频变化场景(SEO 排名波动每天多次,挑重要的)
    • 大规模(>1000 关键词,feed 太长)

    总结

    SERP API + Python + RSS Feed 三件套,5 分钟搭出"内容监控 bot"。每天变化自动推 RSS 阅读器,跟订阅公众号一样简单。

    适合个人和小团队的内容监控。规模化的内容监控还是用 SaaS(Brand24 / Mention 这种),但成本差 100 倍。

    赞(0)
    未经允许不得转载:171主机测评 » 把 SERP 结果打包成 RSS Feed:SERP API 做内容监控
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址