使用Python Requests无法通过直链下载文件的问题排查
问题描述
我尝试通过直链下载文件,在浏览器和Postman中都能成功完成下载,但使用Python Requests时,即使设置allow_redirects=False仍收到302状态码,且resp.headers["location"]返回的链接和原链接不一致。以下是我的操作代码(出于隐私考虑隐藏了真实链接):
... url = "https://store10.gofile.io/download/******************/test.txt" resp = requests.get(url, allow_redirects=False) print(resp.headers['location']==url) # 输出 "False" with open(out, 'wb') as f: for chunk in resp.iter_content(chunk_size=1024): if chunk: f.write(chunk)
解决方案
- 模拟浏览器请求头:GoFile这类存储服务会校验请求的User-Agent,浏览器和Postman自带合法的UA标识,而Requests默认UA会被判定为非浏览器请求,触发重定向。给请求添加标准浏览器UA即可解决:
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' } resp = requests.get(url, headers=headers, allow_redirects=False)
- 自动跟随重定向下载:如果不需要刻意阻止重定向,直接去掉
allow_redirects=False(Requests默认开启自动跟随),就能自动跳转到真实文件链接并获取内容:
resp = requests.get(url, headers=headers) with open(out, 'wb') as f: f.write(resp.content)
- 携带会话Cookie:部分存储服务会依赖浏览器会话中的Cookie验证请求合法性,你可以在浏览器开发者工具的“网络”面板中复制对应请求的Cookie,添加到请求头里:
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', 'Cookie': '从浏览器复制的Cookie内容' }
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

