电商数据抓取最容易被误判的地方,不是“有没有抓到”,而是“抓到的字段能不能直接比较”。我曾经处理过一批来自三个平台的商品数据:三张表都有名为 price 的字段,导入分析工具后看起来格式完全正常,但人工抽查才发现,一个价格是商品原价,一个是活动价,另一个已经包含平台优惠券。结果是同一批商品的平均价格被拉低了约 17%,促销效果判断也随之失真。对数据新手来说,统一字段标准不是改列名,而是用质量校验验证字段含义、格式、来源和业务逻辑是否真的一致。
我通常把抓取后的数据分成三个层次判断。第一层是“采集成功”,代表请求返回了页面、接口或文件;第二层是“字段完整”,代表关键字段被成功提取,并且没有大面积为空;第三层是“业务可用”,代表字段含义统一、类型正确、逻辑成立,能够支撑比较、统计或决策。
很多新手只检查第一层。例如,程序返回了 10,000 行数据,便认为抓取任务完成。但这 10,000 行可能包含重复商品、错误页面、登录页内容、缺失价格的记录,也可能把“券后价”和“原价”混在同一列中。行数增长并不等于数据价值增长。
| 判断层次 | 要回答的问题 | 常见通过标准 | 未通过时的处理 |
|---|---|---|---|
| 采集成功 | 页面或接口是否成功返回? | 状态正常、响应内容可解析、未命中错误页 | 重试、检查权限、识别拦截或结构变化 |
| 字段完整 | 关键字段是否被提取出来? | 商品 ID、名称、价格、链接、采集时间有值 | 检查定位规则、分页逻辑和页面模板 |
| 业务可用 | 字段是否能被正确比较和计算? | 含义、类型、单位、枚举、逻辑均符合标准 | 映射、转换、标记异常或回查原始页面 |
最重要的判断顺序是:先确认字段含义,再确认字段格式,最后才确认数值大小。如果含义没有统一,后面的精确计算只会让错误结果看起来更专业。

“准确率达到多少才合格”是一个很容易传播、但通常不够严谨的问题。价格、库存、订单金额、评价数量和营销标签的风险不同,不能用同一个百分比衡量。财务对账关注金额和唯一订单,库存管理关注及时性与状态一致,竞品趋势分析则可能更关注采样稳定和字段完整。
我更建议把数据质量拆成六个维度:完整率、正确率、一致率、唯一率、及时性和可用率。它们分别回答不同问题。比如价格字段非空率很高,只能说明“有价格”,不能证明这个价格就是销售价,更不能证明它是最新价格。
| 质量维度 | 计算思路 | 适合检查的字段 | 容易误判的地方 |
|---|---|---|---|
| 完整率 | 非空记录数 ÷ 应有记录数 | 商品 ID、价格、商品名称 | 非空不等于正确 |
| 正确率 | 符合页面或业务事实的记录数 ÷ 抽检记录数 | 价格、库存、商品状态 | 需要明确参照来源和抽检方法 |
| 一致率 | 符合跨来源或跨时间关系的记录数 ÷ 比较记录数 | 列表页与详情页、昨日与今日价格 | 时间差和促销状态可能造成合理差异 |
| 唯一率 | 唯一业务主键数 ÷ 总记录数 | 商品 ID、SKU、订单号 | 不同时间快照不能简单当作重复 |
| 及时性 | 采集时间与业务更新时间的差值 | 库存、活动价格、物流状态 | 抓得快不代表更新及时 |
| 可用率 | 通过全部关键规则的记录数 ÷ 总记录数 | 进入报表的标准化明细 | 规则过严也会降低可用率 |
一张真正可执行的字段标准,至少要包含标准名称、业务含义、数据类型、单位、原始来源、是否允许为空、枚举值、转换规则、校验规则和责任人。少了业务含义,列名统一只是表面统一;少了转换规则,数据类型仍然可能无法计算;少了校验规则,标准表也只是一份文档。
例如,标准字段 selling_price 不能只写“销售价格”。还应该写清楚:它是页面当前可直接购买的未含券价格,单位为人民币元,保存为两位小数,允许因商品缺货而为空,但不允许出现负数;如果页面同时展示活动价和券后价,必须分别保存,不得覆盖原始字段。
在多平台抓取中,最危险的字段往往是价格、销量、库存和评价数。它们都很常见,也都容易被程序成功解析,因此错误不会表现为明显的空值,而是以“看起来合理”的数字进入报表。
价格字段尤其典型。某平台展示“日常价”和“活动价”,某平台展示“券后价”,还有的平台把最低 SKU 价格展示在商品卡片上。若抓取规则只寻找页面上第一个金额,程序可能稳定地提取到一个数值,但这个数值未必适合跨平台比较。
| 原始展示 | 可能代表的含义 | 标准字段建议 | 是否可直接合并 |
|---|---|---|---|
| 原价 | 商品未参加当前活动前的参考价格 | list_price | 不能与实付金额合并 |
| 活动价 | 当前活动或促销条件下的页面价格 | selling_price | 需记录活动状态和采集时间 |
| 券后价 | 满足优惠券条件后的预估价格 | coupon_price | 不能默认等于实际支付金额 |
| 起售价 | 多个 SKU 中价格最低的展示值 | starting_price | 不能代表目标 SKU 价格 |
| 实付金额 | 订单实际支付金额,可能含运费、优惠和退款影响 | paid_amount | 适合订单分析,不适合商品卡片对比 |
我的经验是,凡是名称中出现“价格”但没有限定语的字段,都应该先暂停合并。先让业务人员确认它是原价、标价、活动价、券后价、SKU 价还是订单实付价,再决定标准字段名称。
页面上的“有货”“仅剩少量”“暂时无货”“预售”属于状态枚举,库存数量则是数值字段。一个商品可能显示“有货”,但页面并没有公开具体库存;也可能展示“999+”,这不是精确库存,而是一个上限或营销展示值。
如果把“有货”转换为库存数量 1,把“999+”转换为 999,就会制造虚假的精确性。更稳妥的做法是同时保留原始展示值、标准状态和可计算数量,并对无法确认的数量使用空值或区间标记,而不是随意填补。
| 原始值 | 标准库存状态 | 标准库存数量 | 处理建议 |
|---|---|---|---|
| 有货 | in_stock | NULL | 只用于状态分析,不推导具体数量 |
| 仅剩 3 件 | low_stock | 3 | 保存采集时间,避免当作实时库存 |
| 999+ | in_stock | NULL 或大于等于999 | 保留区间性质,不伪造精确值 |
| 暂时无货 | out_of_stock | 0 或 NULL | 由业务定义是否将状态映射为零库存 |
| 预售 | pre_sale | NULL | 与现货库存分开统计 |
“月销 5,000+”“已售 10 万”“累计评价 2.3 万”并不是同一类指标。月销通常是周期性展示,已售可能是累计值,评价数可能包含追评、历史链接迁移或不同 SKU 汇总。把它们统一命名为 sales_count,会让后续分析失去解释能力。
我在做竞品监测时,会强制加入三个辅助字段:原始文本、解析后的数值和统计口径。即使暂时无法确认口径,也将 metric_scope 标记为 unknown,而不是把不确定值伪装成标准销量。

把 title、商品名称 和 产品名 都改成 product_name,只能解决表面命名问题。不同平台可能把品牌、规格、促销词和商品标题拼接在一起,也可能只保留短标题。字段名称统一后,内容粒度仍然可能不同。
我会在标准字段表中增加“业务定义”和“保留原始值”两列。标准字段用于分析,原始字段用于追溯。两者同时存在,才能避免清洗时把原始证据覆盖掉。
空值率低确实是一个积极信号,但强行填充会比保留空值更危险。例如,页面没有公开库存数量,却把“有货”转换成 1;页面没有展示折扣率,却用原价和销售价自行计算;页面价格加载失败,却沿用上一条记录的价格。这些处理会降低空值,却增加错误。
我的原则是:能确定的值才转换,不能确定的值保留不确定性。可以用状态字段、区间字段和异常标记表达信息边界,不要为了让报表完整而制造精确数字。
整行去重只能处理完全相同的记录。实际电商数据中,同一个商品可能因为采集时间不同、价格变化或库存变化而产生多行快照;同一个商品也可能有多个 SKU。真正的去重必须先定义业务主键,再决定哪些记录应该合并、哪些记录必须保留。
例如,商品价格监测的主键可能是“平台 ID+商品 ID+SKU+采集日期”,而商品主档的主键可能只是“平台 ID+商品 ID”。如果把两个场景使用同一套去重规则,必然会误删历史变化或保留重复记录。
自动重试适合网络超时、短暂接口异常和页面加载失败,但不能修复字段定位器失效、页面结构变化、登录页返回或反爬拦截。更糟糕的是,反复重试错误页面可能生成大量重复记录,让问题看起来像“数据增长很快”。
我会把采集稳定性和字段正确性分开记录。前者看请求成功率、超时率和重试次数;后者看关键字段完整率、类型通过率和业务逻辑通过率。两个指标不能互相替代。
删除确实能让报表变干净,但会掩盖采集规则变化,也会让后续无法回答“为什么这一批数据少了”。更合理的做法是保留原始记录,将异常放入隔离表,再根据异常类型决定修正、人工复核或暂缓使用。
尤其是价格突然下降、库存突然归零、评价数突然增加等情况,它们可能是真实业务变化,也可能是抓取错误。没有原始值和采集时间,就无法区分两者。
抓取 100 条样本时发现规则错误,修复成本通常只是改映射表;抓取 100 万条数据后才发现价格口径混乱,修复就会涉及回溯、重跑、报表重算和业务解释。规模越大,错误传播越快,返工代价越高。
因此我建议先用小样本验证字段标准,再扩大平台、店铺、日期和字段范围。数据采集的第一阶段不是追求数量,而是确认规则能够重复执行。
同一个“价格”,可能描述商品、SKU、订单或优惠后的交易条件。判断字段是否能统一时,第一步不是看字段名称,而是确认对象。商品级价格和 SKU 级价格不能直接放在一个粒度下;订单实付金额也不能与商品列表页价格混为一谈。
我在建立标准时,会给每个字段补充一个“对象粒度”属性:商品、SKU、店铺、订单、用户或采集事件。只要粒度不同,即使名字相近,也先拆成不同字段。
| 字段 | 对象粒度 | 典型含义 | 能否与商品级字段直接合并 |
|---|---|---|---|
| 商品展示价 | 商品或最低 SKU | 商品卡片上的展示金额 | 不能直接代表目标 SKU |
| SKU 售价 | SKU | 具体规格可购买价格 | 需在 SKU 粒度比较 |
| 订单实付金额 | 订单 | 优惠、运费、退款等因素后的金额 | 不能与列表页价格相加比较 |
| 店铺评分 | 店铺 | 店铺综合评价或服务评分 | 不能复制到每个商品后当作商品评分 |
数据不是脱离时间存在的。价格、库存、活动状态和物流节点都具有时效性。一个上午 10 点采集的价格和下午 3 点采集的价格不同,不一定说明其中一个错误,可能只是促销活动已经切换。
所以标准化明细表至少要保留 captured_at,必要时还要保留页面显示的 updated_at、活动开始时间和活动结束时间。没有采集时间,任何趋势变化都缺乏解释基础。
一个标准字段必须有验证办法。价格可以检查类型、范围和原价关系;库存状态可以检查枚举和数量关系;商品 ID 可以检查非空和唯一性;链接可以检查格式与访问结果。如果某个字段无法说明如何验证,它通常还没有被定义清楚。
我会把字段规则分成三类:硬规则、软规则和人工规则。硬规则不通过就不能进入分析表;软规则只标记异常;人工规则则需要抽样复核。例如,价格小于零是硬规则,价格较昨日下降 50% 是软规则,券后价是否满足使用条件则可能需要人工判断。

下面这个案例来自我处理电商商品监测时采用的典型流程。为了便于复现,商品名称和数值做了脱敏与情景化处理,但字段冲突、校验方式和处理步骤保持真实业务中的常见形态。样本包括三个平台、12 家店铺、2,400 条商品记录,目标是比较同类商品的价格、库存和评价变化。
第一次导入时,三个平台的表都能正常打开,记录数量也符合预期。但初检发现:价格字段有 146 条带货币符号,评价数有 89 条使用“万”为单位,库存状态有 63 种原始写法,另有 74 条商品因分页重复出现两次。
这批问题并不复杂,却足以影响最终结论。若不处理,价格均值、缺货率和评价增速都会出现偏差。尤其是分页重复,可能会让某些热门商品在统计中权重更高,造成样本选择偏差。
| 原始平台字段 | 标准字段 | 标准定义 | 转换动作 | 校验规则 |
|---|---|---|---|---|
| 商品标题、名称、产品名 | product_name | 页面展示的商品名称 | 去除首尾空格,保留原始文本 | 不能为空;长度大于1 |
| 商品编号、商品 ID、itemId | platform_product_id | 平台内商品唯一标识 | 转为文本,避免前导零丢失 | 不能为空;同平台同批次不应重复 |
| 原价、划线价 | list_price | 页面参考价或原始标价 | 去货币符号和千位分隔符 | 大于等于0;保留两位小数 |
| 售价、活动价 | selling_price | 当前页面可识别的销售价格 | 按页面标签映射,不按位置映射 | 大于等于0;记录价格类型 |
| 优惠券后、券后价 | coupon_price | 满足优惠条件后的预估价格 | 解析金额,保留优惠条件 | 不得直接替代selling_price |
| 库存、库存文案、销售状态 | stock_status | 标准化可售状态 | 按枚举表转换 | 只能取允许枚举值 |
| 评论数、评价数 | review_count | 页面展示的评价数量 | 处理“万”“千”和分隔符 | 不能为负;保留原始口径 |
| 抓取时间、采集时间 | captured_at | 数据实际采集时间 | 统一时区与时间格式 | 不能早于任务开始时间 |
这张表中最关键的不是字段数量,而是每个标准字段都有“定义、转换、验证”三部分。只有三部分同时存在,字段标准才具备执行能力。
对价格字段,我不会直接把所有金额转成浮点数后求平均,而是先保留 raw_price_text、price_type、price_condition 和 sku_scope。这样可以区分“99 元活动价”“券后 79 元”“两件起 89 元”和“起售价 59 元”。
在使用九数云等可视化分析工具进行汇总时,标准化后的价格字段可以用于趋势和分组分析;原始文本和异常标记则用于回查。工具适合呈现不同平台的价格变化、店铺分布和异常记录,但它不能替业务方自动决定一个模糊价格究竟代表什么。
我在实际处理中会设置以下价格规则:
库存字段在这批样本中没有被统一成“0或1”这么简单,而是拆成 stock_status、stock_quantity 和 stock_raw_text。对于“有货”这种没有精确数量的展示,只写入状态,不填数量;对于“仅剩 3 件”,才提取数量 3;对于“999+”,保留区间性质。
评价数量则采用“文本解析+口径标记”的方式。例如“1.2 万”转换为 12,000,但 review_scope 仍需标记为页面累计评价。若页面写的是“月销 1.2 万”,则不能进入评价数量字段,而应进入周期销量字段。
原始值:1.2万
解析结果:12000
字段:review_count
口径:页面累计评价
校验:数值大于等于0,保留原始文本
原始值:月销1.2万
解析结果:12000
字段:monthly_sales_count
口径:页面周期销量
校验:不得映射到review_count

完整性校验的核心是确认“应该有的字段是否存在”。我会先把字段分为关键字段、重要字段和辅助字段。商品 ID、商品名称、平台名称和采集时间通常属于关键字段;价格、库存和评价数属于重要字段;促销标签、配送承诺等则视业务用途决定是否允许为空。
可以使用以下公式计算字段完整率:
字段完整率 = 非空记录数 ÷ 应有记录数 × 100%
主键完整率 = 非空且格式合法的主键数 ÷ 总记录数 × 100%
批次可用率 = 通过关键字段检查的记录数 ÷ 批次总记录数 × 100%
不要预先规定所有字段必须达到同一个阈值。商品 ID 缺失 5% 可能意味着抓取定位失败,促销标签缺失 5% 则可能只是页面本身没有展示。阈值应结合字段用途、历史基线和业务风险设定。
去重规则的第一步是定义主键,而不是选择某个软件按钮。商品主档、价格快照、库存快照和订单明细的主键不同。对价格监测而言,“平台+商品 ID+SKU+采集时间”可能是合理主键;对商品主档而言,“平台+商品 ID”更合适。
如果同一商品在同一采集批次出现两次,通常应标记为重复;如果同一商品在不同时间价格不同,则应保留,因为它反映了业务变化。去重的目标不是让表格看起来整齐,而是避免同一业务事实被重复计算。
| 数据用途 | 建议主键 | 应保留的变化 | 不建议的去重方式 |
|---|---|---|---|
| 商品主档 | 平台 ID+商品 ID | 名称、品牌、类目变化 | 只按商品名称去重 |
| 价格监测 | 平台 ID+商品 ID+SKU+采集时间 | 价格、活动状态变化 | 把同一商品所有历史记录合并 |
| 库存监测 | 平台 ID+商品 ID+SKU+采集时间 | 有货、缺货、预售变化 | 只保留最新一行而丢失趋势 |
| 订单明细 | 平台 ID+订单号+商品行号 | 支付、退款和发货状态变化 | 只按订单号去重 |
格式校验看似基础,却是最容易自动化、也最容易产生连锁问题的一环。金额中混入货币符号,评价数中混入“万”,时间字段同时存在字符串和数字时间戳,这些问题都会导致分组、排序或计算出现隐性错误。
我会为每个字段定义目标类型,并在转换后再次验证。转换前后的值都要保留,尤其是金额和数量。若原始值无法解析,不应静默转换为零,因为零本身具有业务含义。
范围校验只能发现明显异常,逻辑校验更适合发现字段之间的矛盾。例如,售价高于原价不一定错误,可能是原价字段实际代表某个 SKU 的最低价;库存状态为无货但库存数量为 10,也可能是状态字段来自店铺级页面、数量字段来自 SKU 级页面。发现矛盾后,不能立即删除,而要先检查粒度和时间。
适合新手的逻辑规则包括:

自动修正适合规则明确、不会改变业务含义的格式问题。例如去除金额中的货币符号、统一日期格式、把“1.2 万”转换为 12,000、清理首尾空格和不可见字符。这类转换应保留转换前的原始值,并记录规则版本。
自动修正不等于自动猜测。把“有货”猜成库存 1,把“起售价”猜成统一售价,已经超出格式清洗范围,应该转为业务映射或人工复核。
有些异常记录仍然有分析价值。比如商品价格比上一日下降 40%,这可能是促销,也可能是解析错误;商品名称为空但商品 ID 和价格都存在,这条记录可以用于价格监测,但不能用于名称分类。
我建议增加以下字段:
| 字段 | 作用 | 示例值 |
|---|---|---|
| is_valid | 是否通过当前用途的质量门槛 | true / false |
| error_type | 异常分类 | missing_price、duplicate_key |
| error_message | 记录具体异常原因 | 未识别价格类型 |
| review_status | 人工复核进度 | pending、confirmed、resolved |
| rule_version | 记录使用的规则版本 | price_rule_v3 |
关键主键缺失、多个核心字段同时为空、页面疑似返回登录页、价格完全无法解析、页面结构发生整体变化时,应将记录放入隔离表。隔离并不等于删除,而是防止它污染主分析表,同时保留进一步排查的入口。
如果同一批次中错误页面比例突然从 1% 升到 35%,不要继续扩大抓取量。先暂停任务,检查响应内容、页面结构、访问权限和字段定位规则。继续抓取只会扩大污染范围。
质量校验真正有价值的地方,在于它能推动规则迭代。一个完整闭环应当包括:发现异常、记录异常、定位来源、判断能否自动修复、人工确认业务含义、更新字段规则、重新运行校验。
在使用九数云做数据分析时,可以将异常记录单独接入分析模型,按平台、字段、规则版本和采集批次观察异常率变化。这样做比只看一张“清洗后的干净报表”更有价值,因为它能让团队知道数据问题发生在哪里、是否正在恶化。

字段标准不能脱离使用场景。你是要做价格监测、库存预警、竞品分类、商品选品,还是订单对账?不同目的需要的字段粒度不同。价格监测要保留历史快照,商品分类更关心名称、品牌和类目,订单对账则必须优先保证订单号和金额口径。
如果还没有明确目的,可以先做“最小可用字段集”:平台名称、店铺名称、商品 ID、SKU、商品名称、原价、销售价、库存状态、评价数、商品链接和采集时间。先把这 11 个字段跑通,再扩展其他字段。
小样本的目的不是估算业务结果,而是验证字段规则。建议覆盖不同商品类型、不同价格区间、不同库存状态和不同页面模板。若只选取页面结构最简单的商品,规则很可能在扩大规模后失效。
小样本阶段应人工逐条核对关键字段。重点看页面原文、抓取原值、标准化值和校验结果是否一致。人工核对不是低效的反自动化,而是用较低成本确认自动规则是否值得扩大。
每个原始字段都要写明来源、含义、目标字段、转换方式和校验规则。对于一个原始字段可能对应多个标准字段的情况,要明确拆分逻辑。例如“价格”可能拆为原价、活动价和券后价,不应全部挤进一个目标列。
五类基础校验通过后,再做跨来源一致性检查。例如把列表页与详情页的商品 ID、价格和库存状态进行比对;如果两者不同,先检查采集时间和页面粒度,再判断哪一个更适合作为标准来源。
我不建议把所有处理都覆盖在一张表里。最少应保留原始层、标准层和异常层。原始层用于追溯,标准层用于分析,异常层用于复核和规则迭代。三层分开后,业务人员可以放心修改标准规则,而不必重新抓取全部页面。
| 数据层 | 主要内容 | 主要使用者 | 禁止做的事 |
|---|---|---|---|
| 原始层 | 页面原值、接口原值、原始时间和来源链接 | 开发、数据治理人员 | 不直接用于核心报表 |
| 标准层 | 统一字段、类型转换、标准枚举和业务主键 | 分析、运营和管理人员 | 不覆盖原始值 |
| 异常层 | 错误类型、异常原因、复核状态和规则版本 | 数据与业务协作人员 | 不静默删除未处理记录 |
当小样本通过后,可以逐步增加店铺、平台、日期和字段。每次扩大都应记录规则版本、样本范围、通过率、异常率和主要异常类型。这样当数据质量下降时,能够快速定位是平台变化、规则变化还是样本变化。

如果数据量只有几百到几千条、字段不多、业务口径还在讨论中,表格工具往往是最合适的起点。它便于业务人员直接看到原始值、标准值和异常原因,也便于快速修改映射关系。
但表格不适合长期承载高频抓取和复杂历史快照。手工复制、公式覆盖、多人编辑和版本混乱,都会让质量规则难以追踪。只要同一规则需要每周重复执行,就应该考虑自动化。
当数据量增长、任务需要定时运行,Python 或 SQL 更适合执行格式转换、去重、异常识别和批次统计。程序化规则的价值不只是速度,更在于每次执行逻辑一致,并且可以保留日志。
SELECT platform_id, COUNT(*) AS total_rows, SUM(CASE WHEN platform_product_id IS NOT NULL THEN 1 ELSE 0 END) AS valid_id_rows, SUM(CASE WHEN selling_price >= 0 THEN 1 ELSE 0 END) AS valid_price_rows, COUNT(DISTINCT CONCAT(platform_id, '-', platform_product_id)) AS unique_product_rows FROM standardized_product_snapshot GROUP BY platform_id;
上面的查询只是示意,实际项目中还要根据数据库类型处理空字符串、类型转换、SKU 粒度和采集时间。不要把一段通用 SQL 当成完整质量体系。
当字段标准已经相对稳定,九数云这类数据分析工具可以帮助团队观察不同平台的完整率、异常率、价格波动、库存变化和人工处理耗时。它的优势在于把规则结果和业务指标放在同一视图中,方便回答“哪一个平台问题最多”“哪类字段最容易失败”“质量下降是否影响销售判断”等问题。
但工具选型时不能只看“能否连接数据”或宣传中的准确率。更应检查是否支持原始层与标准层分离、字段映射、异常筛选、规则版本、批次监控和人工复核。工具可以提高执行效率,却不能替团队定义模糊字段的业务含义。
| 场景 | 表格工具 | 脚本与数据库 | 可视化分析工具 |
|---|---|---|---|
| 字段口径讨论 | 强 | 中 | 中 |
| 小样本人工核对 | 强 | 中 | 弱 |
| 大批量重复校验 | 弱 | 强 | 中 |
| 异常趋势监控 | 弱 | 中 | 强 |
| 跨平台业务比较 | 中 | 中 | 强 |
| 规则版本管理 | 弱 | 强 | 取决于平台能力 |

不需要一开始搭建复杂数据仓库,但必须明确价格口径和采集时间。建议保留原价、销售价、券后价三个字段,并人工抽查至少 20 条不同页面类型的记录。
取舍是:可以接受部分促销条件无法完全还原,但不能把不同价格类型混在一起。宁可少比较一批语义不明确的商品,也不要用混合口径得出一个看似精确的平均价格。
必须保留历史快照、平台商品 ID、SKU、采集时间和规则版本。价格突变不能直接删除,应结合页面活动状态、竞品变化和解析规则进行判断。
取舍是:存储量会增加,数据模型也更复杂,但可以解释价格变化原因。若只保留最新价格,报表更简单,却无法分析促销周期、价格恢复和异常波动。
优先保证库存状态、采集时间和商品主键的稳定,不要把“有货”强行转换成具体库存数量。对于“999+”“仅剩少量”和“预售”,应采用状态或区间表示。
取舍是:库存数量的精确分析能力会下降,但缺货率和状态变化的可信度会提高。多数页面并不提供真实库存,因此承认数据边界比伪造精确数量更专业。
需要把标准要求提升到订单号、订单行号、支付金额、退款金额、优惠金额和结算时间。商品列表页价格不能替代订单实付金额,订单状态也不能只靠页面颜色或文字推断。
取舍是:校验成本和人工复核成本都会上升,但金额类数据的错误代价更高。对账场景不应为了追求处理速度而放宽唯一性和金额逻辑规则。
应先建立数据字典和字段责任人,再接入可视化工具。报表中不仅要展示业务结果,也建议增加数据更新时间、批次可用率、异常记录数和关键字段完整率,让使用者知道这份报表有多大可信边界。
取舍是:报表看起来会比单纯展示销售额更复杂,但可以避免管理层把一份质量未知的数据当成绝对事实。数据可信度本身也应该成为报表的一部分。
建议采用“表格定义标准、自动化工具执行抓取、分析工具监控结果”的轻量流程。先做最小字段集和五类基础校验,不要一开始引入复杂的数据治理概念。
取舍是:自动化程度可能不如大型团队,但更容易落地和维护。对小团队来说,一张维护清楚的字段标准表,往往比一套没人理解的复杂规则引擎更有价值。

很多团队把页面改版理解成“抓不到数据了”,但更危险的情况是页面仍然返回数据,只是字段含义或展示顺序发生了变化。例如原本的第一个价格变成了会员价,原本的销量改成了月销,原本的库存文案改成了发货承诺。
因此监控不应只看请求成功率,还要看字段分布和规则通过率。价格字段的中位数突然变化、某个枚举值大量增加、关键字段完整率突然下降,都可能是页面或业务口径变化的信号。
同一份标准表可能被不同人修改。若只记录文件最后更新时间,无法知道某批数据使用了哪一版价格映射或库存枚举。建议每次规则变更都生成版本号,并在标准化结果中写入该版本。
当报表出现异常时,可以按规则版本回溯:是新规则把券后价映射错了,还是平台页面本身发生了变化,或者只是采集时间恰好处于活动切换期。没有版本号,排查通常只能依赖猜测。
规则监控不仅要看通过或不通过,还可以观察数值分布。例如,某平台商品价格全部变成 0,可能是解析失败后默认填零;评价数突然集中在 100 或 1,000,可能是页面只展示了等级区间;库存状态中“unknown”占比突然升高,可能是枚举表没有覆盖新文案。
我会设置三类监控:字段完整率、异常率和分布变化。三者结合,才能发现那些没有产生空值、但已经改变数据含义的问题。

今天就可以建立一张表,至少包含标准字段名、业务含义、原始字段、数据类型、是否允许为空、转换规则和校验规则。不要等到所有字段都定义完才开始,先从商品 ID、商品名称、价格、库存状态和采集时间开始。
选择不同平台、不同商品类型和不同价格展示方式的记录。逐条比较页面原文、原始抓取值和标准化值。若有一个字段无法说清楚含义,就把它标记为待确认,而不是先写进报表。
异常清单至少记录平台、商品 ID、字段名、原始值、异常类型、发现时间和处理状态。清单的目的不是给谁“找问题”,而是让团队知道哪些规则需要补充、哪些页面需要回查。
如果 20 条数据中有 5 条价格口径不清,不要直接抓 20 万条。先修正标准和映射,再扩大到 100 条、1,000 条和更大规模。质量规则的价值,就是在错误成本最低的时候暴露问题。
电商数据抓取真正困难的部分,往往不是把页面内容搬进表格,而是判断这些内容是否描述了同一个业务事实。字段名称统一,只解决了表面问题;类型转换统一,只解决了计算问题;只有业务含义、时间、粒度、来源和校验规则同时统一,数据才具备跨平台比较的资格。
我最建议数据新手记住的一句话是:抓取决定数据有没有,字段标准决定数据能不能比,质量校验决定数据敢不敢用。不要先追求几十万条记录,也不要先购买最复杂的工具。先定义一个最小字段集,保留原始值,建立标准映射,用小样本完成完整性、唯一性、格式、范围和逻辑五类检查。
下一步可以从一张表开始:把平台原始字段、标准字段、业务含义、转换规则和校验规则写在一起,再用 20 至 100 条样本逐条验证。等字段口径稳定后,再将规则交给脚本、数据库或可视化分析工具持续执行。这样得到的数据,也许比未经校验的全量数据少,但它更容易比较、复核、解释和长期复用。
真正高质量的电商数据,不是看起来最完整的数据,而是每一个关键数字都能回答:它来自哪里、代表什么、在什么时间成立,以及为什么可以被使用。
我把多个平台的商品数据合并到同一张表后,发现它们都有一个叫“price”的字段,但实际金额对不上。后来才意识到,有的平台抓的是原价,有的平台抓的是活动价,还有的平台展示的是优惠券后的到手价。字段名明明一样,为什么统计结果还是会失真?
字段名统一,只解决了“列名不一样”的问题,没有解决“字段到底代表什么”的问题。这是电商数据标准化中最容易被低估的一层:同名字段不一定同义,异名字段也不一定不同义。我曾经处理过一批来自三个平台的商品数据,原始字段分别是“价格”“售价”和“券后价”。
如果直接把它们都映射成 selling_price,结果会把原价、促销价和用户最终支付价混在一起。后续做价格对比时,某平台看起来比其他平台便宜了约 12%,但回查页面后发现,差额其实来自优惠券口径不同。
原始字段表面含义实际可能代表建议标准字段 price价格原价或展示价list_price 或 display_price sale_price售价活动期间商品价selling_price coupon_price券后价满足条件后的预估支付价estimated_coupon_price pay_amount实付金额订单实际支付金额paid_amount 我的判断是,统一字段时必须同时写清楚字段名称、业务定义、计算口径、单位和适用场景。
尤其是价格、销量、库存、评价数这类字段,不能只依据页面标签或程序变量名进行映射。更稳妥的做法是保留原始字段,并在标准层拆出多个字段。
例如同时保存 list_price、selling_price 和 coupon_price,再增加 price_source 和 price_rule_version。这样后续发现口径有误时,可以重新转换,而不必重新抓取全部数据。
我刚开始做数据抓取时,只看抓到了多少条记录,觉得行数越多就说明采集越成功。后来发现有些记录商品 ID 为空、价格变成文本、同一个商品重复出现,甚至错误页面也被保存进了结果表。新手如果不想一开始就搭建复杂系统,最应该先检查什么?
新手不需要先建立复杂的数据仓库,建议从五类基础校验开始:完整性、唯一性、类型、范围和逻辑。它们分别回答“有没有抓到”“是否重复”“能不能计算”“数值是否异常”和“字段之间是否矛盾”。我在小样本测试时,通常先选取 50 至 100 条商品记录,执行下面这张最小检查表。
这个规模足以暴露字段映射和解析问题,又不会因为数据量太大而掩盖异常来源。
校验类别检查内容常见异常处理建议 完整性商品 ID、标题、价格、链接是否为空页面加载失败或字段定位错误标记异常并回查原始页面 唯一性平台 ID+商品 ID 是否重复分页重叠、请求重试重复写入按业务主键去重 类型价格、评价数、时间能否解析“¥79.9”“1.2万”“刚刚”转换后保留原始值 范围价格、评价数、库存是否越界负数、极大值、异常零值进入异常表,不直接删除 逻辑字段之间是否相互矛盾无货但库存为 20、折后价高于原价结合业务规则复核 这里有一个容易踩坑的地方:不要把“非空”误认为“正确”。
某次抓取中,商品标题和价格都有值,但所有价格其实都是登录页中的默认占位数字。完整性检查通过了,页面有效性检查却失败了。因此我会额外增加一条“页面有效性校验”:检查标题是否包含页面错误提示、商品 ID 是否符合平台格式、价格是否在同一批次中异常集中,以及多个关键字段是否同时出现相同默认值。
数据新手先把这六类检查跑通,通常比一开始购买复杂工具更有价值。
我把“1.2万”转成了 12000,把“有货”转成了统一枚举值,也把日期格式改成了统一格式,看起来数据已经很整齐了。但我担心这只是表面清洗,字段含义可能仍然不一致。有没有一种更可靠的方法验证标准化结果是否真的可用?
判断字段标准是否有效,不能只看列名是否统一、格式是否整齐,而要验证它能否支持后续业务判断。换句话说,标准化的终点不是“看起来像一张规范表”,而是“不同来源的数据可以在同一规则下被比较、汇总和追溯”。我通常采用“字段映射,规则校验,人工抽样,业务结果反测”四步验证法。
先把每个原始字段映射到标准字段,再执行规则检查;随后随机抽取 10 条左右记录与页面或官方导出数据对照,最后用标准化数据计算一个实际指标,观察结果是否符合业务常识。验证阶段验证问题通过标准 字段映射原始值为什么转换成这个标准字段?有明确业务定义和转换规则 规则校验字段格式和逻辑是否成立?
异常记录被识别并有原因说明 人工抽样标准值是否与页面或导出数据一致?关键字段能够逐条追溯 业务反测用数据计算出的结果是否合理?趋势、排序和数量级符合预期 例如,“销量”字段必须先确认是累计销量、月销量、近期销量,还是平台根据展示规则估算的数值。
如果把这几类数据都转换成 sales_count,即使数字格式完全正确,也不能进行跨平台比较。
我还建议给每个标准字段增加四个辅助字段:source_value 保存原始值,transform_rule 记录转换规则,validation_status 记录是否通过,error_message 记录异常原因。这样出现问题时,可以定位是抓取错误、转换错误,还是业务定义本身不清楚。
真正有效的字段标准,应该经得起一次反向追溯:从分析结果回到标准字段,再回到原始页面或接口值。如果中间任何一层无法解释,这个标准就还没有成熟。
我以前看到价格解析失败、商品 ID 重复或库存状态冲突,就直接删除这些记录,结果数据表虽然干净了,但总记录数越来越少,也无法解释为什么少了数据。面对不同类型的异常,怎样决定哪些可以自动修正,哪些必须保留并人工复核?
异常数据不应该默认删除,因为异常本身往往包含采集失败、页面变化或业务规则变化的线索。更稳妥的原则是:可确定转换的就修正,有业务歧义的就标记,无法确认来源的就暂缓进入分析表,同时保留原始记录。我会把异常分成四层处理。
第一层是格式型异常,例如货币符号、千位分隔符、前后空格和日期格式,这类问题通常可以自动修正。第二层是可解释的展示型异常,例如“1.2万”转成 12000,但必须保留原始文本。第三层是业务冲突型异常,例如页面显示“无货”,库存数字却是 20。
这类记录不能简单改成有货或无货,因为平台可能存在预售、区域库存或库存延迟,需要标记后复核。第四层是结构型异常,例如商品 ID、标题和价格同时为空,或者整批记录都出现相同占位值,这通常意味着页面加载失败或解析规则失效,应暂缓入库。
异常类型示例建议动作是否进入分析表 格式异常¥79.90、1.2万自动转换并保留原值可以 重复异常同平台同商品 ID 重复按主键和采集批次去重保留一条有效记录 业务冲突无货但库存为正标记并人工复核视业务用途决定 结构异常多个关键字段同时为空回查页面和解析规则暂缓进入 建议在标准化数据旁边增加 is_valid、error_type、error_message 和 review_status 四个字段。
这样数据表不会被异常记录污染,但也不会因为删除而失去审计线索。我见过最有效的异常闭环不是“清洗一次后结束”,而是“发现异常,记录原因,定位来源,决定处理,更新规则,重新校验”。当某一类异常在多个采集批次中反复出现时,它往往不是脏数据,而是字段标准或采集逻辑需要重新定义。


读者评论
文章把“抓取成功”和“业务可用”区分开来很实用,尤其是价格字段的案例,说明同名字段并不代表同一口径。
库存状态与库存数量分开处理的建议比较严谨,保留原始值和不确定性,确实比随意填充数字更适合后续分析。
关于去重和自动重试的提醒很有价值。实际项目中如果不先定义业务主键,确实可能误删历史快照,重试错误页面也会造成重复数据。