使用Python requests下载PDF出现空白无法读取问题求助
修复PDF下载损坏与速度慢的问题
嘿,我来帮你解决这两个头疼的问题:下载耗时久、保存后的PDF无法正常打开。咱们先拆解问题,再给出修复后的代码~
核心问题分析
1. PDF损坏的直接原因
你用了文本模式('w')来保存二进制的PDF文件,这会破坏文件的字节结构,导致Acrobat无法识别。二进制文件必须用二进制写入模式('wb')。
2. 循环逻辑冗余(拖慢速度+无效写入)
当前代码里,每获取一个城市的PDF,就会遍历所有market_name写入6次文件——这不仅浪费资源拖慢速度,还没把城市代码和对应市场名称关联起来,属于逻辑错误。
3. 下载慢的潜在原因
- 没有设置请求超时,一旦服务器响应慢,程序会无限制等待
- 没有模拟浏览器请求头,部分服务器会对非浏览器请求做限速或拦截
修复后的完整代码
import requests from datetime import date import os market_type = "ECenter" market_name = ["Minden", "Porta-Westfalica", "Osnabruck", "Melle", "Bad Nenndorf", "Herford"] weekNumber = date.today().isocalendar()[1] city_codes = ["3315", "3317", "3309", "3323", "3325", "3328"] # 确保保存目录存在,避免报错 save_dir = 'C:\\Users\\user\\Desktop\\LeafletFiles' os.makedirs(save_dir, exist_ok=True) # 模拟浏览器请求头,避免服务器拦截/限速 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 配对城市代码和市场名称,消除冗余循环 for city_code, name in zip(city_codes, market_name): url = f"https://static.edeka.de/media/handzettel/MINDEN/{city_code}/blaetterkatalog/pdf/complete.pdf" try: # 添加超时参数(10秒,可按需调整),避免无限等待 myfile = requests.get(url, headers=headers, timeout=10) # 检查请求是否成功(状态码200为正常) myfile.raise_for_status() # 用二进制写入模式保存PDF file_path = f'{save_dir}\\{market_type}_{name}_{weekNumber}.pdf' with open(file_path, 'wb') as pdf: pdf.write(myfile.content) print(f"✅ 成功保存:{file_path}") except requests.exceptions.RequestException as e: print(f"❌ 下载{name}的PDF失败:{str(e)}")
关键修改点说明
- 二进制写入:把
'w'改成'wb',确保PDF字节流完整不被破坏 - 配对遍历:用
zip(city_codes, market_name)让每个城市代码对应唯一的市场名称,消除无效循环 - 请求优化:添加
headers模拟浏览器,设置timeout防止长时间卡顿 - 目录检查:自动创建保存目录,避免因文件夹不存在报错
- 异常处理:捕获请求过程中的错误(超时、404等),让程序更健壮
额外小建议
如果偶尔遇到网络波动导致下载失败,可以考虑加入重试机制(比如用tenacity库),应对临时的服务器响应问题。
内容的提问来源于stack exchange,提问作者Satyam Arora
相关产品推荐
相关产品推荐

