如何用Python批量下载API返回的自定义语音MP3文件
解决方案:程序化批量下载触发保存对话框的语音文件
这类URL的核心特点是响应头包含 Content-Disposition: attachment; filename="xxx.mp3",强制浏览器弹出保存框,但完全可以用Python的requests模块实现批量下载,问题大概率出在请求头设置或文件保存方式上。以下是直接可用的批量下载方案:
基础批量下载代码
假设你已经整理好待下载的URL列表,按顺序对应1.mp3到6.mp3:
import requests # 替换为你的语音文件URL列表,顺序对应1.mp3、2.mp3... url_list = [ "https://your-api-url/voice-1", "https://your-api-url/voice-2", "https://your-api-url/voice-3", # 继续添加剩余URL ] # 模拟浏览器请求头,避免服务器拦截非浏览器请求 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } for file_idx, url in enumerate(url_list, start=1): try: # 流式请求,避免大文件占用过多内存 response = requests.get(url, headers=headers, stream=True) response.raise_for_status() # 若请求失败(如403/404)直接抛出异常 # 以二进制模式写入文件,命名为指定格式 with open(f"{file_idx}.mp3", "wb") as audio_file: for chunk in response.iter_content(chunk_size=1024): if chunk: audio_file.write(chunk) print(f"已完成:{file_idx}.mp3") except Exception as e: print(f"{file_idx}.mp3 下载失败:{str(e)}")
关键细节说明
- 流式下载:
stream=True让请求分块获取内容,适合音频这类非文本文件,避免一次性加载大文件到内存。 - 请求头模拟:添加
User-Agent是绕过服务器基础反爬的常用手段,若仍被拦截,可补充Referer字段(比如API所在的网页地址)。 - 异常处理:
response.raise_for_status()能快速定位请求失败原因,比如权限不足、URL失效等。
进阶:需要会话认证的情况
如果API需要登录后才能访问(比如携带Cookie),用requests.Session()保持会话即可:
session = requests.Session() # 先完成登录操作(如果需要) # session.post("https://your-api-url/login", data={"username": "xxx", "password": "xxx"}) for file_idx, url in enumerate(url_list, start=1): response = session.get(url, headers=headers, stream=True) # 后续保存步骤同上
排查技巧
如果下载失败,先做以下检查:
- 打印
response.status_code,确认是否为200(成功);403可能是权限问题,404是URL无效。 - 打印
response.headers,查看Content-Type是否为audio/mpeg类音频格式,确认URL指向正确资源。
内容的提问来源于stack exchange,提问作者Jitender
相关产品推荐
相关产品推荐

