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

如何用Python下载非.pdf后缀的PDF文件?请求返回0KB问题求助

解决非PDF后缀URL的PDF文件下载问题

我来帮你搞定这个头疼的问题!手动能正常下载但代码返回0KB,说明你的请求肯定缺了些网站要求的关键细节,咱们一步步排查修复:

可能的问题点&修复方案

1. 没正确使用会话对象

你创建了requests.Session()但直接用了requests.get(),这就白创建会话了!网站可能需要通过会话维持认证状态或者Cookie,改成用会话对象发起请求才能保留必要的状态:

import requests
from requests.auth import HTTPBasicAuth

url = 'https://apps.websitename.com/AccountOnlineWeb/AccountOnlineCommand?command=getBlobImage&image=11/19/2019'
s = requests.Session()
# 用会话对象发起请求,而非直接调用requests.get
r = s.get(url, allow_redirects=True, auth=HTTPBasicAuth('username', 'password'))

2. URL里的&要换成&

你的URL里有&,这是HTML转义后的&符号,服务器可能无法正确解析这个参数,导致返回空内容,直接替换成&就行。

3. 模拟浏览器请求头

很多网站会校验请求的User-Agent、Accept等头信息,判断是不是非浏览器请求。手动访问是浏览器,代码的默认头不一样,加上这些试试:

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',
    'Accept': 'application/pdf,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
r = s.get(url, allow_redirects=True, auth=HTTPBasicAuth('username', 'password'), headers=headers)

4. 检查响应状态码和内容

先打印响应状态码和内容,确认请求是否成功、有没有错误提示:

print(r.status_code)
# 看看响应文本有没有权限错误、参数错误之类的提示
print(r.text)

如果状态码是401,说明认证可能有问题;如果是200但内容是空,那大概率是参数或者请求头不对。

5. 考虑动态生成的延迟情况

你说手动打开要等2秒才加载,可能服务器需要时间生成PDF,不过这个概率较低,但可以试试在请求后加短暂延迟?或者检查是否需要POST请求(不过你手动是GET的话应该还是GET)。

整合后的完整代码

import requests
from requests.auth import HTTPBasicAuth

url = 'https://apps.websitename.com/AccountOnlineWeb/AccountOnlineCommand?command=getBlobImage&image=11/19/2019'
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',
    'Accept': 'application/pdf,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}

s = requests.Session()
r = s.get(url, allow_redirects=True, auth=HTTPBasicAuth('username', 'password'), headers=headers)

# 先确认请求状态和内容长度
print(f"状态码: {r.status_code}")
print(f"响应内容长度: {len(r.content)}")

if r.status_code == 200 and len(r.content) > 0:
    with open('filepath/file.pdf', 'wb') as f:
        f.write(r.content)
    print("PDF下载成功!")
else:
    print("下载失败,检查请求参数或认证信息!")

额外提示

如果还是不行,可以用浏览器的开发者工具(F12)查看手动请求的所有头信息,然后完全复制到代码的headers里,这样最保险——比如Cookie、Referer这些可能也是网站要求的必要参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:02