长久以来,我和小伙伴们都被 Kaggle 网站的加载速度困扰着,比如最近在用 Kaggle 上的数据集测试模型效果时,遇到排行榜(Leaderboard)刷新困难的问题。于是我们开始探索解决方案。

首先尝试直接使用页面链接进行数据爬取,很明显爬不到,因为 Kaggle 的数据是异步响应的。于是我打开 Leaderboard 页面的开发者工具,以著名的 Titanic 竞赛的排行榜为例,打开 Network 选项,查看 XHR 项,然后 ctrl+R 刷新页面,可以看到如下列表:

我用红框圈起来的这个就是我们要找的排行榜数据,点击它后可以看到它的 Request URL 如下:

然后把这个链接复制到浏览器打开,就可以看到一大段 JSON 形式的排行榜数据:

这里推荐使用在线 JSON 校验格式化工具 Be JSON 来将这些数据重新排版,只需要粘贴过去使用“格式化校验”功能,就可以通过更好的排版方式来查看数据了。然后我们很容易看出,整个结果是一个大的字典,里面包含着小字典:

  • submissions:其中又包含若干个小字典,每个字典存储一个队伍的信息及其战绩,包括名次、队名、分数、提交次数、最后一次提交时间等
  • beforeUser:包含前50名队伍的信息及战绩
  • afterUser:包含50名以后的全部队伍信息及战绩

而我们只需要解析出 beforeUser 和 afterUser 中的数据就可以了,下面是具体的实现过程。

首先确定自己想要抓取 public 榜还是 private 榜,只有已经结束的比赛才公开了 private 榜,否则只能抓到 public 榜。具体抓数据代码如下:

import urllib3  # pip install -i https://pypi.anaconda.org/pypi/simple urllib3if type == 'public':url = 'https://www.kaggle.com/c/{competition}/leaderboard.json?includeBeforeUser=true&includeAfterUser=true'.format(competition=competition)
elif type == 'private':url = 'https://www.kaggle.com/c/{competition}/leaderboard.json?includeBeforeUser=true&includeAfterUser=true&type=private'.format(competition=competition)
else:print('榜单类型有误,请检查')http = urllib3.PoolManager()
response = http.request('GET', url)

然后对抓取到的数据进行解析,取出我们需要的信息,构成更易读的 dataframe 形式:

import pandas as pd
import jsonranks0 = str(response.data).replace("\\", "")
ranks1 = json.loads(ranks0[2:-1])['beforeUser']
ranks2 = json.loads(ranks0[2:-1])['afterUser']ranks = ranks1 + ranks2team_list = list(ranks)rank_score = pd.DataFrame(columns=['rank', 'teamName', 'entries', 'lastSubmission', 'score'])for team in team_list:rank = team.get('rank')teamName = team.get('teamName')entries = team.get('entries')lastSubmission = team.get('lastSubmission')score = team.get('score')rank_score = rank_score.append({'rank': rank, 'teamName': teamName, 'entries': entries, 'lastSubmission': lastSubmission, 'score': score},ignore_index=True)rank_score

至此,我们就得到一个比赛的全部排行榜数据啦,封装好的代码请移步 Github,下载项目后直接在命令行执行:

python main.py titanic private

python main.py titanic public

就可以把排行榜数据作为 csv 文件存到本地啦。


分享更多关于数据挖掘的有趣内容,欢迎大家关注公众号哦:

用 Python 写一个 Kaggle 比赛排行榜的爬虫相关推荐

  1. 有关python的比赛_用 Python 写一个 Kaggle 比赛排行榜的爬虫

    长久以来,我和小伙伴们都被 Kaggle 网站的加载速度困扰着,比如最近在用 Kaggle 上的数据集测试模型效果时,遇到排行榜(Leaderboard)刷新困难的问题.于是我们开始探索解决方案. 首 ...

  2. 代理IP的背后原理简单介绍与python写一个获取代理IP的爬虫

    title: 代理IP的那些事 copyright: true top: 0 date: 2019-11-13 14:20:39 tags: 代理IP categories: 爬虫笔记 permali ...

  3. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  4. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (

    @@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...

  5. python编写测试工具-python 写一个性能测试工具(一)

    国庆重新学习了一下go的gin高性能测试框架. 用JMeter来测试gin与flask接口的性能,差别很大. 为什么我自己不尝试写一个性能工具,性能工具的核心就是 并发 和 请求. 请求可以选择Pyt ...

  6. pythongui登录界面密码显示_用python写一个带有gui界面的密码生成器

    需要用到的库: tkinter:构建gui界面 pyperclip:复制功能 random:生成随机数 string:处理字符串 代码: from tkinter import * import ra ...

  7. python写一个通讯录V2.0

    python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1. ...

  8. python软件界面-用Python写一个语音播放软件

    原标题:用Python写一个语音播放软件 单位经常使用广播进行临时事项的通知(将文字转换为语音然后通过功放广播),但是市面上多数语音播放软件都是收费的,要么发音失真,要么不够稳定--经常出现莫名其妙的 ...

  9. python写一个系统-使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

最新文章

  1. 关于iview、element-ui重置表单并清除校验的方法
  2. CVE-2018-15473(OpenSSH用户枚举漏洞)
  3. adb启动app_adb命令实战十三步
  4. config修改php背景颜色,动态永久修改config
  5. 实战四 win2008 r2 AD中大批量添加用户账号
  6. 数据科学 IPython 笔记本 7.3 Pandas 数据操作
  7. 关于Web端-UI自动化测试
  8. Opencv之缺少api-ms-win-downlevel-shlwapi-l1-1-0
  9. inno setup 卸载注册表_Inno Setup:如何自动卸载以前安装的版本?
  10. ISO27001(BS7799/ISO17799)国标
  11. Axure RP8从入门到精通手册
  12. c语言互不相同删除法,GitHub - MXHDOIT/C_Practice: 100道C语言经典习题
  13. neon浮点运算_ARM Linux Kernel浮点运算(软浮点、硬浮点)
  14. SpringBoot父子工程集成Jenkins部署项目问题合集
  15. ue编辑器漏洞_7. 编辑器漏洞整理
  16. 电脑使用越来越慢,如何解决
  17. 经典的Python爬虫和网络编程面试题
  18. 分割(Partition)
  19. 石墨烯技术的4大特点
  20. SVN:回滚到旧版本(TortoiseSVN)

热门文章

  1. 腾讯云mysql升级失败怎么办_本地连接腾讯云Mysql失败问题
  2. linux hook 任意内核函数,linux内核中的hook函数详解
  3. 原生JDBC连接MySQL数据库踩的坑
  4. 怎样改变java编码风格_如何说服同事修改些代码的风格(JAVA的)。。求指引
  5. ie的window.open 未指明的错误_错误还是违法——离开的原因之一
  6. Python随机梯度下降法(三)
  7. aes ios php,AES算法在PHP和Android和iOS上有所不同
  8. mysql的命令行常用命令_MySQL Command Line[mysql命令行常用命令]
  9. centos6配置固定ip地址(选择桥接模式)
  10. SpringRMI解析3-RmiServiceExporter逻辑细节