with open('progress.txt', 'w') as f:
f.write(str(page))
start = int(open('progress.txt').read() or 1)
抓 1.2 万页的任务在第 7300 页被 kill,重启后进度归零,从第 1 页重新开始,重复请求 7300 次,多花 40 分钟。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,进度变量存在进程内的字典里,进程退出就没了。入库又是最后统一提交,中途没有任何持久化点。
「抓取断点记录」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:每处理完一页写一条进度;进度落到文件或 sqlite 而不是内存;启动时读最后一页接着跑;入库按 url 唯一键兜住重复。
改完只确认一件事:再中断一次后重启从第 7301 页继续,重复请求 0 次,总耗时只比一次跑完多 20 秒。
