Python3图片下载脚本运行数小时后意外终止问题求助
解决Python图片下载脚本运行数小时后意外终止的问题
咱们先拆解下可能导致脚本崩溃的核心原因,再一步步优化你的代码——毕竟长时间运行的网络脚本,最容易栽在未处理的异常和资源泄漏上:
1. 你的脚本存在的几个隐患
- 没有异常捕获机制:网络请求随时可能遇到超时、链接失效、服务器报错,这些情况会直接抛出异常终止整个脚本
- 文件资源未正确释放:
open(filename,"wb").write(image)这种写法,虽然Python会自动回收,但长时间运行后可能积累未释放的文件句柄,导致资源耗尽 - 无请求超时设置:遇到服务器无响应时,请求会一直挂着,甚至引发脚本卡住崩溃
- 没有错误日志:出问题后完全不知道是哪一步、哪条数据导致的,根本没法定位
2. 优化后的稳定版脚本
我给你调整了脚本,加上了异常捕获、超时控制、资源自动管理和错误日志,就算出问题也能精准排查:
import csv import requests import logging import time # 配置错误日志,把问题记录到文件里,方便事后排查 logging.basicConfig( filename='download_errors.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s' ) print('download.py map 3_new') with open('3.csv') as csvfile: csvrows = csv.reader(csvfile, delimiter=';', quotechar='"') row_counter = 0 # 加个计数器,方便定位出错的行 for row in csvrows: row_counter += 1 try: # 先判断行数据是否完整,避免索引错误 if len(row) < 2: raise ValueError("行数据不完整,缺少文件名或URL") filename = row[0] url = row[1] # 设置10秒超时,避免请求一直挂着 result = requests.get(url, stream=True, timeout=10) result.raise_for_status() # 主动抛出HTTP错误(比如404、500) # 用with语句自动关闭文件,避免资源泄漏 with open(filename, "wb") as img_file: img_file.write(result.raw.read()) print(f"✅ 成功下载: {filename} (第{row_counter}条)") # 可选:加个1秒间隔,避免频繁请求被服务器封禁 time.sleep(1) except Exception as e: error_info = f"❌ 第{row_counter}条失败 - 文件名: {row[0] if len(row)>=1 else '空'}, URL: {row[1] if len(row)>=2 else '空'}, 错误原因: {str(e)}" print(error_info) logging.error(error_info) # 遇到错误继续执行下一个,不要终止整个脚本 continue
3. 额外排查建议
- 运行脚本时留意控制台的错误输出,或者查看生成的
download_errors.log文件,就能知道具体是哪条数据、什么原因导致的崩溃 - 检查
3.csv里的行是否有格式错误,比如空行、只有一列数据的情况 - 如果服务器限制请求频率,可以适当延长
time.sleep()的间隔时间
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

