欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

爬完一堆数据,该往哪塞?CSV、SQLite、JSON 我的取舍逻辑

爬完一堆数据,该往哪塞?CSV、SQLite、JSON 我的取舍逻辑

写爬虫的人,十个里有九个会在「数据存哪」这步随手选了 CSV,然后某天被自己坑了。我不是说 CSV 不好,是说太多人没想清楚就选了,等数据一复杂、一要查,才发现问题。存储选型没有标准答案,但有几条我踩出来的取舍,值得在动手前过一遍脑子。

CSV:简单,但脆

CSV 最大的优点是「人能直接打开看」,不需要任何依赖。小批量、字段规整、一次写完不怎么改,它是最省事的:

import csv
with open("data.csv","w",newline="",encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["title","price"])
    w.writerow([item["title"], item["price"]])

但坑也明显:字段里一旦含逗号、换行、引号,解析就崩,得严格走 csv 模块转义;没有类型,数字和字符串混着;更致命的是它不支持「边爬边查、去重、按条件取」。如果你要的是「抓完一次性导出给别人看」,CSV 完美;如果你要「 craw 过程中实时查重、增量更新」,它立刻不够用。

SQLite:一旦要查,就别犹豫

只要出现「我得按价格区间筛」「同一商品别重复存」「断点续跑时跳过已抓的」,我就直接上 SQLite。它是个文件型数据库,不用起服务,Python 标准库自带:

import sqlite3
con = sqlite3.connect("data.db")
con.execute("CREATE TABLE IF NOT EXISTS items(id TEXT PRIMARY KEY, title TEXT, price REAL)")
con.execute("INSERT OR IGNORE INTO items VALUES(?,?,?)", (uid, title, price))
con.commit()

INSERT OR IGNORE 配合主键,天然实现去重和断点续跑——这点 CSV 要自己写一堆判断才能勉强做到。代价是「人不能直接双击看」,得用工具或几行 SQL 导出。我的经验:数据量过万、或任何需要查询/去重的场景,SQLite 几乎总是比 CSV 值。

JSON:嵌套数据才派上用场

JSON 适合「结构不规则、层层嵌套」的数据——比如一个商品底下有不定数量的规格、评论、图片列表。这种用 CSV 的「平表」会非常别扭(要么拆多张表,要么把数组塞进一个字段)。但 JSON 同样不支持查询和去重,大文件还占空间。所以它通常是我「中间格式」或「最终给程序消费」的格式,不是「边爬边存」的主力。

两个血泪细节:① 编码一定用 utf-8-sig 而不是 utf-8 写 CSV,否则 Excel 打开中文乱码,这坑我替你踩过;② Pandas 的 to_csv / to_sql 很好用,但数据量大时一次性 to_sql 很慢,改成分批 executemany 或 chunk 写入,速度能差几十倍。

说到底,存储选型没有「最优」,只有「最合适当下」。我现在的默认决策流是:先看要不要查/去重——要,上 SQLite;不要、且结构平,CSV;结构嵌套、给程序读,JSON。想清楚这三句,能少返工一大半。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功