跳转至

数据清洗与字段校验:先保证正确,再保存

爬虫最常见的质量问题不是程序报错,而是页面结构变化后仍“成功”写入了错误数据。应把解析、清洗和校验分开处理。

1. 保留原始值,再生成规范值

例如页面标题可能含有多余空白。不要在提取时混入过多业务规则:

def clean_text(value: str | None) -> str:
    return " ".join(value.split()) if value else ""

raw_title = node.get_text(" ", strip=True)
title = clean_text(raw_title)

" ".join(value.split()) 会合并连续空白并移除首尾空白。是否需要保留换行、大小写或单位,应由具体数据语义决定;不要一概删除所有字符。

2. 把“缺失”与“非法”区分开

from dataclasses import dataclass


@dataclass
class Article:
    title: str
    url: str
    summary: str = ""


def validate_article(item: Article) -> Article:
    if not item.title:
        raise ValueError("标题不能为空")
    if not item.url.startswith(("https://", "http://")):
        raise ValueError("URL 必须是 HTTP(S) 绝对地址")
    return item

摘要缺失可能是允许的,因此给默认空字符串;标题和来源 URL 是必填字段,因此应拒绝保存。字段规则应写成代码或文档,而不是靠记忆。

3. 用数量和样本发现结构变化

每次运行至少记录:来源页、发现卡片数量、成功解析数量、被跳过数量与跳过原因。例如某页通常有 20 条记录而今天得到 0 条,应先保存 HTML 样本并检查选择器,而不是把空结果直接覆盖旧数据。

4. 避免常见误区

  • strip=True 只能处理空白,不能验证数据正确性。
  • 页面显示的日期、金额和单位可能依赖地区;解析前要明确格式。
  • 同名标题不一定是同一条数据;去重应使用可靠主键或规范 URL。
  • 不要把异常吞掉后继续保存半成品数据。

参考

评论