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

Python下载Zip文件始终损坏,手动下载正常,求技术解决方案

下载Zip文件时自动脚本获取损坏文件但手动正常的原因及解决思路

可能的原因

  • 关键请求头缺失:手动下载时,浏览器会自动携带Cookie、User-Agent、Referer等头信息,网站可能会验证这些信息识别请求来源。如果脚本(比如Requests)没带上这些头,网站可能返回截断内容,或者直接拒绝完整响应。
  • Selenium下载未等待完成:调用.click()触发下载后,脚本可能没等文件完全写入磁盘就退出,导致文件不完整。另外,浏览器默认下载设置可能存在权限问题,或者没正确处理动态生成的下载请求。
  • 网站反爬/流量限制:部分网站会检测请求是否来自自动化脚本,对非手动请求做内容截断或速率限制,只返回部分文件数据;还有些网站需要页面通过JS渲染后才能生成有效下载链接,直接点击元素或请求静态URL时,JS逻辑还未执行完毕,导致请求无效资源。
  • 分块传输处理不当:如果网站采用分块传输(Chunked Transfer Encoding)返回文件,Requests默认的处理方式可能没正确拼接分块数据,导致文件损坏;而浏览器会自动处理分块传输,所以手动下载正常。

对应的解决思路

补全Requests请求头并优化下载方式

复制浏览器手动下载时的请求头(可通过开发者工具Network面板查看),加到Requests请求中,同时使用流式下载确保完整接收:

import requests

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',
    'Referer': 'https://www.dupageresults.gov/',
    'Cookie': '替换为浏览器中的Cookie内容'
}

url = 'https://www.dupageresults.gov//IL/DuPage/115972/314432/reports/summary.zip'
response = requests.get(url, headers=headers, stream=True)

with open('summary.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024*1024):
        if chunk:
            f.write(chunk)

优化Selenium下载流程

设置浏览器下载路径,使用显式等待确保元素可点击,并且等待文件完全下载完成后再退出:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import time

# 设置下载目录
download_dir = os.path.abspath('./downloads')
os.makedirs(download_dir, exist_ok=True)

# 配置Chrome选项
chrome_options = webdriver.ChromeOptions()
prefs = {
    "download.default_directory": download_dir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True
}
chrome_options.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(options=chrome_options)
driver.get('目标页面的完整URL')

# 等待元素可点击后再点击
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//div[@class="card contest-loader"]'))
).click()

# 等待文件下载完成
while not any(f.endswith('.zip') for f in os.listdir(download_dir)):
    time.sleep(1)
# 额外等待确保文件写入完成
time.sleep(3)

driver.quit()

验证真实下载链接

打开浏览器开发者工具的Network面板,手动触发下载,查看实际的下载请求URL和参数。有些网站会通过JS生成带临时签名的下载链接,直接使用静态URL请求会导致获取不完整文件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:50:31