如何按HTTP状态码分类保存多格式批量下载文件至对应文件夹
批量文件下载优化方案
核心优化方向
针对你的需求,直接解决原代码硬编码、单文件限制、逻辑混乱等问题,重点优化如下:
- 批量处理任意数量URL,无需逐个定义变量
- 按HTTP状态码自动分流到
good(200)、bad(非200)、general(全量备份)三个文件夹 - 完全保留每个文件的原生文件名和扩展名,不再硬编码固定文件名
- 用
os模块处理路径,兼容Windows/macOS/Linux,避免手动写分隔符的坑 - 修复原代码中空判断、重复写入文件的逻辑错误
- 增加基础异常处理,避免单个URL失败导致整个程序崩溃
完整实现代码
import requests import os # 定义三个目标文件夹的根路径(替换成你自己的桌面路径) BASE_DIR = r"C:\Users\user\Desktop" FOLDERS = { "good": os.path.join(BASE_DIR, "good"), "bad": os.path.join(BASE_DIR, "bad"), "general": os.path.join(BASE_DIR, "general") } # 提前创建所有文件夹,避免写入时出错 for folder_path in FOLDERS.values(): os.makedirs(folder_path, exist_ok=True) def download_and_save(link): # 提取URL中的原生文件名(处理带参数的URL,比如?xxx的情况) filename = link.split('/')[-1].split('?')[0] if not filename: print(f"无法从链接提取文件名: {link}") return try: # 可选:取消注释启用代理 # proxies = {'https': 'http://5.135.240.70:8080'} # r = requests.get(link, allow_redirects=True, proxies=proxies, timeout=10) r = requests.get(link, allow_redirects=True, timeout=10) r.raise_for_status() # 主动抛出非200的HTTP错误 print(f"处理链接: {link} | 状态码: {r.status_code} | 文件名: {filename}") # 保存到good文件夹(仅200状态码) good_path = os.path.join(FOLDERS["good"], filename) with open(good_path, "wb") as f: f.write(r.content) # 保存到general文件夹(所有状态码都备份) general_path = os.path.join(FOLDERS["general"], filename) with open(general_path, "wb") as f: f.write(r.content) except requests.exceptions.HTTPError as e: # 处理非200的状态码 status_code = e.response.status_code print(f"链接失败: {link} | 状态码: {status_code} | 文件名: {filename}") # 保存到bad文件夹 bad_path = os.path.join(FOLDERS["bad"], filename) with open(bad_path, "wb") as f: f.write(e.response.content) # 同时备份到general文件夹 general_path = os.path.join(FOLDERS["general"], filename) with open(general_path, "wb") as f: f.write(e.response.content) except Exception as e: print(f"处理链接时出错: {link} | 错误信息: {str(e)}") # 批量处理的URL列表(可任意添加/修改) url_list = [ "https://example.com/file1.txt", "https://example.com/image.jpeg", "https://example.com/script.php", "https://example.com/rules.conf" ] # 遍历所有URL执行下载 for url in url_list: download_and_save(url)
关键细节说明
- 路径处理:用
os.path.join自动拼接路径,避免跨平台路径分隔符冲突;os.makedirs(..., exist_ok=True)确保文件夹存在,不会因已存在报错。 - 文件名提取:通过
split('/')[-1].split('?')[0]处理带参数的URL,确保只保留真实的文件名和扩展名。 - 状态码分流:利用
requests的raise_for_status()方法自动捕获非200状态码,分别处理good和bad文件夹的写入,同时所有文件备份到general文件夹。 - 异常处理:覆盖HTTP错误和通用异常,避免单个URL失败导致程序终止,同时打印清晰的错误信息便于排查。
- 批量扩展:只需在
url_list中添加新URL即可,无需修改核心逻辑,支持任意数量的文件下载。
原代码问题修复
- 移除无意义的
while True循环和空if()判断 - 取消硬编码文件名,改为从URL提取原生文件名
- 修复重复写入文件的逻辑混乱问题
- 替换硬编码路径,改用
os模块处理,提升兼容性
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

