You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本通过URL下载Zip文件时出现文件损坏问题

解决Python Requests下载Zip文件损坏的问题

我来帮你排查这个Zip文件损坏的问题~这种情况大多是因为请求没有正确获取到完整的文件内容,或者服务器返回了非预期的响应。下面是几个常见的原因和对应的修复方案:

1. 未验证请求是否成功

你的脚本没有检查请求的响应状态码,如果服务器返回404、500这类错误,你依然会把错误页面的HTML内容写入文件,导致文件看起来是Zip格式,但实际是损坏的无效内容。

修复方式:在写入文件前添加状态码校验,或者直接用raise_for_status()自动抛出HTTP错误异常:

# 替代原有的get请求后,添加这行
r.raise_for_status()  # 若请求失败(状态码>=400)会直接抛出异常

2. 缺失请求头被服务器拦截

很多公共数据网站会拦截没有User-Agent标识的请求,返回不完整的内容或者跳转至验证页面。模拟浏览器的请求头可以避开这类拦截。

修复方式:给requests.get添加请求头参数:

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"
}
r = requests.get(zipUrl, headers=headers)

3. 优化分块下载的效率(可选)

虽然你的分块逻辑没问题,但把chunk_size设得大一点(比如1MB),能减少IO操作次数,降低出现写入不完整的概率。

完整修复后的脚本

把这些优化点整合起来,你的脚本应该改成这样:

import requests

zipUrl = "https://data.gov.il/dataset/dff8a168-af6c-4e0f-bbe3-c4bd3646084c/resource/c68b4df6-c809-4bb5-a546-61fa1528fed5/download/parcel_all.zip"
targetFile = "parcel_all_from_web.zip"

try:
    # 添加模拟浏览器的请求头
    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"
    }
    # 发起请求并允许自动重定向
    r = requests.get(zipUrl, headers=headers, allow_redirects=True)
    # 校验请求是否成功
    r.raise_for_status()
    
    with open(targetFile, 'wb') as f:
        # 用1MB的块大小分块写入
        for chunk in r.iter_content(chunk_size=1024*1024):
            if chunk:
                f.write(chunk)
    print("文件下载完成,现在应该可以正常打开啦!")
except requests.exceptions.HTTPError as e:
    print(f"HTTP请求出错:{e}")
except Exception as e:
    print(f"下载过程遇到问题:{e}")

另外,你可以对比一下原文件的大小和本地下载文件的大小,如果本地文件小很多,说明确实没有获取到完整内容,大概率是请求头或者状态码的问题导致的。

内容的提问来源于stack exchange,提问作者veredflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:57:34