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
相关产品推荐
相关产品推荐

