使用Python从URL下载Excel文件失败:文件损坏、404错误如何修复?
问题解决方案
问题根源
你遇到的问题本质是生成的URL不正确,导致请求返回404状态码,下载的内容是网站的404错误页面(而非真实Excel文件),所以Excel无法打开,pandas读取时会抛出BadZipFile错误。
具体错误点:
- 目标URL年份是4位格式(如
2024),但你用%y格式化得到的是两位年份(如24),路径不匹配。 - 用
timedelta(30)计算上月的方式不可靠,不同月份天数不同,可能导致月份计算错误。
修复步骤
1. 生成正确的目标URL
替换错误的日期格式化方式,改用4位年份%Y,并准确计算上个月的年月:
from datetime import datetime today = datetime.now() # 计算上个月的年份和月份 if today.month == 1: last_year = today.year - 1 last_month = 12 else: last_year = today.year last_month = today.month - 1 # 格式化月份为两位数字(如3转为03),拼接正确URL url = f'https://www.gso.gov.vn/wp-content/uploads/{last_year}/{last_month:02d}/IIP-ENG.xlsx'
2. 安全下载并验证文件
添加状态码检查,仅当请求成功(状态码200)时才写入文件,避免保存错误页面:
import requests resp = requests.get(url) # 检查请求是否成功 if resp.status_code == 200: # 使用with语句自动关闭文件,更安全 with open('IIP.xlsx', 'wb') as output: output.write(resp.content) print("文件下载成功") else: print(f"下载失败:状态码{resp.status_code},请检查URL是否正确")
3. 读取Excel文件(可选)
确保下载的是有效文件后,再用pandas读取:
import pandas as pd try: df = pd.read_excel('IIP.xlsx', sheet_name=0, engine='openpyxl') print(df.head(5)) except Exception as e: print(f"读取文件失败:{str(e)}")
额外注意事项
- 尽量避免使用
verify=False,除非确认目标网站SSL证书存在问题,否则会带来安全风险。 - 如果目标文件的更新规则不是固定在上月路径,可能需要额外确认文件的实际存储路径规则。
内容的提问来源于stack exchange,提问作者prashanth manohar
相关产品推荐
相关产品推荐

