爬虫数据按小时归类并自动打包为标准zip,核心是时间戳标记→目录分时归集→精准压缩;每小时生成独立目录(如./data/20260721_14/),数据直接写入;整点打包上一小时非空目录,zip内保持相对路径、命名规范(rawdata_20260721_14.zip),并校验有效性。

爬虫数据落地后按小时归类并自动打包为标准 ZIP,核心在于三步:时间戳标记 → 目录分时归集 → 精准压缩。关键不是“先存再压”,而是“边落边分、定时打包”,避免文件混杂、路径冗余或漏压。
按小时生成独立数据目录
每次爬取完成,用 datetime.now().strftime("%Y%m%d_%H") 生成小时级目录名(如 20260721_14),将原始数据(JSON/CSV/HTML等)直接写入该目录,不落地到公共文件夹。示例:
- 数据保存路径统一为:
./data/20260721_14/item_123.json - 同一小时内所有数据都进同一个小时目录,跨小时自动新建目录
- 用
os.makedirs(dir_path, exist_ok=True)确保目录存在,无需手动创建
定时触发打包(推荐每小时整点执行)
不依赖系统 cron 也可实现,用简单循环 + sleep 控制节奏。重点是只打包“已完整结束”的小时目录(即当前时间已过该小时):
- 计算上一小时目录名:
prev_hour = (datetime.now() - timedelta(hours=1)).strftime("%Y%m%d_%H") - 检查
./data/{prev_hour}/是否存在且非空(os.listdir()非空) - 存在则立即打包,完成后可选清空原目录或保留归档源
打包时保持结构、规避路径陷阱
用 zipfile.ZipFile 写入时必须显式指定 arcname,否则会把完整绝对路径(如 /home/user/data/20260721_14/...)打进 ZIP,解压后出现多层嵌套。正确做法:
- 遍历小时目录内所有文件:
for root, _, files in os.walk(hour_dir): - 对每个
file_path,计算其在 ZIP 中的相对路径:arcname = os.path.relpath(file_path, hour_dir) - 调用
zipf.write(file_path, arcname)—— 解压后直接得到item_123.json,而非data/20260721_14/item_123.json - 压缩方式建议用
zipfile.ZIP_DEFLATED;若纯归档不需压缩,用ZIP_STORED更快更省内存
输出 ZIP 命名规范且带校验
ZIP 文件名体现时间、内容与状态,便于追踪和调度:
- 命名格式:
rawdata_20260721_14.zip(对应 14:00–14:59 数据) - 输出路径建议独立,如
./archives/,避免和原始数据混在一起 - 打包完成后,用
zipfile.is_zipfile()快速验证生成文件是否有效 - 可选:写入一个
_MANIFEST.json到 ZIP 内,记录文件数、总大小、起止时间戳











