背景

一个小电商运营团队原本用 SaaS 服务跟踪竞品价格。后来厂商下线了他们两个目标站点,售后也联系不上了。他们想要一个自己能掌控的东西。

问题

五个目标站点里有两个改成了前端渲染,厂商那种直接抓 HTML 的方式只能拿到空页面。而且价格变动特别吵:1% 的取整差异每天都在触发报警,最后团队干脆把通知全关了。

实现与取舍

  1. 把任务拆成抓取和解析两个独立阶段,各自重试和退避。绝大多数失败是某个站点的瞬时网络问题,不是解析 bug——耦合在一起会导致一次超时就把整轮抓取全部丢掉了。
  2. 只对那两个前端渲染的站点用无头浏览器,另外三个走普通 HTTP。全部走浏览器会让运行时间和内存翻三倍,却没有任何收益。
  3. 比较前先把所有价格按当日汇率快照折算到同一基准货币,否则汇率一动看起来就像竞品调价了。
  4. 给每个 SKU 加了滚动中位数,只有偏离中位数 3% 以上才报警。这一条才是让报警重新有用的关键——在这之前团队已经把通知关了。

结果

每天跑 1800 个 SKU,耗时约四分钟。采集成本从每月 400 美元降到约 6 美元的机器费用。误报从每天大约 30 条降到每周不到 2 条,团队把通知重新打开了。

最花时间的其实不是抓取

真正耗时的是那两个前端渲染站点的解析器——第一个月坏了四次,因为对方反复改页面结构。解决办法不是写一个更聪明的解析器,而是把每次解析失败时的原始 HTML 存下来,并且连续失败三次就报警。这样页面一改,当天早上就能发现,而不是悄无声息地一直产出空价格。