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

使用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
      
  • 最后用代码下载你要的文件:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:03:42