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

如何在Python中实现wget --content-disposition的下载功能?

解决Python下载加拿大环境部气候CSV时的400错误问题

你猜的没错,wget的--content-disposition参数核心是让工具遵循HTTP响应头里的Content-Disposition规则处理文件名,不过你遇到的400错误更可能是因为Python默认请求头被网站拦截了——很多站点会拒绝带有Python-urllib/xxx标识的请求,而wget自带的请求头更容易被放行。下面给你几个实用的解决办法:

方案1:用Python的wget模块直接对应原命令逻辑

Python有个第三方wget库,完美复刻了原生wget的--content-disposition功能,用法超简单:

先安装库:

pip install wget

然后写代码:

import wget

# 替换成你的加拿大环境部CSV链接
target_url = "你的目标CSV地址"
# 设置out=None就会自动从Content-Disposition头里提取文件名保存,和wget --content-disposition效果一致
wget.download(target_url, out=None)

方案2:手动改造urllib请求(无需额外装库)

如果不想加新依赖,可以给urllib补上正确的请求头,再手动解析Content-Disposition获取文件名:

import urllib.request
import re

target_url = "你的目标CSV地址"

# 模拟浏览器的请求头,避免被网站判定为爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
req = urllib.request.Request(target_url, headers=headers)

with urllib.request.urlopen(req) as response:
    # 从响应头里提取文件名
    content_disposition = response.getheader('Content-Disposition')
    if content_disposition:
        # 用正则匹配出文件名
        filename = re.findall(r'filename="?([^"]+)"?', content_disposition)[0]
    else:
        #  fallback:从URL末尾提取文件名
        filename = target_url.split('/')[-1]
    
    # 写入本地文件
    with open(filename, 'wb') as f:
        f.write(response.read())

方案3:用requests库更简洁实现

requests比urllib更易用,处理请求头和响应头都更顺手:

先安装:

pip install requests

代码示例:

import requests
import re

target_url = "你的目标CSV地址"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

# 发送请求,自动处理状态码
response = requests.get(target_url, headers=headers)
response.raise_for_status()

# 解析文件名
content_disposition = response.headers.get('Content-Disposition')
if content_disposition:
    filename = re.findall(r'filename="?([^"]+)"?', content_disposition)[0]
else:
    filename = target_url.split('/')[-1]

# 保存文件
with open(filename, 'wb') as f:
    f.write(response.content)

补充说明:为什么原urllib.request.urlretrieve会失败?

核心原因是urlretrieve默认发送的User-Agent是Python-urllib/xxx,很多网站会拦截这种请求返回400错误;而wget默认的请求头是Wget/xxx,更容易被站点放行。解析Content-Disposition只是为了获取正确的文件名,解决400的关键是添加符合浏览器规范的请求头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:01