Scarnox · Blog

网页抓取价格监控:实用指南

价格监控是指按计划检查一组网站上某个商品的价格,并记录下所见内容,以便随时间进行比较。零售商、电商平台和分析人员都会使用它。价格抓取也是爬虫最常遇到验证码的场景之一,因此值得把设计做好。本指南涵盖监控什么、如何从从未设计为被解析的页面中提取数字、如何存储和触发提醒,以及在这样做的同时如何遵守网站的规则。

从你有权使用的数据源开始

在编写任何代码之前,先检查网站是否提供官方的数据获取方式:商品数据源、API 或合作伙伴计划。这些方式比抓取更可靠,并且能去除大部分法律和技术风险。只有在公开页面没有官方途径时,才把抓取作为备选方案,而且条款和 robots.txt 仍然适用。法律概述涵盖了一般性问题。

五个组成部分的架构

一个可靠的监控系统有五个组成部分。把它们分开,更便于调试:

  1. 调度器。 决定访问哪些商品页面,以及何时访问。请把访问分散到一天中的不同时段,而不是在同一分钟检查所有页面。
  2. 抓取器。 下载页面,并控制访问节奏、重试和缓存。
  3. 解析器。 提取价格、货币上下文和库存状态。
  4. 存储。 保存每一次观测结果并带上时间戳,形成历史记录。
  5. 提醒器。 将新值与上一个值比较,当它越过你设定的阈值时通知你。

从杂乱的页面中解析价格

价格的呈现形式多种多样:带千位分隔符、带小数逗号、前面有标签,或者被拆分到多个元素中。请保持解析器小巧,并用真实示例进行测试。下面的版本假设采用常见格式,即逗号作千位分隔、句点作小数点。调用前请先把其他格式标准化:

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """返回文本中的第一个数字(Decimal 类型),找不到则返回 None。"""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

凡是需要比较或求和的数值,都使用 Decimal 而不是 float。浮点舍入可能让两个相等的价格看起来不同。把原始文本和解析后的值一起保存,这样以后修复解析器的 bug 时,就不必把每个页面重新抓取一遍。

存储历史并检测变化

单个价格只是一个快照。监控的价值在于历史记录。每次观测存储一行,包含商品 ID、来源、时间戳、解析后的值和原始文本。然后提醒就只是与上一行做一次简单比较。只针对有意义的变化发出提醒,例如降幅超过设定的百分比,或商品缺货,这样你就不会被噪声淹没。

处理变体和套餐

一个商品页面通常会显示多个价格:每个尺码或颜色一个价格、套装价格、会员价,或者只有在选择某项之后才出现的价格。在开始构建之前,先决定监控应该记录什么。常见做法是把变体标识符与价格一起存储,这样某个尺码的变化就不会被误认为整个商品的变化。对于“起价”和被划掉的原价要格外小心,因为解析器如果抓错了数字,就会产生误报。请把每个数值旁边的标签文本一并存储,这样当提醒看起来不对时,你可以核对当时读到的内容。

礼貌地安排调度

根据价格实际变动的频率,为每个商品设置检查间隔。每天都变化的商品,不需要每小时检查一次。对每次访问加入随机抖动,限制每个网站每小时的请求数量,并在所选间隔内缓存结果。这些习惯能让你的负载保持较低,数据也更加一致。

页面拦截你时

价格页面是自动化访问的常见目标,因此你可能会遇到封锁、速率限制或验证码。看到 429 或 503 时要退避,对于持续拒绝你的网站则应停止访问。如果在你获准自动化的页面上出现验证码,Scarnox 目前上线的验证码类型是 PopularCaptcha。PopularCaptcha Python 指南展示了 token 的流程。在增加更多机制之前,请先阅读抓取时如何不被封禁,因为控制访问节奏通常比任何额外工具都更能解决问题。

有些页面的价格是通过 JavaScript 渲染的。对于这类页面,请参阅抓取 JavaScript 网站中的方法。

负责任地抓取

下一步

免费试用额度,无需信用卡:注册账户,在你获准自动化的页面上试用 PopularCaptcha 流程。当前费率请查看定价页面。