Python使用requests登录网站下载zip包提示压缩包无效如何解决
故障原因与修复方案
你遇到的压缩包无效报错,本质是请求下载地址时没有携带登录凭证,站点返回的不是真实压缩包内容,核心问题和修复方案如下:
- 会话复用错误
你创建了requests.Session()对象维护登录态,但下载文件时调用了独立的requests.get()方法,该方法不会携带之前会话存储的登录Cookie,相当于匿名访问,因此无法获取到有效文件。需要改为使用已登录的会话发起下载请求:r = s.get(file_url) - 大文件下载适配
体积较大的文件直接全量读取响应内容容易出现请求中断、内存溢出的问题,建议开启流式传输模式,分块写入本地文件,避免内容截断。 - 额外注意事项
- 先验证登录是否生效:打印登录请求的响应状态码、页面内容,确认参数名是否和站点要求一致,避免因登录参数错误、缺少CSRF令牌等问题导致登录本身失败
- Windows路径转义:本地存储路径中的
\为Python转义字符,要么改为双反斜杠\\,要么使用原始字符串(路径前加r)避免路径解析错误 - 增加响应校验:下载请求发起后先判断状态码是否为200,再写入文件,避免把错误页内容写入压缩包
修正后可运行代码
import requests # 配置参数 site_url = 'https://rdw.sandag.org/Account/Login' userid = 'xxxx@xxxxxx.org' password = 'xxxxxxxxx' file_url = 'https://rdw.sandag.org/Account/GetFSFile.aspx?dir=Transportation&Name=Roads_All.zip' # 原始字符串避免路径转义问题 local_save_path = r"C:\Folder\Roads_All.zip" # 初始化会话,添加UA模拟浏览器避免被反爬拦截 s = requests.Session() s.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" }) # 访问登录页获取初始Cookie s.get(site_url) # 提交登录请求,可根据站点实际参数调整提交字段 login_response = s.post(site_url, data={'_username': userid, '_password': password}) # 此处可自行增加登录校验逻辑,例如判断跳转地址、响应内容是否包含登录成功标识 # 复用已登录会话下载文件,开启流式传输 download_response = s.get(file_url, stream=True) if download_response.status_code == 200: with open(local_save_path, "wb") as zip_file: # 每次写入1MB内容,适配大文件下载 for chunk in download_response.iter_content(chunk_size=1024 * 1024): if chunk: zip_file.write(chunk) else: print(f"下载请求失败,状态码:{download_response.status_code}")
内容的提问来源于stack exchange,提问作者user16707867
相关产品推荐
相关产品推荐

