电商数据抓取项目最常见的失败,并不是请求发不出去,也不是解析器写错了,而是开发团队花了两周抓回几十万条商品记录,业务方却发现这些数据无法回答“竞品什么时候降价”“类目价格带是否变化”“哪些商品真的缺货”这类问题。采集不是把页面上的字段搬进数据库,而是把一个业务判断拆解成可验证的数据目标。应用分析决定要回答什么问题,采集目标决定要拿到哪些数据,技术任务则决定这些数据如何稳定、合规地被获取。
本文从开发人员实际做需求评审的视角,讲清应用分析、分析指标、采集字段、时间粒度、更新频率和验收标准之间的关系。文中的案例数据分为两类:公开规则和方法依据会明确标注来源;项目中的对比数字则标注为“情景模拟”或“样本推演”,用于展示设计逻辑,不冒充行业统计。
业务方说“把某平台商品数据抓下来”,这句话在技术上几乎没有可执行性。它没有说明采集对象是商品还是 SKU,没有说明需要当前值还是历史变化,没有说明结果用于报表、告警还是模型,也没有说明多长时间更新一次才算及时。
我在评审这类需求时,通常先把“抓取任务”改写成一句业务语言:谁要基于哪些数据,在什么时间内,做出什么判断或动作?如果这句话无法写出来,项目就不应直接进入爬虫开发阶段。
例如,“监控竞品价格”至少可以进一步拆成三种完全不同的应用:
这三个目标看起来都叫“价格监控”,但它们需要的时间精度、历史保存方式、任务频率、告警逻辑和数据成本完全不同。第一个目标可能只需要每日快照,第二个目标需要高频变化检测,第三个目标则更重视长期稳定性和口径一致性。
应用分析回答“数据拿来做什么”。它包括使用者、业务问题、分析指标、决策动作和时效要求。
采集目标回答“为了支持这个应用,必须拿到哪些数据”。它包括对象、字段、范围、时间窗口、更新频率、精度、历史留存和合规边界。
采集任务回答“工程系统如何把目标实现出来”。它包括数据源、访问方式、解析、调度、重试、去重、存储、质量检查、监控和输出。
| 层次 | 核心问题 | 典型产物 | 常见责任人 |
|---|---|---|---|
| 应用分析 | 数据支持什么判断或动作 | 业务问题、指标定义、决策时效 | 业务负责人、数据产品、分析人员 |
| 采集目标 | 需要哪些对象、字段和历史记录 | 字段清单、数据范围、快照策略 | 数据产品、分析工程师、开发人员 |
| 采集任务 | 如何稳定地获取和交付数据 | 调度方案、存储模型、质量规则 | 后端、爬虫、数据工程团队 |
这三个层次不能倒置。直接从采集任务开始,往往会出现“技术完成、业务失败”:接口通了、数据落库了、任务也显示成功了,但关键字段没有时间戳,或者商品详情和 SKU 维度没有对应关系,最终无法支撑原本的分析目标。

我常用一个简单的判断方式:采集目标清晰度 = 对象明确度 × 指标可计算度 × 时间可追溯度 × 输出可验收度。这不是行业标准公式,而是需求评审中的实用检查框架。
只要其中一个维度接近零,整体目标就会失效。比如采集了商品价格,却没有商品唯一标识,无法稳定追踪同一商品;采集了当前库存,却没有采集时间,无法判断缺货发生在什么时候;采集了销量,却没有记录平台口径,无法直接比较不同平台的数据。
因此,“字段很多”不代表目标清楚。真正重要的是,每个关键字段是否能对应一个分析指标、一个业务问题或一个后续动作。
“全量抓取”听起来很专业,实际上常常是一个没有经过成本评估的口号。全量可能指全平台、全类目、全店铺、全部商品,也可能只是业务方希望“不要漏掉重点商品”。如果没有定义范围,开发人员只能按最大范围估算资源。
一旦任务范围扩大,存储、请求量、失败重试、数据清洗和后续维护成本都会同步增加。更麻烦的是,大量低价值数据会稀释真正需要监控的对象,导致告警噪声和分析性能同时恶化。
在需求会上,我会让业务方把商品范围分成三层:重点对象、观察对象和探索对象。重点对象用于实时或高频应用,观察对象可以按日或按周更新,探索对象则可以使用低频抽样。这样做比一开始承诺“全量”更容易控制项目边界。
页面上展示什么,不等于业务上需要什么。商品详情页可能有标题、主图、卖点、评价、价格、原价、规格、物流说明和促销文案,但不同字段的稳定性、可比性和分析价值差异很大。
以价格分析为例,页面上的“到手价”可能受优惠券、会员等级、满减门槛或地区条件影响。如果开发人员只抓一个名为“价格”的字段,后续很可能把标价、活动价和计算后的到手价混为一谈,得到一个看似完整、实际无法复核的价格数据集。
更稳妥的做法是把事实字段和派生字段分开。商品页面展示的原价、活动价、促销标签和采集时间属于事实字段;价格变化率、折扣幅度和价格排名属于基于事实字段计算的派生字段。
很多早期采集项目使用一张商品表,每次任务运行就用新值覆盖旧值。这种设计对“查看当前价格”没有问题,但对趋势、变化、告警和复盘几乎不可用。
如果今天看到商品价格是 199 元,数据库却没有昨天、上周和上个月的记录,那么你无法判断它是长期稳定在 199 元,还是刚刚从 299 元降下来。更无法判断这次降价是否与促销活动、库存状态或竞品动作同步发生。
只要需求里出现“趋势”“变化”“波动”“恢复”“连续”“同比”“环比”这些词,就应该默认需要历史快照或变更记录,而不是只保存当前状态。
商品页面访问失败,不一定意味着商品下架;接口返回空字段,不一定意味着库存为零;页面结构变化,也不一定意味着商品信息发生变化。若没有区分业务状态和采集状态,告警系统会把大量技术问题推给业务人员。
我建议至少拆分两类状态。第一类是业务状态,例如在售、下架、缺货、预售和不可购买;第二类是采集状态,例如请求超时、解析失败、权限不足、字段缺失和页面结构异常。
| 观察结果 | 可能的业务含义 | 可能的技术含义 | 处理建议 |
|---|---|---|---|
| 页面无法打开 | 商品下架或链接失效 | 网络超时、访问受限、页面变更 | 重试并结合连续任务结果确认 |
| 库存字段为空 | 无库存或页面不展示库存 | 解析路径失效、接口未返回 | 保存原始响应状态,不直接写入“缺货” |
| 价格变为零 | 商品免费或促销异常 | 字段解析失败、占位值、接口异常 | 设置价格范围和异常比例校验 |

在很多项目中,会议一开始就会讨论浏览器自动化、接口调用、代理池、任务队列和数据库选型。这些话题当然重要,但如果商品范围、字段口径和更新频率没有确定,工具讨论只是在提前优化一个尚未定义的系统。
工具选择应当服从四个条件:数据源访问方式、数据规模、更新时效和维护能力。一次性的低频盘点不需要和持续监控使用同样复杂的工程架构;需要长期运行的任务,也不能只依赖一次性脚本。
我建议用“判断,动作”而不是“字段,页面”来开启需求讨论。比如,不要写“抓竞品价格”,而要写“识别重点 SKU 在指定时间窗口内的有效降价,并通知采购人员复核是否调整采购价”。
这句话已经包含了几个重要条件:对象是重点 SKU,事件是有效降价,时间窗口需要被记录,结果不是一张静态表,而是通知和复核动作。
还可以把应用问题写成以下格式:
业务语言通常不能直接驱动采集。比如“监测热销商品”需要进一步定义“热销”到底是销量高、销量增长快、评价多、排名靠前,还是多个条件的组合。
指标定义必须包括计算口径。以“降价”这一指标为例,至少要说明比较的是原价与活动价,还是本次采集值与上次有效值;是否排除优惠券影响;同一商品不同 SKU 是否分别比较;价格变化达到多少才触发告警。
| 业务判断 | 可计算指标 | 必需字段 | 容易遗漏的口径 |
|---|---|---|---|
| 竞品是否降价 | 有效价格变化率 | 商品 ID、SKU、当前价、历史价、时间 | 标价、活动价、到手价是否混用 |
| 类目是否扩张 | 有效商品数变化率 | 类目、商品 ID、商品状态、时间 | 下架商品是否仍计入分母 |
| 商品是否恢复销售 | 可购买状态变化 | 页面状态、库存状态、采集结果、时间 | 访问失败能否视为不可购买 |
| 内容是否发生变化 | 字段差异率或版本变化 | 标题、详情摘要、图片地址、版本时间 | 动态推荐文案是否被排除 |
当指标定义完成后,采集字段通常会明显减少,但关键字段会更准确。好的采集方案不是让字段越来越多,而是让每个关键指标都能被稳定复算。
电商数据最容易被忽视的设计问题,是对象层级。商品、SPU、SKU、店铺、类目和页面并不是同一个对象。如果把不同层级的数据混在一张表里,后续聚合时很容易重复计算。
例如,一个商品有 12 个 SKU,页面可能展示一个商品标题和多个规格价格。如果业务要分析最低可售价格,应该明确价格是商品级、SKU 级还是页面展示级;如果业务要分析库存,则必须尽量下沉到 SKU 级,否则一个 SKU 缺货、另一个 SKU 有货时,商品级“有货”会掩盖真实情况。
我通常会先画出最小对象关系:
如果需求只看店铺级趋势,就不必为每个页面字段建立高频任务;如果需求关注 SKU 级价格和库存,就不能用商品级记录替代。粒度决定存储量,也决定分析结论是否可信。
采集频率不是越高越好。真正的设计问题是:业务状态变化的速度有多快,决策可以承受多长延迟,数据源允许多大访问压力,系统能够承担多少运行成本。
如果一个类目每周才需要一次趋势判断,每 10 分钟抓取一次并不会让结论更准确,反而会增加重复数据、失败重试和数据清洗成本。相反,如果目标是识别限时促销,日级快照可能已经错过业务动作。
| 应用类型 | 典型时效 | 建议数据策略 | 主要取舍 |
|---|---|---|---|
| 市场盘点 | 一次性或周级 | 按范围采集并保留任务批次 | 成本低,但不适合捕捉短期变化 |
| 竞品价格趋势 | 日级或小时级 | 定时快照,保留历史版本 | 频率与趋势精度需要平衡 |
| 促销变化监控 | 分钟级或小时级 | 重点 SKU 高频采集,非重点对象低频采集 | 及时性高,但运行和维护成本增加 |
| 商品状态监控 | 小时级或日级 | 状态快照加连续失败确认 | 要避免把技术失败误判为下架 |

快照表适合回答“某个时间点是什么状态”,变更表适合回答“什么时候发生了什么变化”。两者不是互相替代的关系。
对价格、库存和上下架状态这类变化频繁但字段较少的数据,可以保存当前状态加变更日志;对商品详情、类目结构和营销内容这类需要定期复盘的数据,通常需要保留周期快照。若只保存变更,遇到解析异常或某次变更漏采时,完整状态可能无法还原。
一种比较稳妥的设计是:
如果采集结果最终要进入数据看板或分析平台,就应在需求阶段明确连接方式和输出结构,而不是等抓取完成后再想办法导出。以九数云这类数据分析平台为例,真正重要的不是“能不能把文件上传进去”,而是数据是否具备稳定的主键、时间字段、指标口径和更新方式。
九数云官网公开定位是面向业务数据分析和可视化应用的平台,官网地址为 https://www.jiushuyun.com。在实际设计中,可以把采集系统输出的商品、SKU、店铺、类目和时间快照整理成结构化数据,再交给分析平台制作趋势、对比和异常看板。
这里有一个经常被忽略的前提:分析平台能否正常展示,不代表采集目标设计正确。如果每天导入的数据没有统一的日期字段,价格趋势就无法按时间展开;如果同一 SKU 没有稳定标识,重复导入后就无法区分新增、更新和重复记录;如果“销量”口径没有被记录,跨平台看板可能会制造错误的横向比较。
假设某零售团队希望监控 1000 个竞品 SKU,目标是发现有效降价后提醒采购人员。这个需求的关键并不是抓多少页面,而是定义“有效降价”是什么。
如果只采集商品标题和当前展示价格,系统无法判断价格对应哪个 SKU,也无法区分原价、促销价和到手价,更无法知道价格是在什么时候变化的。最终看板可能看起来很整齐,但告警结果经不起复核。
至少需要考虑以下字段:
| 字段 | 作用 | 是否建议必填 | 设计注意点 |
|---|---|---|---|
| 平台商品 ID | 定位商品主体 | 是 | 不要只依赖标题或 URL |
| SKU ID | 区分规格和交易单元 | 视业务而定 | 价格和库存分析通常需要 |
| 当前展示价 | 还原页面当时价格 | 是 | 记录币种和价格类型 |
| 原价或划线价 | 计算促销展示差异 | 视业务而定 | 不能默认等于历史最高价 |
| 促销标签 | 解释价格变化原因 | 建议 | 文本标签需保留原始值 |
| 采集时间 | 支持历史比较和告警 | 是 | 使用统一时区和时间格式 |
| 采集状态 | 区分业务变化和技术失败 | 是 | 与商品销售状态分开保存 |
在告警层面,我不会把单次价格差异直接定义为降价。更稳妥的规则是:同一 SKU 在两次有效采集中价格发生变化,且数据质量校验通过,变化幅度超过业务阈值,连续一次或两次得到确认后才触发告警。
例如,当前价格从 219 元变为 199 元,理论变化率为 -9.13%。但如果本次页面解析缺失促销字段,或者请求结果被判定为异常,就不应直接通知采购。告警的准确性依赖采集状态、价格口径和历史对照,而不是依赖一个价格字段。

另一个常见需求是分析某个类目的商品数量、价格带和店铺结构。很多团队会直接抓取类目列表,然后统计页面上出现了多少商品。这个做法看似简单,但很容易受到分页规则、重复商品、下架商品和排序变化影响。
要做类目趋势,至少需要保留类目路径、商品唯一标识、店铺、价格、商品状态、采集批次和时间快照。对于销量、评价、热度或排名等平台展示指标,还要记录字段来源和业务口径。
例如,同一个商品可能同时出现在“新品”“热销”和“某细分类目”页面。如果没有商品 ID 去重,商品数量会被重复计算。又比如,某平台的“月销”可能是滚动口径,另一个平台的“销量”可能是累计口径,两者不能直接放在一张图上比较。
我在设计这类分析时,会把“页面出现次数”和“有效商品数”分开。前者用于评估采集覆盖,后者用于业务分析。有效商品数必须经过去重、状态筛选和时间批次确认,不能简单等于抓到的记录行数。
如果使用九数云这类分析工具制作类目看板,建议将原始采集表、标准化商品表和指标汇总表分层管理。原始层保留来源值,标准化层统一字段类型和主键,汇总层再计算价格带、店铺数量和商品状态比例。这样当业务方质疑某个数字时,可以回溯到具体商品和采集批次。

商品状态监控通常比价格监控更容易产生误报,因为“访问不到”在技术上很常见,在业务上却可能有多种解释。页面跳转、地区限制、短时超时、登录状态变化和接口调整,都可能造成一次失败。
我建议把状态判定设计成一个多次确认流程:
如果业务目标是补货或采购判断,缺货状态的准确性可能比页面变化提醒更重要;如果目标是竞品监控,商品下架可能比短期缺货更值得关注。应用不同,状态模型也应不同。
| 状态类型 | 是否属于业务状态 | 是否可直接触发业务告警 | 建议确认方式 |
|---|---|---|---|
| 明确下架 | 是 | 连续确认后可以 | 页面提示、商品状态字段和重复采集交叉确认 |
| 暂时缺货 | 是 | 视业务规则而定 | 库存状态和可购买按钮共同判断 |
| 请求超时 | 否 | 不应直接触发 | 重试、记录错误码并进入技术监控 |
| 解析失败 | 否 | 不应直接触发 | 字段完整率和页面结构检测 |
如果目标是监测商品详情或营销内容变化,直接比较整页 HTML 往往会产生大量无意义差异。推荐模块、广告、时间戳、追踪参数和动态文案都可能改变页面内容,但并不代表商品核心信息发生变化。
更合适的做法是先定义“业务关注字段”,例如标题、规格说明、核心卖点、主图地址、售后承诺和活动标签。对这些字段进行标准化后,再计算字段级差异,并保存变化前值和变化后值。
内容分析的另一个关键是版本时间。页面当前文本只能说明“现在是什么”,不能说明“什么时候改过”。如果业务要复盘一次促销活动的文案变化,就必须将内容版本和价格、活动时间放在同一时间轴上。
一页纸不是把所有需求压缩成几句话,而是用固定结构消除歧义。建议至少包括以下内容:
| 需求模块 | 必须回答的问题 | 示例 |
|---|---|---|
| 应用目的 | 数据支持什么判断 | 发现重点 SKU 的有效降价 |
| 使用角色 | 谁查看或接收结果 | 采购负责人、运营负责人 |
| 数据对象 | 商品、SKU、店铺还是类目 | 重点店铺下的 SKU |
| 时间要求 | 结果允许多大延迟 | 平均不超过 6 小时 |
| 输出方式 | 报表、接口还是告警 | 看板加异常通知 |
| 验收标准 | 怎样算任务完成 | 关键字段完整率、重复率和时效达标 |
这张表的价值在于,它把“抓商品”变成了可以被产品、开发和业务共同确认的合同。任何未填写的单元格,都是后续争议的潜在来源。
字段清单不要只写字段名。至少要增加业务含义、数据类型、来源位置、是否必填、允许为空的原因、更新方式和对应指标。
| 业务问题 | 分析指标 | 原始字段 | 派生字段 | 输出形式 |
|---|---|---|---|---|
| 竞品是否降价 | 价格变化率 | SKU、展示价、采集时间、促销标签 | 变化金额、变化率、告警等级 | 异常通知、趋势图 |
| 类目供给是否变化 | 有效商品数、在售占比 | 类目、商品 ID、商品状态、时间 | 商品数变化率、状态结构 | 周期看板 |
| 商品是否恢复销售 | 状态恢复时长 | 可购买状态、库存状态、采集状态 | 不可售时长、恢复时间 | 运营提醒 |
如果一个字段无法对应任何指标、筛选条件、解释维度或审计需求,就要重新评估是否值得采集。不是所有页面上的信息都值得承担长期维护成本。
采集任务成功,不等于数据可用。一个 HTTP 请求返回 200,可能仍然得到空页面、登录页、验证码页或结构错误的内容。因此验收需要从任务成功率扩展到字段质量和业务可用性。
建议至少定义以下质量指标:
不同字段的阈值不应一刀切。例如标题缺失可能影响内容分析,但不一定影响价格监控;价格缺失对价格告警是致命问题,却不一定影响店铺数量统计。质量标准必须和应用目标绑定。

“数据要准确”“尽量实时”“不要漏数据”都不能直接验收。应改写成包含对象、口径、阈值和时间范围的句子。
如果业务方无法接受某个阈值,也应明确写出“暂不设阈值”的原因和后续验证方式。模糊的要求不会因为不写进文档而消失,只会在上线后变成争议。
一次性盘点通常用于新品调研、市场规模初估或竞品清单建立。它的核心不是高频更新,而是保证采集范围、去重规则和字段口径清晰。
这类任务可以优先使用人工导出、官方数据接口、合规的数据服务或低复杂度脚本。若最终只需要导入分析平台制作一次性报告,没有必要一开始就搭建持续调度、实时告警和复杂分布式架构。
但一次性不代表可以忽略来源和时间。每条记录仍应保存采集批次、来源地址、采集时间和清洗规则,否则几周后复盘时无法解释数据为什么变化。
周期分析需要稳定地重复同一套采集和清洗逻辑。相比单次任务,它更关心字段是否长期存在、商品 ID 是否稳定、类目路径是否变化,以及每次采集是否使用相同的筛选规则。
建议将原始值和标准化值分开保存。原始值用于回溯平台当时展示内容,标准化值用于趋势计算。若平台字段含义变化,应在数据字典中记录版本,而不是直接覆盖历史数据。
当数据需要供业务人员持续查看时,可以将标准化数据同步到分析工具,制作价格带、商品状态、店铺结构和类目变化看板。以九数云等分析平台为例,数据连接和可视化只是结果层,前面的主键、时间字段和指标口径仍需由采集系统负责。
高频监控的难点不在于把频率调高,而在于让系统知道哪些变化值得响应。重点对象可以高频采集,长尾对象可以低频采集;发生变化的对象可以进入临时加密观察,稳定对象则降低频率。
这是一种分层采集策略:
这种策略的价值是把资源集中在业务真正关心的对象上。它比“所有商品统一每 10 分钟采集”更容易控制成本,也更符合数据源访问和系统稳定性的要求。

跨平台分析最容易造成“看起来有结论,实际上不可比”。不同平台对销量、评价、排名、促销价和库存的定义可能不同,即使字段名称相同,也不代表业务含义相同。
建议在数据模型中增加平台、来源字段、原始口径和标准化口径。无法统一的指标不要强行合并,可以分别展示或只做方向性观察。
例如,两个平台都提供“销量”字段,但一个是近 30 天滚动销量,另一个是累计成交数量。正确做法不是把两列直接相加,而是先在数据字典中标注口径,必要时只比较同一平台内的变化趋势。
技术上能访问,不等于可以无限制采集、保存和使用。涉及账号、联系方式、收货信息、评论中的个人信息或需要登录才能获得的数据时,应先确认授权范围、平台规则、数据最小化原则和保存期限。
本文不建议通过绕过访问控制、规避验证或突破技术限制来获取数据。更稳妥的路径是优先使用官方接口、平台授权、企业内部数据、公开且允许使用的数据源,或者选择明确说明数据来源和使用边界的合规服务。
即使数据公开展示,也要进一步判断采集规模、使用目的、是否商业化、是否涉及个人信息,以及平台协议对自动化访问和再利用的限制。合规不是开发完成后的附加检查,而应成为采集目标的一部分。
如果这些问题没有答案,建议先做小范围验证,而不是直接承诺全量采集。一个两天内完成的 100 个重点 SKU 试采,通常比一个月后才发现指标不成立的大项目更有价值。

全量采集适合需要完整盘点、总体结构分析或合规授权明确的数据场景。它的优势是覆盖全面,缺点是成本高、噪声多、维护难度大,且不一定能提高业务判断质量。
重点对象采集适合价格监控、促销提醒和重点店铺分析。它能把资源集中到高价值对象,但存在漏掉长尾变化的风险。解决方式不是简单扩大全量,而是定期根据业务结果调整对象名单。
我的建议是先用重点对象验证指标和告警规则,确认业务真的使用后,再逐步扩大范围。不要用全量数据掩盖一个尚未验证的应用。
实时数据听起来更有价值,但实时意味着更高的调度、访问、存储和监控成本,也意味着系统对短时波动更加敏感。对于趋势分析,分钟级数据可能只是增加噪声;对于限时促销,日级数据又可能完全失效。
判断是否需要实时,应从业务动作倒推。如果业务人员无法在 10 分钟内做出动作,或者动作本身只在每天固定时间发生,那么过度追求实时可能只是技术偏好,而不是业务需求。
只保存标准化结果,查询和分析更方便,但遇到口径争议时难以回溯;只保存原始数据,审计能力强,但每次分析都要重复清洗。更合理的方式是保留原始层、标准化层和指标层,并明确各层职责。
原始层不应被随意修改,标准化层负责统一类型、主键和状态,指标层负责服务看板、告警和分析。对于使用九数云等工具的场景,这种分层尤其重要,因为可视化层应该消费稳定的数据模型,而不是直接依赖未经清洗的页面结果。
自动化适合重复、规则明确、规模较大的任务;人工复核适合规则尚未稳定、对象数量较少或异常代价很高的场景。把所有判断都交给自动化,会让错误快速放大;把所有结果都交给人工,又无法形成规模化能力。
可以采用“自动筛选加人工复核”的方式:系统先按字段、阈值和历史记录筛选异常,人工只处理高价值或高风险结果。经过一段时间积累后,再把稳定的人工判断转成规则。
正式生产系统需要考虑扩展性、容错和监控,但在业务目标尚未验证时,过早搭建复杂架构会增加沉没成本。更好的节奏通常是先做小范围试采、指标验证和数据质量评估,再决定是否需要更复杂的调度和存储体系。
我会把项目分成三个阶段:
建议业务方先填写下面这段,而不是直接提交“请开发爬虫”的任务:
本项目服务于【使用角色】,用于判断【业务问题】。核心指标为【指标名称及计算口径】,结果需要在【时间要求】内以【报表、接口、告警或文件】形式输出。数据对象包括【商品、SKU、店铺、类目等】,范围为【平台、店铺、类目、商品清单和时间范围】。如果数据缺失或异常,业务允许的处理方式是【忽略、重试、人工复核或延迟输出】。
| 字段名 | 业务含义 | 数据类型 | 是否必填 | 允许为空的原因 | 对应指标 |
|---|---|---|---|---|---|
| 对象唯一 ID | 定位商品或 SKU | 字符串 | 是 | 原则上不允许 | 去重、变化追踪 |
| 当前价格 | 指定口径下的展示价格 | 数值 | 是 | 页面无价格时需记录异常原因 | 价格变化率、价格带 |
| 商品状态 | 在售、下架、缺货等业务状态 | 枚举 | 是 | 无法确认时写未知 | 有效商品数、恢复时长 |
| 采集状态 | 成功、超时、解析失败等技术状态 | 枚举 | 是 | 不建议为空 | 任务质量、异常率 |
| 采集时间 | 数据被获取或确认的时间 | 时间戳 | 是 | 不允许 | 历史趋势、变化检测 |
下面的示例不是完整采集程序,而是展示为什么业务规则需要进入数据质量层。即使采集任务返回了数据,也要先判断对象 ID、价格、时间和状态是否满足应用要求。
def validate_record(record):
errors = []
if not record.get("sku_id"):
errors.append("缺少 SKU 唯一标识")
price = record.get("current_price")
if price is None or price < 0:
errors.append("价格为空或小于零")
if not record.get("collected_at"):
errors.append("缺少采集时间")
if record.get("collection_status") != "success":
errors.append("采集状态不是成功")
if record.get("business_status") not in {
"在售", "缺货", "下架", "预售", "未知"
}:
errors.append("业务状态不在约定枚举范围")
return {
"valid": len(errors) == 0,
"errors": errors
}生产环境还需要结合平台字段、币种、时间区间、异常比例和历史值变化进行校验。示例的重点不是代码本身,而是说明:业务目标最终必须落到可执行、可测试的规则上。
电商数据抓取的正确顺序是:应用问题决定分析指标,分析指标决定数据需求,数据需求决定采集目标,采集目标决定技术任务,技术任务再决定成本和维护方式。
如果顺序反过来,团队通常会先选工具、先做页面解析、先堆字段,最后才发现真正需要的是历史快照、稳定主键、状态区分或口径说明。
这也是为什么两个看起来相似的项目,最后会采用完全不同的方案。一个需要每日盘点,一个需要小时级告警;一个只关注商品级价格,一个必须下沉到 SKU;一个可以使用一次性文件,一个需要连续任务和分析看板。
如果你正在启动一个电商数据项目,不要先让开发人员回答“用什么工具抓”。先完成下面四个动作:
试采通过后,再决定是否扩大范围、提高频率或建设长期任务。若需要将结果用于看板,可把标准化数据接入九数云等数据分析平台;但无论使用何种分析工具,都不能替代前面的指标定义、字段设计和质量校验。
我判断一个电商数据抓取项目是否成熟,不会先看它抓了多少页面,也不会先看它使用了多复杂的技术架构。我会看三件事:业务人员能否用数据做出明确动作,开发人员能否用规则验收结果,团队能否在出现异常时追溯到数据来源和处理过程。
真正有价值的采集,不是把更多数据搬回来,而是用足够少、足够稳定、足够可解释的数据,持续支持一个明确的业务判断。当应用分析先行,采集目标自然会变得清楚;当采集目标清楚,技术方案、成本边界和验收标准也就不再靠猜。
我以前接到过“把竞品商品数据全部抓下来”的需求,第一反应是确认采集框架、代理和存储方案。结果业务真正关心的是价格变化和缺货提醒,而不是商品页面上的所有字段。我想知道,应用分析究竟如何改变开发人员的采集方案?
应用分析的作用,不是把需求文档写得更长,而是先确认“数据要支持什么判断”。如果最终没有明确的业务动作,采集任务很容易变成字段堆积:抓了标题、图片、评价、销量和店铺信息,却无法回答“谁会使用”“多久使用一次”“数据变化后要做什么”。我在一次竞品价格监控项目中见过很典型的返工。
第一版按照页面可见字段采集,保存了约30个字段,但上线后发现没有商品唯一标识、SKU规格和采集时间,业务无法判断两条记录是不是同一个商品,也无法还原价格变化。
后来将需求改成“发现重点SKU降价并触发提醒”,最终保留了商品ID、SKU、价格、原价、活动状态、店铺和采集时间等12个核心字段,数据清洗和维护成本反而下降。可以把关系理解为:应用问题决定分析指标,分析指标决定数据需求,数据需求再决定采集字段、频率和存储方式。
比如“查看当前竞品价格”只需要一次性结果;“判断竞品是否持续降价”就必须保存历史快照;“价格变化后30分钟内通知运营”则还会影响调度频率、延迟标准和告警机制。
因此,开发评审时不要先问“用什么爬虫工具”,而要先要求业务回答四个问题:谁使用数据、要做什么判断、判断结果会触发什么动作、允许多长时间的数据延迟。四个问题无法回答时,最稳妥的做法通常不是立即开发,而是先做小范围样本验证。
业务方经常只说“抓商品信息”“导出到Excel”或者“每天同步一次”,但这些描述对开发来说仍然不够。我曾经因为没有提前确认SKU粒度和空值规则,导致交付后被要求重做,想知道一份真正可执行的采集目标应该写到什么程度?
一份可执行的采集目标,至少要写清楚采集对象、数据范围、字段定义、时间要求、输出方式和质量标准。只写“抓取商品数据”,相当于只写了项目名称,没有写验收条件。我通常会把需求拆成下面这条链路:业务问题→分析指标→数据字段→采集任务→输出结果。
例如,业务问题是“哪些重点商品发生降价”,分析指标是“SKU价格变化率”,所需字段就不应只有当前价格,还应包含商品ID、SKU、原价、促销价、店铺、采集时间以及商品状态。
需求项不合格写法可验收写法 采集对象商品信息指定平台指定类目的在售商品及SKU 时间要求定期同步工作日每4小时采集一次,结果延迟不超过30分钟 历史数据保存价格每次采集保存快照,保留至少90天 质量标准尽量完整商品ID非空且唯一,价格字段格式统一,异常任务可追踪 字段定义还要补充业务含义和空值规则。
例如“销量为空”究竟代表平台没有展示、商品没有销量,还是页面解析失败?这三种情况不能使用同一个空值,否则后续分析会把技术异常误判为业务事实。验收最好同时覆盖样本正确性和任务稳定性。可以先抽取100个商品,人工核对商品ID、SKU、价格和状态;
再连续运行3至7天,检查重复率、字段缺失率、时间戳连续性和失败重试记录。对采集项目来说,“抓到过一次”不等于“可以持续使用”。
我见过团队为了做价格监控,直接把任务设置成每5分钟执行一次,结果请求量很大,失败率和维护成本也一起上升。后来发现业务每天只需要上午和下午各看一次趋势,我想知道采集频率应该用什么方法判断,而不是凭感觉设置?
采集频率不应由技术团队的执行能力决定,而应由业务变化速度、决策时效和数据成本共同决定。频率越高,只能说明数据更接近实时,不代表数据价值更高;如果业务不会根据这些变化及时行动,高频采集就是额外负担。我在设计任务时会先区分三类场景。一次性市场盘点通常单次采集即可;类目趋势分析可以按天或按周保存快照;
价格、库存或上架状态监控,则要根据重点商品的变化速度和告警时效设置频率。比如运营要求价格变化后2小时内发现,就没有必要默认每5分钟采集一次,可以先用30分钟间隔验证是否满足时效。
应用场景常见频率思路重点指标 市场规模盘点单次或按月覆盖范围、去重率 类目趋势分析每日或每周快照时间连续性、口径一致性 竞品价格监控按变化速度和告警时效设置发现延迟、价格准确率 库存状态监控重点商品高频,普通商品低频状态误判率、通知及时性 更稳妥的做法是先进行小规模频率测试。
选择一批具有代表性的商品,连续观察24至72小时,记录价格、库存和页面状态的实际变化次数,再结合业务允许的延迟设定频率。对于变化明显不同的商品,还可以采用分层策略:重点SKU高频采集,长尾商品低频采集,而不是所有对象使用同一个周期。
还要把任务成本纳入判断,包括请求量、解析耗时、失败重试、存储增长和人工排障时间。频率从每小时提升到每10分钟后,如果业务发现速度只提升了几分钟,却让失败任务增加数倍,这种优化通常是不划算的。
我曾经拿到一份只有当前价格的商品表,表面上数据很完整,但业务想分析近30天的调价趋势时,发现完全无法还原变化过程。另一个项目还把页面加载失败误判成商品下架,我想知道历史记录和质量校验应该怎样设计,才能避免这些问题?
只保存当前值,适合查询“现在是什么”,不适合回答“什么时候变了、变了几次、变化幅度是多少”。只要应用涉及趋势、监控、预警、回溯或责任确认,就应在数据模型中保留采集时间,并根据场景保存周期快照或状态变更记录。价格监控至少需要商品ID、SKU、价格、活动状态、店铺和采集时间。
库存或上下架监控还应区分页面可访问、商品可购买、库存状态和接口请求结果。否则页面打不开、请求超时、商品下架和商品无货可能全部被写成同一个“不可用”,后续告警就会产生大量误判。
校验类型检查内容常见异常 完整性必填字段是否为空商品ID缺失、时间戳缺失 唯一性商品ID与SKU组合是否重复同一SKU重复入库 格式有效性价格、时间、状态是否符合规则价格带货币符号、时间错位 变化合理性新旧值变化是否超过业务阈值价格突然变为0、销量异常暴增 任务可用性失败原因是否可追踪超时被误记为商品下架 工程上建议把“原始结果”“标准化字段”和“质量状态”分开保存。
原始结果用于排查解析错误,标准化字段用于分析,质量状态用于标记成功、字段缺失、页面变化、请求失败等情况。这样即使页面结构发生变化,也能追溯到底是业务数据变化,还是采集逻辑失效。验收时不要只抽查一次导出文件。可以连续运行3至7天,统计必填字段完整率、商品ID重复率、价格异常率、任务成功率和状态误判率。
我的判断标准是:只有当系统能够解释“这条数据为什么是这个值、这次任务为什么失败、这个状态为什么发生变化”,采集结果才真正具备可分析性。


读者评论
文章把“应用分析,采集目标,工程任务”三层关系梳理得比较清楚,尤其是先明确业务判断再设计字段这一点,对需求评审很有参考价值。
将业务状态与采集状态分开处理很实用。页面打不开不等于商品下架,字段为空也不一定代表缺货,这种区分能减少误报,但实际项目中还需要结合连续采集结果验证。
文中关于历史快照的提醒比较关键。只保存当前价格确实无法支持趋势和降价分析,不过价格口径、优惠券和地区差异等问题仍需要在项目中进一步细化。