竞品情报讲究时效:人家发了篇踩中热点的文章,三天后你才看到,热点红利早被吃干净了。人工盯不现实,订阅对方的邮件列表太慢,靠刷朋友圈靠缘分。其实大部分内容站都自带一个公开的更新广播——sitemap.xml,里面的 URL 清单就是对方的内容全量目录,定期拉取做差集,新文章新栏目当场现形。
监控脚本的逻辑三行讲完:拉竞品 sitemap 提取全部 URL,和上次保存的清单做差集,新出现的 URL 打印出来并更新存档。配一个每日定时任务,新内容最多晚你一天。Sitemap 协议本身支持 lastmod 时间戳,有的站还会在 sitemap 里标注每页最后修改时间,连“老文章大改”都能监测到。
import requests, re, os
SITES = ["https://rival-a.com/sitemap.xml",
"https://rival-b.com/sitemap.xml"]
def get_urls(site):
r = requests.get(site, timeout=15,
headers={"User-Agent": "Mozilla/5.0"})
return set(re.findall(r"<loc>([^<]+)</loc>", r.text))
for site in SITES:
name = site.split("/")[2].replace(".", "_")
cache = f"sm_{name}.txt"
old = set(open(cache).read().split()) if os.path.exists(cache) else set()
urls = get_urls(site)
added = urls - old
print(f"== {site} 共{len(urls)}条 新增{len(added)}条")
for u in sorted(added):
print(" NEW:", u)
with open(cache, "w") as f:
f.write("
".join(sorted(urls)))
注意大站的主 sitemap 往往是个索引文件,里面套着几十个分站点地图(按栏目或月份拆分),递归拉一层子地图才拿到全量 URL。差集监控同样能发现“删除”和“改版”——清单里消失的 URL、栏目目录结构变化,都是对方动作的信号。RSS 订阅是补充手段:带全文输出的站点用 feedparser 订阅,更新推送更及时,之前 RSS 关键词监听那篇的代码可以直接复用,把关键词过滤换成指定源全部接收就行。
# 递归拉 sitemap 索引(大站适用)
def get_all_urls(site, seen=None):
seen = seen or set()
r = requests.get(site, timeout=15,
headers={"User-Agent": "Mozilla/5.0"})
urls = re.findall(r"<loc>([^<]+)</loc>", r.text)
for u in urls:
if u.endswith(".xml") and u not in seen:
seen.add(u)
seen |= get_all_urls(u, seen)
else:
seen.add(u)
return seen
# crontab:每天上午 8 点跑一次
0 8 * * * /usr/bin/python3 /opt/seo/rival_watch.py
验证脚本先拿自己站开刀:监控自己的 sitemap,发一篇新文章,第二天脚本应当准确报出那条 URL。跑顺之后再把竞品清单填进去。监控数据别只存不看:每周花十分钟过一遍新增 URL,有价值的话题进选题库(内容差距分析那篇的流水线正好接上),带外链特征的页面(合作页、专题页)顺手记进外链机会清单。情报本身不值钱,进了决策流程才值钱。
两个边界注意守住。一是频率与礼貌:一天一次足够,别把抓取频率调高到分钟级——你的监控脚本对竞品服务器就是一只小爬虫,出格了既不体面也可能触发对方封禁;UA 里老老实实写明用途,被封了就认。二是用途边界:监控的是对方公开主动广播的内容更新信号,用于选题参考和情报同步,这是行业惯例;但把监控做成镜像采集、抓正文做伪原创,就越界成了采集站,飓风算法专门收拾这类操作。工具是中性的,怎么用决定了你是情报员还是搬运工。
相关阅读:竞品情报贵在每日自动。《SEO 自动化总清单:日、周、月、季各该跑什么》把本篇脚本排在每日组的清晨位,竞品一发新文你当天就知道。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!


