数据采集之后:清洗、结构化与入库实战
很多人以为数据采集的难点是"怎么爬",其实真正头疼的是"爬回来的数据怎么用"。
原始采集数据通常是这样的:价格带单位有的带有的不带、日期格式五花八门、同一家公司名字写了三种不同的方式、字段里夹杂着HTML标签和特殊字符。
直接用?根本没法用。必须做数据清洗和结构化处理。
原始数据有哪些"脏"
格式不统一
同一个字段在不同页面的格式可能完全不同:
日期:2026-09-29 / 2026年9月29日 / 09/29/2026 / 昨天 价格:¥1,280.00 / 1280元 / 1280 / 面议 电话:020-88888888 / 020 8888 8888 / 02088888888
缺失值
有些记录某些字段是空的。比如采集企业信息,有的公司没填网站、有的没填联系电话。
重复数据
同一条信息在不同来源或不同页面重复出现。比如一个招标信息在省级平台和汇总平台上各出现一次。
无效数据
测试数据、广告、已过期的信息混在有效数据里。
编码问题
中文乱码、特殊字符(全角半角混用)、HTML实体(& / <)。
数据清洗的核心步骤
步骤一:去除HTML标签和特殊字符
采集回来的文本经常带着HTML标签。用正则表达式或专门的库(如BeautifulSoup的get_text()方法)去除标签,只保留纯文本。
同时处理:
- HTML实体转义(& → &)
- 多余的空白和换行
- 全角字符转半角
步骤二:格式标准化
把同类数据统一成一种格式:
日期统一为ISO格式:全部转换成 YYYY-MM-DD 格式。"昨天""3天前"这类相对时间转成绝对日期。
价格统一为数值:去掉货币符号、千分位逗号,统一为浮点数。"面议"标记为空值。
电话号码统一格式:去掉空格和横线,保留纯数字。区分固话和手机号。
地址标准化:统一省市区的写法("广东省广州市""广东广州""广州"统一为"广东省广州市")。
步骤三:去重
判断两条记录是否重复,不能只看某一个字段。
常用去重策略:
- 精确去重:多个字段组合完全一致则视为重复
- 模糊去重:公司名称相似度超过90%视为同一家(用编辑距离或余弦相似度)
- 基于ID去重:如果数据有唯一标识(订单号、公告编号),直接按ID去重
步骤四:缺失值处理
根据业务需求决定怎么处理缺失值:
- 必填字段为空 → 标记为"待补充"或丢弃该条记录
- 非必填字段为空 → 保留空值
- 可推算的字段 → 从其他字段推算填充(比如从地址中提取省市)
步骤五:数据验证
对关键字段做校验:
- 手机号是否符合11位格式
- 邮箱是否包含@和域名
- 价格是否在合理范围内
- 日期是否在有效区间
不通过校验的记录标记出来,人工核实后再入库。
结构化存储
清洗完的数据需要存到合适的地方。
Excel/CSV:数据量不大(几万条以内)、需要人工查看和分析的场景。
关系型数据库(MySQL/PostgreSQL):数据量大、需要多维度查询和关联的场景。设计好表结构、建好索引。
MongoDB:数据结构不固定、字段经常变化的场景。比如不同网站采集回来的字段不完全一致。
数据仓库(ClickHouse/StarRocks):数据量非常大(千万级以上)、需要做复杂分析的场景。
自动化ETL流程
当数据采集和清洗成为日常任务时,应该建立自动化的ETL流程:
Extract(提取):定时运行爬虫采集数据。
Transform(转换):自动执行清洗、格式化、去重等处理。
Load(加载):处理完的数据自动入库。
整个流程用定时任务(cron/计划任务)驱动,加上错误通知和日志记录。出了问题能及时发现和定位。
数据的价值不在于采集了多少,而在于清洗后能用多少。花在数据清洗上的时间通常是采集时间的2-3倍,但这个投入是值得的——干净的数据才能产生可靠的业务洞察。
需要网站建设、软件开发或爬虫定制?
模板建站1280元起,价格公开不加价。电话/微信 13535321113
