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

Python GET请求无法触发文件下载,浏览器访问同URL可自动下载

解决Python GET请求无法下载文件但浏览器可以的问题

这种情况我之前也碰到过!问题大概率出在请求头模拟不完整或者响应内容处理方式不对上,咱们一步步来排查和解决:

1. 补全请求头,模拟浏览器行为

浏览器发送请求时会附带很多标识信息,网站常通过这些信息判断请求是否来自合法客户端。Python的requests库默认请求头非常简单,很容易被拦截或返回非预期内容。你需要把Firefox开发者工具里看到的请求头完整复制到代码中,重点关注这几个字段:

  • User-Agent:标识客户端类型,必须和浏览器一致
  • Referer:如果网站有来源校验,这个字段不能少
  • Cookie:如果需要登录才能下载,必须带上有效的Cookie值

示例代码:

import requests

# 从Firefox开发者工具复制完整请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0",
    "Referer": "https://目标网站的来源页面URL",
    "Cookie": "这里粘贴你复制的完整Cookie字符串",
    # 其他你看到的请求头字段也可以一起加上
}

# 发送GET请求
response = requests.get("你的目标下载URL", headers=headers)
# 先检查响应状态码,确保是200(成功)
assert response.status_code == 200, f"请求失败,状态码:{response.status_code}"

2. 解码Base64响应内容并保存文件

你提到响应中可见文件内容对应的Base64字符串,这说明服务器没有直接返回二进制文件,而是返回了编码后的文本。此时需要手动解码后再保存:

示例代码:

import base64

# 提取响应中的Base64内容(如果响应是JSON格式,要先解析JSON再取对应字段)
base64_content = response.text.strip()

# 解码Base64为二进制文件内容
file_binary = base64.b64decode(base64_content)

# 将二进制内容写入文件
with open("下载的文件.pdf", "wb") as f:  # 替换成你需要的文件名和后缀
    f.write(file_binary)

额外排查点

  • 如果请求返回403/401状态码:说明网站有反爬或权限校验,除了Cookie,可能还需要添加Authorization等认证头
  • 如果响应内容是压缩格式:可以尝试添加Accept-Encoding头,或者用response.content直接获取二进制内容后解压

你可以先按上面的步骤尝试,应该就能解决浏览器能下载但Python代码不行的问题啦!

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

火山引擎 最新活动