使用Python的request.get()下载assist.org文件出现损坏问题求助
解决assist.org转学协议PDF下载损坏的问题
你的问题核心是请求头缺失导致服务器返回非真实PDF内容,assist.org的服务器会验证请求的客户端信息和来源,直接用requests.get不带自定义头的话,返回的是浏览器渲染用的页面而非原始PDF,最终导致文件损坏。
修正后的代码需要添加模拟浏览器的请求头,同时优化下载逻辑:
import requests def download_file(file_number): url = f"https://assist.org/transfer/report/{file_number}" # 模拟Safari浏览器的请求头,可根据实际浏览器版本调整 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15", "Accept": "application/pdf,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.9", "Referer": "https://assist.org/" } # 流式下载处理大文件,避免内存占用过高 with requests.get(url, headers=headers, stream=True) as response: response.raise_for_status() # 主动抛出HTTP错误,便于排查问题 with open(f"report_{file_number}.pdf", "wb") as file: for chunk in response.iter_content(chunk_size=8192): file.write(chunk) print(f"File 'report_{file_number}.pdf' downloaded successfully!") file_number = "26917146" download_file(file_number)
关键调整说明:
- 请求头配置:
User-Agent让服务器识别为合法浏览器请求,Accept明确指定优先接收PDF格式,Referer表明请求来源为assist.org官网,这些字段是服务器验证请求合法性的关键。 - 流式下载:用
stream=True分块写入磁盘,比一次性加载整个文件到内存更高效,也避免大文件导致的内存溢出。 - 错误处理:
response.raise_for_status()会在HTTP状态码异常时直接抛出异常,方便快速定位问题。
测试后,下载的PDF可在MacOS Preview中正常打开。后续遍历下拉菜单批量下载时,建议使用requests.Session()维持会话状态,减少重复连接被服务器限制的风险。
内容的提问来源于stack exchange,提问作者str1
相关产品推荐
相关产品推荐

