告别肉肉盯盘:用终端 Agent 打造百级竞品监控流水线
本文最后更新于 2026-09-16,文章内容可能已经过时。
告别肉肉盯盘:用终端 Agent 打造百级竞品监控流水线
周一早上 9 点 15 分,工位上的咖啡还没凉,钉钉消息先炸了。
“看下这几家竞品周末改了啥,听说他们改了免费版策略,还有两家好像上了新功能,中午前拉个对比表出来。”
老板的消息言简意赅,留给你的却是一整排浏览器标签页。你点开第一家,官网改头换面,文案全换了;点开第二家,价格页的折叠菜单深藏不露;点开第三家,页面甚至用上了复杂的动态渲染,滑轮滚到底部才悠悠加载出来……
你机械地在浏览器、Excel 和两周前截取的网页长图之间疯狂切换 Alt + Tab,肉眼扫描着“原价 $29 现价 $19”究竟包含了哪些权益增减。一上午过去,眼睛干涩、头晕脑胀,好不容易拼出来的表格还遗漏了对方悄悄把“API 调用上限从 1000 次砍到 300 次”的隐蔽条款。
人肉盯盘,是许多产品经理和增长运营日常工作中最窒息的机械劳动。今天,我们要彻底终结这种低效循环,用一套不到 100 行核心代码的本地终端 Agent,在 5 分钟内完成百级竞品的全自动监控、清洗与“商业意图级”对比。
---
为什么人肉盯盘和现有 SaaS 都是死胡同?
面对竞品监控,通常有三条常见的路,但实操下来往往全是坑:
1. 纯人肉盯盘:每周耗费半天工时,极其依赖肉眼比对。一旦竞品数量超过 10 家,遗漏、看漏几乎是必然。更致命的是,人类大脑很难对“文字微调”背后的商业动作保持长期敏锐度。
2. 传统通用爬虫:写一段静态爬虫,抓取 DOM 节点存入数据库。然而现代 Web 页面充斥着 React/Vue 动态渲染、Shadow DOM 和前端反爬,任何一次页面重构都会让原本写死的 XPath 或 CSS Selector 彻底失效,维护成本极其高昂。
3. 商业级监控 SaaS:市面上动辄几千上万年费的网页监控工具,本质上只做到了“像素级变动提醒”或基础的“字符串 Diff”。只要竞品改了个 Banner 图或调整了一下页脚版权信息,就会触发刺眼的告警邮件;而当竞品偷偷调整定价阶梯时,传统字符 Diff 工具只会吐出一长串红绿相间的无意义代码重排,根本看不出核心逻辑。
我们需要的是一个能够在终端环境静默运行、具备智能解析能力的轻量 Agent:用无头浏览器直达动态渲染内容,用预设 JSON Schema 强制大模型提炼核心信息,最后通过大模型的理解力完成语义级的商业变动审计。
来看一组直观的效率与成本对比:
| 监控维度 | 传统人肉盯盘 (20个竞品) | 商业级网页监控 SaaS | 本地终端 Agent (本文方案) | | :--- | :--- | :--- | :--- | | 单次耗时 | 约 3~4 小时 | 即时告警,但需人工二次提炼 1 小时 | 自动化流水线约 3 分钟 | | 页面适应性 | 强(全靠肉眼) | 极差(改版即报误报/漏报) | 极高(大模型自适应长网页语义) | | 变动洞察深度 | 易漏掉边缘权益暗改 | 仅字符/像素级变化,噪音极大 | 商业意图级分析(功能、定价、暗改) | | 单次边际成本 | 昂贵的人力机会成本 | 昂贵的月租/年费订阅 | 仅按需消耗 Token,极低成本 |---
搭建流水线:从无头浏览器到 JSON Schema 结构化提取
构建终端 Agent 的第一步,是建立规范的数据提取流水线。我们放弃容易失效的特定 DOM 抽取逻辑,采用“无头浏览器渲染抓取全文纯文本 -> 大模型根据 Schema 提炼字段”的策略。
1. 核心抓取与结构化提取脚本
这里推荐使用 Python 配合轻量级无头浏览器工具(如 Playwright)进行动态渲染捕获,随后通过调用支持结构化输出的接口(例如 gpt-4.1-mini)提取核心资产。
以下是实现端到端抓取与提取的核心脚本:
import os
import json
import asyncio
from playwright.async_api import async_playwright
from openai import OpenAI
初始化 API 客户端,建议配置中转底座环境变量
client = OpenAI(
api_key=os.environ.get("AGENT_API_KEY"),
base_url=os.environ.get("AGENT_BASE_URL", "https://api.884819.xyz/v1")
)
定义需要严格提取的竞品信息结构
COMPETITOR_SCHEMA = {
"type": "object",
"properties": {
"product_name": {"type": "string", "description": "产品名称"},
"core_features": {
"type": "array",
"items": {"type": "string"},
"description": "核心功能点提炼"
},
"pricing_plans": {
"type": "array",
"items": {
"type": "object",
"properties": {
"plan_name": {"type": "string"},
"price": {"type": "string"},
"quota_limits": {"type": "string", "description": "额度限制/关键权益"}
},
"required": ["plan_name", "price", "quota_limits"]
}
},
"recent_updates": {
"type": "array",
"items": {"type": "string"},
"description": "页面明确标注的更新文案或最新 Banner"
}
},
"required": ["product_name", "core_features", "pricing_plans"],
"additionalProperties": False
}
async def fetch_page_clean_text(url: str) -> str:
"""使用 Playwright 捕获动态渲染后的页面可读文本"""
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
# 等待页面网络相对空闲,确保动态数据加载完成
await page.goto(url, wait_until="networkidle", timeout=30000)
# 移除 script, style 等干扰标签并获取纯文本
await page.evaluate("""() => {
const elements = document.querySelectorAll('script, style, svg, noscript');
elements.forEach(el => el.remove());
}""")
text = await page.inner_text("body")
await browser.close()
return text
def extract_structured_data(raw_text: str) -> dict:
"""调用大模型,严格按照 JSON Schema 格式化竞品要素"""
system_prompt = (
"你是一个顶尖的商业竞争情报分析师。请从抓取到的混乱网页文本中,"
"过滤所有噪点(如导航条、Cookie提示、免责声明),提炼出结构化的商业情报。"
)
# 截取安全长度以防超出窗口,模型推荐使用低成本且结构化能力极强的 gpt-4.1-mini
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"网页抓取内容如下:\n\n{raw_text[:8000]}"}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "competitor_intel",
"schema": COMPETITOR_SCHEMA,
"strict": True
}
},
temperature=0.1
)
return json.loads(response.choices[0].message.content)
这段脚本的核心绝招在于:不要教大模型怎么写正则表达式,而是用 JSON Schema 约束它的思考边界。不管是乱成一团的页脚版权声明,还是嵌套五层的复杂 Pricing 表格,大模型都能瞬间理顺并输出一份干净的标准 JSON。
---
不止是文本对比:基于语义的“商业级 Diff”生成
有了不同时间节点抓取出的两份干净 JSON,接下来的核心命题是:怎么比对?
如果你直接用传统的 git diff 或者字符串对比库,面对这种情况往往会抓狂:
- 高级版方案:每月仅需 $29,提供 50,000 次 API 调用
+
+
专业套餐
+
$29 / 月
+ 调用额度:50,000 次/月
+
哪怕商业本质完全没变,单纯的前端重构和词汇替换就会引发全量标红报警;而真正的“核心暗改”往往混在成百上千行的 Diff 噪音里,再次被人工漏掉。
引入 LLM 语义 Diff 引擎
真正有价值的对比,是让大模型理解改动背后的商业意图。
我们将两次抓取的结构化 JSON 喂给分析模型(如分析推理能力极佳的 claude-sonnet-4.6 或 gpt-4.1),并设定三段式审计提示词:
SEMANTIC_DIFF_PROMPT = """
你是一位拥有敏锐商业嗅觉的科技行业分析师。
下面给出某个竞品在【上周】与【本周】两次抓取并提取的核心结构化数据:
【上周旧数据】:
{old_data}
【本周新数据】:
{new_data}
请对比并输出一份精简、犀利的情报审计报告,必须严格包含以下三个模块:
1. 🚀【显式功能增删】:明确新增或下线的产品特性。
2. 🕵️【隐蔽暗改与权益重构】:重点排查价格变动、额度缩水、免费权益收紧等用户不易察觉的小动作。
3. 🎯【商业动机推测】:竞品此举究竟是为了降本自救、冲刺客单价,还是防范滥用?
请使用美观清晰的 Markdown 表格与要点清单输出,不要输出废话。
"""
控制台美化呈现:终端极客的从容
在终端里,我们可以结合 Python 的 rich 库,直接把大模型生成的语义对比渲染成色彩鲜明的格式化面板:
from rich.console import Console
from rich.panel import Panel
from rich.markdown import Markdown
def print_cli_report(diff_markdown: str):
console = Console()
console.print(Panel(
Markdown(diff_markdown),
title="[bold green]竞品监控情报中心 - 实时语义 Diff 审计[/bold green]",
border_style="cyan"
))
在终端敲下执行命令后,屏幕上不再是让人眼晕的红绿色代码块,而是直接跳出一份直击要害的情报报告:
🚀 显式功能增删:Pro 版本新增支持“异步批量回调”,下线“单次导出 PDF 选项”。
🕵️ 隐蔽暗改与权益重构:基础版(Free)额度由原来的50 次/天缩水至10 次/天;企业版移除了“无限制席位”标签,改为“默认含 5 个席位,超额需单独加购”。
🎯 商业动机推测:该竞品目前正在收紧免费漏斗,倒逼重度用户向付费阶梯转移;同时拆分席位以增加中大客户的客单拓展空间(Expansion Revenue)。
这种提炼能力,是任何静态监控工具或单靠人工刷页面都无法在 10 秒钟内企及的。
---
生产级落地踩坑:并发、Token 刺客与容错兜底
当你雄心勃勃地把竞品列表扩大到 50 个甚至 100 个时,实验室玩具和生产级工具的差距就会立刻显现。在实际部署这套 Agent 时,我们踩平了以下三个关键坑:
1. 长网页引发的“Token 刺客”与降噪策略
很多 SaaS 首页充斥着海量的用户评价、免责声明、FAQ 展开项。如果直接把 page.inner_text 全部一股脑灌进大模型,不仅调用耗时倍增,Token 消耗也会直线上升。
* 策略:在提取正文前,写两行预过滤规则,利用简单的 DOM 清理过滤掉包含 review、feedback、footer、legal、cookie 相关的容器类名,优先保留带有 pricing、feature、changelog 的区域。这能直接降低页面 60% 以上的无用 Token。
2. 模型偶发格式崩坏与容错重试
尽管设置了 strict=True 的 JSON Schema,网络抖动或异常阻断仍然可能导致解析失败。在工业级脚本中,一定要挂载重试装饰器:
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_extract(text: str) -> dict:
return extract_structured_data(text)
3. 多页面并发时的限流阻断
本地跑几十个 Agent 批量分析,最怕两件事:一是并发一高,官方接口直接报 429 Too Many Requests;二是折腾多款模型时需要维护一堆海外账单和复杂的网络环境。
我们在测试和生产环境中统一换成了 api.884819.xyz 作为中转底座。它支持用户名与密码直接注册,完全免去了繁琐的海外网络折腾和验证烦恼;计费采用透明的按量付费模式,没有月租或订阅绑定。
在实际调用中,我们可以将数据提取环节交给性价比极高且响应迅速的 gpt-4.1-mini,而在最终商业审计 Diff 环节无缝切换到分析理解力更强的 claude-sonnet-4.6。上百次抓取提炼的总接口花费仅在几毛钱上下,极客本地折腾或中小型团队日常生产都能做到毫无负担。
自动化作业配置
最后,只需将入口脚本封装为一个简单的 CLI 命令,并挂到本地或服务器的 crontab 定时任务中:
# 每天早上 8:30 自动执行全量竞品追踪流水线
30 8 * /usr/bin/python3 /opt/agent/monitor_pipeline.py >> /var/log/competitor_agent.log 2>&1
---
聪明的运营,都在搭建自己的系统
AI 时代,人与人的差距不在于你每天能多花两小时去刷网页,而在于谁能将重复出现的机械流程,封装成确定性运转的自动化系统。
当你还在手动截长图、对表格时,走在前面的同行已经靠着终端里的一个轻量 Agent,在上班路上喝着咖啡就扫清了所有竞品的最新底牌。这就是技术越级带来的生产力重构。
掌握了结构化数据抓取与商业级 Diff 报告之后,难道我们每天早上还要打开终端去查看这些结果吗?
下一期预告:我们将把这套终端 Agent 与飞书/企业微信的 Webhook 全面打通,并引入一个“重要更新拦截评级机制”——只有当竞品发生核心价格调整或杀手级功能发布时,才会唤醒移动端通知,打造一个不主动打扰、但永远敏锐的“个人专属智能情报哨兵”。---
本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。#AI教程 #Agent #自动化 #竞品监控 #Python #8848AI #人工智能