如何在Python/Jupyter Notebook中下载需CC BY4.0授权的Excel文件
解决ICOS Global Carbon Budget Excel文件自动下载(需同意许可证)的问题
你遇到的核心问题是:目标链接并非直接指向Excel文件,而是需要先同意Creative Commons许可证的跳转页面——服务器返回的是许可证确认的HTML页面,而非文件内容,因此直接用pd.read_excel()会解析失败。
以下是可自动完成许可证同意、下载并读取文件的解决方案,基于requests和BeautifulSoup处理表单提交,全程保持会话状态完成流程:
步骤说明
- 用
requests.Session()维持会话,确保同意许可证后的Cookie状态被保留 - 解析初始页面的许可证同意表单,提取提交地址和必要参数
- 提交同意表单,获取真实的文件下载资源
- 读取二进制文件内容并转为pandas DataFrame
完整代码
import requests import pandas as pd from bs4 import BeautifulSoup from io import BytesIO # 目标ICOS对象链接 target_url = "https://data.icos-cp.eu/objects/1umMtgeUlhS2Y1YW_Qp94bu3" # 初始化会话,保持状态 session = requests.Session() # 1. 获取许可证同意页面,解析表单 resp = session.get(target_url) soup = BeautifulSoup(resp.text, "html.parser") # 定位同意许可证的表单 license_form = soup.find("form", id="acceptLicenseForm") form_action = license_form["action"] # 提取表单隐藏参数 form_data = { input_tag["name"]: input_tag["value"] for input_tag in license_form.find_all("input", type="hidden") } # 添加同意许可证的勾选参数 form_data["accept"] = "on" # 2. 提交同意表单,跳转至文件页面 resp = session.post(form_action, data=form_data) # 3. 下载文件并读取为DataFrame file_resp = session.get(resp.url) df = pd.read_excel(BytesIO(file_resp.content)) # 验证数据 print(df.head())
注意事项
- 如果后续页面表单结构(如
id、参数名)发生变化,可通过浏览器开发者工具查看页面源码,调整表单定位和参数提取逻辑 requests默认会自动处理重定向,提交表单后无需手动跟进跳转- 该方法全程自动化,符合科研代码透明性要求,无需手动干预下载
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

