批量下载.docx和.pdf文件至指定文件夹的Python脚本问题
解决文件下载损坏与指定文件夹保存的问题
首先来说你遇到的第一个问题——下载的文件损坏:
你最初的requests.get()直接获取内容的方式,可能因为没有处理HTTP重定向、缺少必要请求头(比如很多网站会拦截无User-Agent的请求),或者文件较大时一次性读取内容导致截断,才会生成只有266字节的损坏文件。
修复单个文件下载的代码可以这样写,加上重定向处理和请求头,同时用流式下载更稳妥:
import requests url = 'http://website.com/Motivation-Letter.docx' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} # 允许重定向,添加请求头模拟浏览器 response = requests.get(url, headers=headers, allow_redirects=True, stream=True) # 检查请求是否成功,失败则抛出异常 response.raise_for_status() with open("my_file.docx", 'wb') as f: # 分块写入,避免大文件内存溢出 for chunk in response.iter_content(chunk_size=8192): f.write(chunk)
接下来处理你更新后的需求:将文件保存到新建文件夹。你现有的代码有几个可以优化的点:比如路径拼接的写法容易出错,没有判断文件夹是否存在,也缺少异常处理。修改后的代码如下:
import os import shutil import requests def download_file(url, folder_name): # 自动创建目标文件夹,已存在时不会报错 os.makedirs(folder_name, exist_ok=True) # 从URL末尾提取文件名 local_filename = url.split('/')[-1] # 用os.path.join自动适配不同系统的路径分隔符,避免手动拼接斜杠出错 path = os.path.join(folder_name, local_filename) try: # 添加请求头模拟浏览器,防止被拦截 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} with requests.get(url, headers=headers, stream=True, allow_redirects=True) as r: r.raise_for_status() # 请求失败时抛出异常,便于排查 with open(path, 'wb') as f: shutil.copyfileobj(r.raw, f) print(f"文件 {local_filename} 已成功保存到 {folder_name}") return local_filename except Exception as e: print(f"下载 {url} 时出错: {str(e)}") return None # 调用示例 download_file('http://website.com/Motivation-Letter.docx', 'downloaded_docs')
几个关键优化点:
- 用
os.makedirs(folder_name, exist_ok=True)自动创建文件夹,无需手动判断是否存在 - 用
os.path.join拼接路径,完美适配Windows/Linux/macOS的路径规则 - 添加
User-Agent请求头,避免被网站的反爬机制拦截 - 加入异常捕获和请求状态检查,方便快速定位下载失败的原因
- 保留流式下载逻辑,适合处理大体积的docx或pdf文件
内容的提问来源于stack exchange,提问作者Chaudhry Talha




