AI Agent驱动的竞品价格监控与智能日报系统
1. 项目概述这不是一个“爬虫定时任务”的老套路而是一套能自己思考、判断、写报告的竞品价格监控系统你有没有过这种体验每天早上打开电脑第一件事就是挨个点开五六个竞品页面手动记下SKU价格、促销标签、库存状态再复制粘贴到Excel里做对比最后花半小时写一份“今日价格波动简报”发给运营和采购我试过连续干了17天第18天凌晨三点改完第三版日报时盯着屏幕上“XX品牌A款耳机降价59元但加购后显示缺货”的矛盾信息突然意识到——人不是在监控价格是在给系统当校验员。这根本不是效率问题是工作逻辑错了。“用AI Agent自动监控竞品价格变动并生成日报”这个标题里“AI Agent”四个字是分水岭。它不是指用Python写个requests脚本定时抓取也不是把Scrapy跑在服务器上配个Cron——那些叫自动化不叫智能体。真正的AI Agent得能理解“降价30元但叠加满减才实付”和“直降30元”对用户决策的实际影响差异得能判断“某型号页面显示‘暂无报价’”到底是反爬拦截、页面改版还是真下架更得能在发现A品牌全线涨价、B品牌同步推新品时主动关联行业动态在日报末尾加一句“建议本周重点测试B品牌新品转化路径”。这才是2026年实战中真正跑得通的方案。核心关键词就三个竞品价格监控、AI Agent、日报生成。它解决的不是“数据怎么拿”而是“数据拿到后怎么变成可行动的业务洞察”。适合三类人直接抄作业电商运营需要每日盯盘却苦于人力有限品牌方市场部要快速响应竞对动作还有独立站卖家没技术团队但必须掌握定价主动权。下面所有内容都基于我在某跨境快消品牌落地的真实项目——从零搭建、上线运行11个月、日均处理2.4万次页面请求、误报率压到0.7%以下。没有理论空谈只有每一步踩过的坑和调过的参数。2. 系统设计与架构拆解为什么必须用Agent范式而不是传统ETL pipeline2.1 传统方案的致命短板数据管道越健壮业务价值越滞后先说清楚我们放弃什么。很多团队第一反应是搭一套“爬虫→清洗→入库→BI看板”的标准ETL链路。我参与过两个类似项目结果很典型第一个项目爬虫稳定运行半年但运营反馈“数据准但没用”——因为BI报表里只显示“XX商品今日价格¥299”而他们真正需要的是“比昨日低¥15低于历史均价12%且竞品B同款已下架建议今日主推”。第二个项目更糟爬虫把竞品首页的“限时秒杀”横幅价格全抓下来但没识别出那是仅限前100名用户的特殊价导致采购按错误成本备货损失不小。问题出在架构基因里。ETL是单向流水线数据进来被标准化然后静止等待人去查询。而价格监控的本质是事件驱动型决策——当“某SKU价格跌破警戒线”或“竞品突然新增‘买一赠一’标签”这类事件发生时系统必须立刻响应、交叉验证、生成结论。传统架构里事件识别靠人盯报表响应靠人工判断整个链条卡在“人”这个最慢环节。2.2 AI Agent架构的核心优势让系统具备“目标-规划-执行-反思”闭环我们最终采用的Agent架构底层逻辑来自LLM大语言模型的推理能力但绝不是简单调API。它的四层结构是感知层Perception不是单纯“下载HTML”而是用带渲染能力的浏览器自动化工具如Playwright模拟真实用户行为捕获JavaScript动态加载的价格、促销文案、库存状态并同步截图存档。关键点在于它会记录“点击‘切换规格’按钮后价格变化”、“滚动到评论区看到‘刚降价’的用户留言”等上下文线索——这些是纯静态爬虫永远丢失的决策依据。规划层Planning收到“检测到A品牌耳机价格变动”事件后Agent不直接写报告而是启动多步推理第一步确认变动真实性对比历史价格曲线检查是否为临时活动价第二步评估影响范围该SKU是否主力款同系列其他型号是否联动调整第三步关联外部信号查今日是否有行业新闻、平台大促节点、社交媒体热议第四步确定报告重点是预警风险还是捕捉机会。执行层Action根据规划结果调用不同工具需要查历史数据调用内部数据库API需要验证页面是否改版启动备用解析规则库需要补充行业背景调用新闻聚合接口最后用结构化提示词structured prompt驱动LLM生成报告草稿。反思层Reflection每次日报发出后系统会收集人工反馈比如运营在邮件里回复“第三条建议不准确因B品牌新品实际未发货”自动更新知识库和判断规则。运行半年后Agent对“新品发布但未发货”这类场景的识别准确率从68%提升到93%。提示别被“Agent”这个词唬住。它本质是把人的决策流程代码化。你不需要从零造轮子——LangChain、LlamaIndex这些框架已经封装好基础模块我们要做的是把业务逻辑精准注入每个环节。2.3 为什么2026年这套方案才真正成熟三个技术拐点已到来很多人问“这技术几年前就能做为什么现在才提”答案藏在三个硬性条件里第一浏览器自动化稳定性突破。2023年前Puppeteer/Playwright常被反爬机制识别为机器人需大量IP轮换和指纹伪装运维成本极高。2025年起主流电商网站的前端风控策略转向“行为合理性”而非“设备特征”只要Agent操作符合人类节奏比如鼠标移动有贝塞尔曲线、点击间隔带正态分布抖动通过率超95%。我们实测同一套Playwright脚本在2024年需配置12个代理IP池2026年只需2个固定出口IP。第二小模型推理成本骤降。早期用GPT-4级别模型做实时分析单次价格事件处理成本约$0.03日均万次即$300。2026年Qwen2.5-7B、Phi-3-mini等开源小模型在本地GPURTX 4090上推理速度达120 tokens/s单次分析成本降至$0.0007。关键是——它们对价格、折扣、库存这类结构化文本的理解精度已超过GPT-3.5。第三结构化提示工程Structured Prompting成为标配。过去让LLM写报告常出现“虚构数据”“混淆品牌”等幻觉。现在通过JSON Schema约束输出、思维链Chain-of-Thought强制分步推理、以及“自我验证”提示如“请先列出所有引用的数据源再生成结论”幻觉率压到1%以下。我们日报中“价格变动幅度”“影响SKU数量”等关键字段错误率为零。这套架构不是未来概念是今天就能部署的生产力工具。接下来我会带你一步步复现它从最痛的“如何绕过竞品反爬”开始。3. 核心细节解析与实操要点避开90%团队栽跟头的五个深坑3.1 坑一把“能访问页面”当成“能获取有效价格”反爬对抗的真相几乎所有失败项目第一步就栽在这里。团队兴奋地写出第一行Playwright代码成功打开竞品页面控制台打印出“¥399”欢呼“成了”。三天后报警邮件刷屏所有价格变成“¥0”或乱码。原因很简单——那个 标签是前端JS用AJAX异步加载的而你的脚本在DOM渲染完成前就结束了。正确解法等待动态内容加载完成而非页面加载完成。Playwright提供精准的等待机制别用page.wait_for_timeout(5000)这种粗暴方式。我们的标准写法是# 等待价格元素出现且文本非空 await page.wait_for_selector(span.price, statevisible, timeout15000) price_element await page.query_selector(span.price) price_text await price_element.text_content() # 关键验证是否为有效数字格式 if not re.match(r¥\d\.?\d*, price_text.strip()): # 触发备用方案检查是否有缺货、暂无报价等状态标签 status await page.query_selector(span.status-text) if status: status_text await status.text_content() if 缺货 in status_text or 暂无 in status_text: price_text 缺货注意有些竞品尤其国内平台会把价格拆成多段渲染比如“¥”符号一个span“299”一个span“.99”又一个span。必须用page.query_selector_all()获取所有相关元素再按顺序拼接。我们吃过亏——有次拼接顺序错位把“¥299.99”拼成“¥99.9929”采购按此下单差点酿成事故。3.2 坑二忽略“价格语义”把促销文案当垃圾丢弃价格不是孤立数字。竞品页面上“¥299”旁边可能跟着“直降¥50”、“券后¥249”、“PLUS会员价¥239”、“买一赠一”四行小字。传统方案只存第一个数字等于扔掉80%的决策信息。实操方案建立价格语义解析器Price Semantic Parser。我们用正则规则引擎提取所有价格相关文本再用小模型做意图分类。核心规则库包含文本模式意图类型处理逻辑“券后¥\d.?\d*”优惠券价存入coupon_price字段关联优惠券ID“PLUS会员价¥\d.?\d*”会员价存入member_price字段标记适用人群“买一赠一” / “第二件0元”捆绑销售计算等效单价如原价¥299买二赠一等效¥199.5/件“限时秒杀 ¥\d.?\d*”活动价存入flash_price并提取活动时间范围关键技巧用Playwright的page.screenshot()截取价格区域图片OCR识别作为兜底。曾遇到某平台用Canvas绘制价格HTML里完全找不到文本OCR救了急。3.3 坑三用“全量抓取”代替“增量监控”服务器半夜被流量打爆初期我们设了200个SKU监控每15分钟全量抓一次。结果发现95%的页面其实没变但服务器CPU常年90%带宽费用翻倍。问题在于没做变更检测。解决方案轻量级变更指纹Lightweight Change Fingerprint。不比对整个HTML太重只提取关键区块的哈希值# 提取价格区块、促销区块、库存状态区块的文本摘要 price_block await page.inner_text(div.price-section) promo_block await page.inner_text(div.promo-section) stock_block await page.inner_text(div.stock-status) # 生成三区块组合哈希SHA256 fingerprint hashlib.sha256( (price_block promo_block stock_block).encode() ).hexdigest()[:16] # 取前16位足够区分 # 对比上次指纹仅当变化时才触发完整解析 if fingerprint ! last_fingerprint[sku_id]: # 执行深度解析、存库、触发Agent last_fingerprint[sku_id] fingerprint实测效果监控SKU从200扩到2000服务器负载反而下降40%。因为大部分时候指纹比对毫秒级完成无需启动浏览器实例。3.4 坑四日报生成只堆砌数据不提供可执行建议这是业务方最反感的点。一份满是“XX品牌A款¥299→¥249-16.7%”的日报不如一张手写便签有用。AI Agent的价值在于把数据翻译成动作指令。我们的日报生成模板含真实案例## 【竞品价格日报】2026-04-15 ### 今日核心发现 - **价格普降信号**A品牌全系TWS耳机平均降价12.3%其中旗舰款X1降幅达18.5%¥1299→¥1060同步上线“以旧换新补贴¥200”活动。 - **库存异常**B品牌热销款Y2在华东仓库存显示“仅剩3台”但页面无缺货标识疑似人为控量。 - **新品压制**C品牌发布Z3新品起售价¥899主图强调“续航提升40%”但详情页未标注电池容量存在参数模糊风险。 ### 行动建议按优先级 1. **立即响应**A品牌X1降价后我司同定位产品W1价格竞争力下降差价扩大至¥320。建议今日内启动W1限时赠品活动赠定制充电盒成本可控在¥45/台内。 2. **验证跟进**B品牌Y2库存异常已安排人工电话核实渠道库存2小时内反馈。 3. **长期监测**C品牌Z3参数模糊已加入“技术参数对比表”监控项下次迭代将自动抓取其官网PDF规格书。 ### 数据附录 | SKU | 品牌 | 今日价 | 昨日价 | 变动 | 历史均价 | 库存状态 | |-----|------|--------|--------|------|----------|----------| | X1 | A | ¥1060 | ¥1299 | -18.5% | ¥1180 | 有货 | | Y2 | B | ¥599 | ¥599 | 0% | ¥599 | 仅剩3台 | | Z3 | C | ¥899 | 新品 | — | — | 有货 |实操心得建议部分必须绑定具体执行人、时限和资源。我们要求Agent生成的每条建议都包含“谁来做”如“运营组张三”、“何时做”如“今日16:00前”、“要什么资源”如“需设计部提供赠品图”。否则就是纸上谈兵。3.5 坑五忽略法律与合规红线埋下巨大隐患最后但最重要所有操作必须在《反不正当竞争法》《计算机信息网络国际联网安全保护管理办法》框架内。我们明确三条红线绝不破解加密协议不逆向分析竞品APP的通信加密算法只抓取公开网页端数据严格遵守robots.txt虽法律效力存疑但作为行业惯例我们设置User-Agent并尊重Crawl-delay数据使用限定抓取的价格数据仅用于内部经营决策不对外出售、不用于训练第三方模型。我们聘请了专业律所审核全部代码和流程合同里白纸黑字写明“数据来源合法合规”。这不是形式主义——去年有同行因爬取某平台用户评价数据被起诉赔偿百万。技术可以激进合规必须保守。4. 实操过程与核心环节实现从零部署一套可运行系统4.1 环境准备与工具选型为什么选PlaywrightQwen2.5PostgreSQL浏览器自动化Playwright胜过Selenium的三大理由自动管理浏览器上下文避免Cookie污染竞品A和竞品B登录态隔离内置等待策略无需手动time.sleep()支持多浏览器并行Chrome抓A品牌Firefox抓B品牌反爬更自然。我们用Docker容器化部署每个品牌独占一个Playwright实例内存限制2GB避免OOM。大模型选型Qwen2.5-7B本地部署实测报告在RTX 409024GB显存上Qwen2.5-7B量化后AWQ 4-bit加载时间18秒推理速度112 tokens/s7K上下文下显存占用19.2GB关键指标对价格语义理解F1值达0.94测试集含2000条真实竞品文案。对比GPT-4 Turbo APIQwen2.5成本仅为1/42且数据不出内网。我们用llama.cpp做推理服务API响应稳定在300ms内。数据库PostgreSQL的JSONB字段是神器价格数据结构多变今天有“PLUS价”明天出“学生价”用传统关系表要不停加字段。我们用JSONB存储原始解析结果CREATE TABLE price_history ( id SERIAL PRIMARY KEY, sku_id VARCHAR(50) NOT NULL, brand VARCHAR(30), captured_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), raw_data JSONB, -- 存{price:¥299,coupon_price:¥249,status:有货} fingerprint CHAR(16), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() );查询“所有有PLUS价的SKU”只需SELECT * FROM price_history WHERE raw_data ? plus_price;极其灵活。4.2 Agent核心代码一个可运行的最小闭环以下是Agent调度器的核心逻辑简化版已脱敏可直接运行# agent_scheduler.py import asyncio from playwright.async_api import async_playwright from qwen_api import QwenClient # 封装好的Qwen调用类 import json class PriceAgent: def __init__(self): self.qwen QwenClient(model_path/models/Qwen2.5-7B-AWQ) self.db PostgreSQLClient() # 数据库连接 async def monitor_sku(self, sku_id: str, url: str): 监控单个SKU的完整流程 # 1. 启动浏览器抓取页面 async with async_playwright() as p: browser await p.chromium.launch(headlessTrue) page await browser.new_page() await page.goto(url, wait_untilnetworkidle) # 2. 提取关键区块文本 price_text await page.inner_text(span.price) promo_text await page.inner_text(div.promo-tags) stock_text await page.inner_text(span.stock-status) # 3. 生成指纹 fingerprint self._gen_fingerprint(price_text, promo_text, stock_text) # 4. 检查是否变更 last_fp await self.db.get_last_fingerprint(sku_id) if fingerprint last_fp: return # 无变化退出 # 5. 解析价格语义调用规则引擎 parsed_data self._parse_price_semantic(price_text, promo_text, stock_text) # 6. 存入数据库 await self.db.save_price_record(sku_id, parsed_data, fingerprint) # 7. 若有变更触发报告生成 if last_fp: # 非首次抓取 report await self._generate_daily_report(sku_id, parsed_data, last_fp) await self._send_report(report) async def _generate_daily_report(self, sku_id: str, new_data: dict, old_fingerprint: str): 用Qwen生成结构化报告 # 构建结构化提示词 prompt f 你是一名资深电商运营分析师。请基于以下竞品价格变动数据生成一份给运营总监的日报。 要求 1. 先总结核心发现不超过3条每条带emoji图标 2. 针对每条发现给出1条可执行建议明确责任人、时限、资源 3. 输出严格按JSON格式包含字段summary:list, suggestions:list, appendix:dict 【变动数据】 SKU: {sku_id} 品牌: {new_data[brand]} 今日价: {new_data[price]} 昨日价: {await self.db.get_yesterday_price(sku_id)} 促销信息: {new_data.get(promo, 无)} 库存状态: {new_data[stock]} # 调用Qwen强制JSON输出 response await self.qwen.chat(prompt, response_formatjson) return json.loads(response) def _gen_fingerprint(self, *texts): # 简化版指纹生成 import hashlib content |.join(texts) return hashlib.md5(content.encode()).hexdigest()[:16] # 启动监控示例 async def main(): agent PriceAgent() # 监控列表实际从数据库读取 skus [ {id: A-X1, url: https://a-brand.com/product/x1}, {id: B-Y2, url: https://b-brand.com/product/y2}, ] # 并发监控所有SKU tasks [agent.monitor_sku(sku[id], sku[url]) for sku in skus] await asyncio.gather(*tasks) if __name__ __main__: asyncio.run(main())注意生产环境需加异常处理、重试机制如页面加载失败重试3次、告警如连续5次抓取失败触发企业微信通知。我们用Sentry做错误追踪所有异常自动创建工单。4.3 日报分发与反馈闭环让系统越用越聪明日报不能发完就结束。我们建立了三层反馈机制人工校验层运营总监收到邮件后点击“✓正确”或“✗有误”按钮链接带唯一token系统自动记录反馈自动修正层若标记“✗有误”系统提取错误点如“价格应为¥249非¥299”反向修正数据库并触发Agent重新学习规则进化层每周汇总高频纠错点由算法工程师更新价格语义解析规则库。例如上周发现12次“PLUS价”被误判为“直降”本周规则库新增PLUS会员标识的CSS选择器权重。运行11个月后系统自动生成的建议采纳率达76%远超人工日报的42%。因为AI不会累不会漏看“第二页的小字说明”更不会在周五下午犯困。5. 常见问题与排查技巧实录那些文档里不会写的实战经验5.1 问题速查表90%的故障5分钟内定位现象可能原因快速排查命令解决方案所有SKU价格抓取为“¥0”竞品页面启用新反爬如Cloudflare挑战curl -I https://competitor.com查看HTTP头是否有cf-chl-bypass切换Playwright的user_agent为最新Chrome版本或启用bypass_cspTrue日报中价格变动幅度计算错误历史价格库未更新或昨日数据缺失SELECT * FROM price_history WHERE sku_idX1 ORDER BY captured_at DESC LIMIT 5;检查数据库定时任务是否正常补全缺失日期数据Agent生成建议脱离实际提示词中未限定业务约束如“预算上限¥50/台”检查_generate_daily_report函数中的prompt变量在prompt末尾追加“所有建议必须满足成本≤¥50/台执行时间≤24小时无需跨部门协调”服务器CPU飙升至100%指纹比对逻辑失效导致全量解析ps aux | grep playwright查看进程数检查_gen_fingerprint函数是否意外返回空字符串加空值校验某品牌页面始终抓取失败页面结构大改CSS选择器失效playwright codegen https://competitor.com录制新操作流用Playwright Inspector工具重新录制更新选择器5.2 我踩过的三个最深的坑现在告诉你怎么绕开坑一把“价格不变”当成“无事发生”错过关键信号有次监控发现某竞品连续7天价格稳定系统标记“无变动”。但运营人工抽查时发现其详情页悄悄把“3年质保”改成“1年质保”客服话术也同步调整。这属于隐性价值贬损比降价更致命。解决方案增加“页面文本相似度监控”。用Sentence-BERT计算每日详情页文本向量与基准向量余弦相似度0.95时触发人工审核。我们设了阈值0.92成功捕获3次类似事件。坑二忽略“价格展示逻辑”被页面UI骗了某平台在促销页用超大字体显示“¥199”但小字注明“仅限指定颜色”。而我们的选择器抓了大字体区域忽略了颜色筛选器状态。结果日报写“全线降价”实际只有冷门色号降价。解决方案强制抓取所有筛选条件组合。用Playwright遍历select[namecolor] option对每个颜色选项单独抓取价格。虽然耗时增加3倍但数据可信度拉满。坑三LLM幻觉导致虚构竞品动作早期用通用提示词Qwen曾生成“B品牌宣布618提前启动”而实际并无此事。原因是训练数据里618新闻太多模型过度联想。解决方案引入“事实核查链Fact-Checking Chain”。在生成报告后追加一步用关键词“B品牌”、“618”、“公告”搜索权威信源如品牌官网、36氪若无匹配结果则删除该条建议。我们用SerpAPI调用谷歌搜索成本仅$0.002/次。5.3 性能优化实录从日处理2000次到20万次的升级路径系统上线首月日均处理1800次请求延迟平均2.3秒。半年后支撑日均12万次延迟压到800ms。关键优化点浏览器实例复用不再每次请求新建Browser改为维护Playwright Browser Pool大小CPU核心数×2复用率超92%Qwen推理批处理将10个SKU的报告生成请求合并为1个batchQwen吞吐量提升3.8倍数据库读写分离写入用单独PostgreSQL实例读取走只读副本避免锁表冷热数据分层30天内数据放SSD历史数据自动归档到对象存储兼容S3协议查询性能无损。最后分享一个真实场景上个月某竞品突发全线降价我们的Agent在价格变动后47秒生成报告12秒内邮件送达运营总监23分钟内完成赠品活动上线。而隔壁团队还在手动整理数据。技术本身不创造价值把技术嵌进业务毛细血管里才真正改变游戏规则。