使用requests库下载PDF失败:下载文件无法读取,求解决方法
问题:使用requests库下载的PDF文件无法读取
我编写了一段使用requests库从指定链接下载PDF的代码,但下载完成后的文件无法正常读取,怀疑链接可能不是有效的PDF下载链接,但作为新手无法确定具体原因,希望得到帮助:
import requests url = "https://disclosure.bursamalaysia.com/FileAccess/apbursaweb/download?id=231746&name=EA_DS_ATTACHMENTS" response = requests.get(url) with open("EA_DS_ATTACHMENTS.pdf", "wb") as f: f.write(response.content) print("PDF downloaded successfully!")
解决方案
这种情况通常是网站对请求做了验证,直接发送的requests.get()请求未通过验证,返回的并非真实PDF内容(可能是HTML错误页面、人机验证页面等),导致保存的文件无法打开。可以按以下方式排查和修复:
- 添加请求头模拟浏览器访问
很多网站会检查请求的User-Agent字段,判断请求是否来自合法浏览器。添加该字段可绕过基础验证:
import requests url = "https://disclosure.bursamalaysia.com/FileAccess/apbursaweb/download?id=231746&name=EA_DS_ATTACHMENTS" # 模拟Chrome浏览器请求头,可根据自己的浏览器调整 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(url, headers=headers) # 先校验响应内容类型是否为PDF if response.headers.get("Content-Type") == "application/pdf": with open("EA_DS_ATTACHMENTS.pdf", "wb") as f: f.write(response.content) print("PDF downloaded successfully!") else: print(f"未获取到有效PDF,响应内容类型: {response.headers.get('Content-Type')}") # 打印部分响应内容,查看返回的是什么页面 print(response.text[:500])
- 使用Session维持会话状态
部分网站需要先访问主页完成会话初始化,才能正常下载文件,此时可使用requests.Session()维持会话:
import requests url = "https://disclosure.bursamalaysia.com/FileAccess/apbursaweb/download?id=231746&name=EA_DS_ATTACHMENTS" 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" } with requests.Session() as session: # 先访问网站主页初始化会话 session.get("https://disclosure.bursamalaysia.com", headers=headers) response = session.get(url, headers=headers) if response.headers.get("Content-Type") == "application/pdf": with open("EA_DS_ATTACHMENTS.pdf", "wb") as f: f.write(response.content) print("PDF downloaded successfully!") else: print(f"未获取到有效PDF,响应内容类型: {response.headers.get('Content-Type')}")
- 验证链接本身有效性
如果上述方法都无效,直接把链接复制到浏览器中打开:- 若浏览器能正常下载PDF,说明是请求验证的问题,可进一步排查请求头或会话参数;
- 若浏览器也无法下载,说明链接可能需要登录权限,或者已经过期失效。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

