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

