任务跑到第 3000 条左右稳定抛 ConnectionResetError 10054,重跑又在同一位置失败,前面 2999 条都正常。乍看像缓存或者权限的锅,追下去往往不是。
try:
r = s.get(url, timeout=10)
except requests.exceptions.ConnectionError as e:
s.close()
s = requests.Session()
追下去是这么回事:服务端对单条连接的有效请求数或存活时间有上限,到点直接发 RST。客户端一直复用同一条 keep-alive 连接,异常后没有重建。
「连接重置重抓」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。
具体做法是,捕获连接异常后关闭并重建 Session;把失败条目重新放回队列;单条连接最多发 500 个请求就换;失败位置写进断点文件。
验收就看一点,加上重建逻辑后任务跑完 1.2 万条,连接异常出现 3 次全部重抓成功,最终入库 1.2 万条。
