You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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)

关键细节说明

  1. 路径处理:用os.path.join自动拼接路径,避免跨平台路径分隔符冲突;os.makedirs(..., exist_ok=True)确保文件夹存在,不会因已存在报错。
  2. 文件名提取:通过split('/')[-1].split('?')[0]处理带参数的URL,确保只保留真实的文件名和扩展名。
  3. 状态码分流:利用requests的raise_for_status()方法自动捕获非200状态码,分别处理good和bad文件夹的写入,同时所有文件备份到general文件夹。
  4. 异常处理:覆盖HTTP错误和通用异常,避免单个URL失败导致程序终止,同时打印清晰的错误信息便于排查。
  5. 批量扩展:只需在url_list中添加新URL即可,无需修改核心逻辑,支持任意数量的文件下载。

原代码问题修复

  • 移除无意义的while True循环和空if()判断
  • 取消硬编码文件名,改为从URL提取原生文件名
  • 修复重复写入文件的逻辑混乱问题
  • 替换硬编码路径,改用os模块处理,提升兼容性

内容的提问来源于stack exchange,提问作者Rod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:55:15