如何在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
相关产品推荐
相关产品推荐

