如何建立价格监控系统:架构和数据管道
所有文章

如何建立价格监控系统:架构和数据管道

Ryan Turner
Ryan Turner · Head of Growth

价格监控系统是一个数据管道,它能反复从目标网站收集产品价格,将其归一化为可比较的格式,检测其变化,存储历史记录,并在价格、库存状态或广告价格规则超过您所关心的临界值时发出警报。最难的部分不是仪表盘。它们是收集层和变化检测层,前者必须经受住反僵尸防御和页面布局变化的考验,后者必须将真实的价格变动与噪音区分开来。

本指南将逐一介绍您可以构建的参考架构的各个组件、大规模运行时的故障模式,以及在哪些情况下购买而不是构建是合理的。本指南假定您是一名数据或平台工程师,以前曾刮擦过页面,现在需要在无人值守的情况下运行。

主要收获

  • 价格监控系统有七个核心阶段:配置注册表、调度程序、收集、解析、变更检测、存储和警报。每个阶段都可能独立失效,因此要对每个阶段进行检测。
  • 收集层是大多数项目的突破口。目标网站会阻止数据中心流量并提供特定地理位置的价格,因此国内住宅出口和完整页面渲染比解析器的聪明程度更重要。
  • 将价格存储为仅附加的时间序列,而不是可变的 "当前价格 "字段。变化检测和历史分析都依赖于保留每个观测值。
  • 将爬虫视为受监控的生产服务。将覆盖率、解析成功率和新鲜度作为首要指标进行跟踪,而不是事后考虑。
  • 构建协调和存储;考虑购买收集层。代理轮换和渲染是一个不断变化的目标,很少会成为你的竞争优势。

价格监控系统的实际作用

该系统按计划回答一个问题:在这个网站上,在这个市场上,这个产品现在的成本是多少?其他一切的存在都是为了使这个答案可靠、具有长期可比性和可操作性。

把工作分成几个阶段,架构自然就出来了:

A seven-stage price monitoring pipeline Each stage is a separate, observable component, not one monolithic script Config registry what to watch Scheduler when to fetch Collection layer fetch + render target pages Parsing / normalization extract price, currency, stock Change detection / dedup is this different from last? Time-series store price history Alerting drops, stockouts, MAP QA / crawler monitoring wraps every stage above
A seven-stage price monitoring pipeline: config and scheduling feed collection, parsing, and change detection, which fan out to storage and alerting, with QA wrapping the whole system.

七级价格监控流水线:配置和调度信息源收集、解析、变化检测,扇形扩展到存储和警报,质量保证包裹着整个系统。

每个阶段都会以不同的方式出错,这正是为什么要将它们作为独立的、可观察的组件,而不是一个整体脚本的原因。

参考架构的各个阶段

目标和配置注册表

首先要为监控内容建立一个单一的真相源。这是一个数据库表或配置服务,而不是一个硬编码列表。对于每个目标,存储产品标识符、URL 或 URL 模板、网站配置文件、所属市场或地理位置、预期货币、解析规则版本以及任何定价规则(最低广告价格、竞争对手映射、观察阈值)。

保持注册表与数据收集脱钩。当您加入一个新的竞争对手或新的国家时,您可以在这里添加行,然后管道的其他部分就会接收它们。这里也是产品匹配编码的地方:三个零售商的相同 SKU 需要一个稳定的内部 ID,以便日后进行同类比较。

调度员

调度程序决定何时抓取每个目标。天真的系统会在一个 cron 时间间隔内抓取所有内容;更好的系统会根据价格的波动程度以及产品对您的重要程度来改变抓取频率。竞争对手的旗舰产品可能需要每小时检查一次,而长尾产品则可以每天检查一次。

分散请求,而不是以迅雷不及掩耳之势群发请求。来自一个源头的突发流量是导致收集任务被标记的最快方法之一。对每个目标网站进行速率控制的队列,再加上间隔抖动,可以使负载保持有机状态,避免对您所依赖的网站造成冲击。

收集层

这是决定整个系统是否有效的阶段。有两种现实情况决定了这一阶段。

首先,目标网站积极打击自动收集。自动机器人流量在 2024 年十年来首次超过人类活动,达到所有网络流量的 51%。2025 Imperva 坏机器人报告.仅恶意机器人就占了 37%。零售商也看到了这些数字,因此反僵尸防御、指纹识别和挑战页面现在已成为默认设置,而不是例外。来自数据中心 IP 的普通 HTTP 客户端很快就会被拦截或被告知虚假价格。

其次,价格因地域而异。同一产品页面显示的价格、货币和可用性往往不同,这取决于请求的来源地。如果您从欧洲出口收集的是美国价格,那么您的数据就是错误的,这是任何解析器都无法弥补的。

这两种压力都指向相同的设计。您希望请求看起来是来自定价国家的真实用户,您希望页面以浏览器的方式呈现,包括 JavaScript 驱动的价格元素。在目标国家有住宅出口的设备接入网络可以解决第一个问题;而返回完全加载页面(最好是干净的 Markdown 或结构化输出)的呈现层则可以解决第二个问题。Massive 可同时提供这两种功能:跨越 195 个以上国家的住宅代理服务器(具有城市级别的地理目标),以及 Web Render API(其浏览端点可返回已渲染的页面,包括便于下游解析的 Markdown 输出)。这种组合使收集层不至于成为一个全职的反阻塞项目。

两份相关指南介绍了实际操作方法。关于在代码中提取和解析价格,请参阅如何用 Python 搜刮价格.具体到最难对付的目标之一,请参见搜索亚马逊价格而不被屏蔽.

解析和规范化

有了呈现的页面后,提取您关心的字段:价格、货币、单位、库存状态、卖方和时间戳。然后进行规范化处理。去掉货币符号和千位分隔符,转换为带有明确货币的规范数字类型,并将特定网站的库存字符串("有库存"、"仅剩 2 件"、"滞销")映射到一个小型受控词汇表中。

修订解析规则。网站会更改标记,当它们更改时,你需要知道是哪个规则版本产生了某条记录,这样你就可以隔离不良提取,而不是污染历史记录。一个好的做法是,根据自身历史记录得出的合理范围验证每个解析的价格;如果价格突然读取为昨天价值的百分之一,这几乎总是一个解析错误,而不是大甩卖。

值得警惕的故障模式是静音模式。当目标网站发布布局变化时,解析器通常不会出错;它只是开始匹配空字段,然后继续运行,好像一切正常。没有人会注意到这一点,直到数据看起来很陈旧,这也正是为什么解析成功属于你所关注的仪表盘,而不是事后阅读的日志。

重复数据删除和变更检测

大多数取数返回的价格与上次相同。将每个相同的观察结果都存储为 "变化",会导致警报和存储泛滥。计算每个观察结果(产品、网站、价格、货币、股票)的内容指纹,并将其与该目标的上次已知状态进行比较。

变化检测有两项工作。其一,判断是否有任何实质性变化:价格上涨或下跌、库存变为缺货、新卖家赢得购买框。其二,抑制噪音:一美分的四舍五入波动或网站部署期间的短暂缺货不应影响任何人。通过要求一个变化持续两次取数才算数来消除噪音,这样就能大幅减少误报。

存储:时间序列价格历史

将价格存储为仅有附加值的时间序列,每个观测点一行,绝不覆盖 "当前价格 "列。您需要每个读数,包括其时间戳、地理位置和解析版本,因为价格监控系统的价值会随着历史数据的增加而增加。趋势分析、竞争对手的反应时间和季节性都在后台目录中。

时间序列数据库或列式存储中的分区时间索引表效果很好。保持最新状态查询的快速性(从系列中派生的物化 "当前 "视图),但将其视为不可变日志的缓存,而不是记录系统。这种分离可以让下游价格情报软件层计算分析,而无需重新搜索任何内容。

警报

警报是系统赖以生存的地方。通用规则:

  • 价格变化价格:竞争对手的价格低于您的价格,或超过某个百分比临界值。
  • 缺货和补货:所关注的 SKU 断货(购买窗口信号)或复货。
  • 违反 MAP转售商:转售商的广告价格低于您的最低广告价格,这通常需要当天采取行动。

按紧急程度发送警报。违反 MAP 的警报可能会立即发送到 Slack 频道和电子邮件中,而常规的价格漂移警报则会滚动到每日摘要中。始终包含证据:捕获的价格、时间戳、地理位置以及源观察的链接,以便人工在采取行动前进行验证。

对爬虫本身进行质量保证和监控

最容易被忽视的部分是监控器。默默停止更新的价格信息比没有信息更糟糕,因为人们会一直相信它。跟踪本身就是仪表盘和警报:

  • 覆盖范围:在上一个周期中,有多大比例的注册目标返回了可用价格。
  • 解析成功率每个网站:每个网站,因此布局变化会在一个网站的数字中显示为悬崖。
  • 新鲜度:每个目标的最新观测值的年龄,当超过您的容忍度时发出警报。
  • 块速率:收集层遇到挑战或空页面的频率。

当一个零售商的解析成功率一夜之间从 99% 降到 10% 时,这就是布局偏移,你需要在一小时内知道,而不是在分析师下周发现数字过时时才知道。

规模和维护问题

有两种力量主导着在线价格监控系统的长期运行成本:网站布局漂移和阻塞。

布局漂移是不可避免的常态。目标网站会重新设计、进行 A/B 测试并重组标记。防御方法就是上述的解析版本控制和每个网站的质量保证,以及在可能的情况下建立提取器,提取稳定的信号而不是脆弱的 CSS 路径。许多零售网页以schema.org 产品/提供标记,其中价格,价格货币可用性是标准化字段,往往会在可视化重新设计后继续存在,因此阅读这些字段通常比追逐 CSS 选择器更稳定。

随着流量的增加,阻塞会变得越来越难。重试可以帮助解决瞬时故障,但对有速率限制的网站盲目重试会让情况变得更糟。使用有上限的指数式重试,旋转出口,当阻塞率上升时,按站点进行重试。将出口和渲染外包给可管理的收集层,可以吸收大部分流失,因为保持领先于反僵尸系统是提供商的全职工作,而不是你的工作。

建造与购买

所有这些都不是从零开始的。有用的拆分

  • 建设包括配置注册表、调度程序、变更检测逻辑、存储模式、警报规则和 QA 面板。这些都是您的业务逻辑和产品的编码,也是您团队的知识所在。
  • 购买或租赁收集层:收集层(住宅出口加渲染),以及可选的成品分析层。代理轮换、浏览器渲染和防拦截维护是一种 "跑步机",很少能让你与众不同。现成的电子商务价格监控工具可以覆盖整个堆栈,但你需要用灵活性和数据控制来换取速度。

一种常见的中间方案是:自己建立协调和存储系统,以便完全控制数据;租用收集层,这样就不用维护代理和渲染团队。这样既能在公司内部保留与业务相关的部分,又能卸载需要进行长期军备竞赛的部分。有关该管道的战略意义,请参阅以下支柱竞争对手价格监控.

资料来源

常见问题解答

什么是价格监控系统?+

价格监控系统是一种自动化数据管道,它按计划从目标网站收集产品价格,将其规范化并存储为价格历史记录,并在价格、库存水平或广告价格规则发生变化时发出警报。它通常跨越收集、解析、变化检测、存储和警报等阶段。

为什么收集层需要住宅代理?+

大多数零售网站都会屏蔽或误导来自数据中心 IP 范围的流量,而且许多网站会根据国家提供不同的价格。住宅代理服务器通过目标市场的真实消费设备路由请求,因此网页会显示正确的本地价格,被拦截的可能性也更小。目前,机器人占所有网络流量的一半以上,反机器人防御已成为默认设置,这使得国内住宅出口成为可靠收集的实用基准。

如何存储价格数据?+

将价格存储为只附加的时间序列,每个观测值只有一行,包括时间戳、地理位置、货币和解析版本。绝不覆盖单个 "当前价格 "字段。保留派生的当前状态视图,以便快速查找,但将不可变日志视为记录系统,以便保留完整的历史记录,用于趋势和竞争对手分析。

我应该建立还是购买价格监控系统?+

构建编码业务逻辑的部分:配置注册表、调度程序、变更检测规则、存储和警报。租用或购买收集层(住宅代理和渲染)以及可选的成品分析层,因为反拦截维护是一项持续性工作,很少能使你的产品与众不同。

网站改变布局时,如何保持解析器正常工作?+

版本化您的解析规则,根据自己的历史范围验证每个提取的价格,并监控每个站点的解析成功率,以便布局变化显示为突然下降。尽可能选择读取结构化数据或 schema.org 标记的提取器,而不是脆弱的 CSS 选择器。

Massive 为价格监控系统的收集层提供了两个最苛刻的要求:跨 195 多个国家的国内住宅出口和以干净的 Markdown 格式返回渲染页面的 Web Render API。看看 Massive 的网络如何处理价格收集工作.