使用Python下载Kaggle数据集时遇请求方法致CSV文件损坏问题
解决用Python requests下载Kaggle数据集得到损坏HTML的问题
嘿,我太懂你这种糟心的情况了——用requests下载Kaggle数据集,结果打开一看是个损坏的HTML文件,根本不是想要的CSV。这问题其实出在两个核心点:你用的那个链接是Kaggle的数据集展示页面,不是真实的文件下载地址;而且Kaggle的登录验证逻辑没处理好,直接请求的话会被跳转到登录页面,自然下载到的是网页内容。
下面给你两个解决方案,优先选第一个,省心又稳定:
最省心的方案:用Kaggle官方API(强烈推荐)
Kaggle专门提供了官方Python库来处理数据集下载,完全不用自己折腾链接和登录,步骤超简单:
- 先安装kaggle库:
pip install kaggle - 去你的Kaggle账号页面(右上角头像→Account),找到「Create New API Token」,点击后会下载一个
kaggle.json文件,里面存着你的API密钥。 - 把这个文件放到指定位置:
- Windows用户:放到
C:\Users\<你的用户名>\.kaggle\kaggle.json - Linux/macOS用户:放到
~/.kaggle/kaggle.json,还要执行命令设置权限(避免安全警告):chmod 600 ~/.kaggle/kaggle.json
- Windows用户:放到
- 最后用代码下载你要的文件:
这样运行完,你就能在当前目录拿到完整可用的from kaggle.api.kaggle_api_extended import KaggleApi # 初始化并验证API api = KaggleApi() api.authenticate() # 下载指定数据集里的单个文件,格式是「用户名/数据集名」,后面跟文件名 api.dataset_download_file('crawford/gene-expression', 'actual.csv', path='./')actual.csv了。
手动用requests处理(不推荐,仅作参考)
如果你非要用requests手动实现,就得模拟完整的登录流程,还要找到真实的文件下载链接(这个链接是Kaggle存在云存储里的,不是网页链接),步骤比较繁琐,而且Kaggle页面更新后可能失效:
- 首先用Session维持登录会话,先获取登录页面的CSRF令牌:
import requests from bs4 import BeautifulSoup session = requests.Session() # 访问登录页面,获取CSRF令牌和会话Cookie login_page = session.get('https://www.kaggle.com/account/login') soup = BeautifulSoup(login_page.text, 'html.parser') csrf_token = soup.find('input', {'name': '__RequestVerificationToken'}).get('value') - 然后发送登录请求,带上用户名、密码和CSRF令牌:
login_data = { 'UserName': 'myUsername', 'Password': 'myPassword', '__RequestVerificationToken': csrf_token } # 发送登录请求,注意这里要用post方法 session.post('https://www.kaggle.com/account/login', data=login_data) - 最后请求真实的文件下载链接(这个链接需要你自己抓包获取:打开Kaggle数据集页面,点击下载按钮,在浏览器的开发者工具→网络里找到对应的下载请求,复制它的URL):
# 替换成你抓包得到的真实下载链接 real_download_url = 'https://storage.googleapis.com/kaggle-data-sets/xxxx/xxxx/actual.csv' file_response = session.get(real_download_url) # 保存文件 with open('actual.csv', 'wb') as f: f.write(file_response.content)
总的来说,官方API是最优解,不用操心各种验证和链接变化的问题,手动用requests很容易踩坑。
内容的提问来源于stack exchange,提问作者Johnson
相关产品推荐
相关产品推荐

