You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

批量下载.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

火山引擎 最新活动