上期R图秀抓取并展示了本届奥运会的各个国家和比赛项目的数据,今天我们再增加一点难度,玩一玩运动员的数据。
为什么说今天的难度比上次大呢?主要原因是在Rio2016官网上抓取运动员数据的时候遇到了一点小麻烦。
我是根据每个比赛项目分别抓取运动员数据,由于运动员数目比较多,网页上最初只展示5名运动员,如果要看更多的信息,必须要点击“LOAD MORE”,每次点击只能多显示5名运动员。熟悉javascript的同学肯定知道,这是利用了AJAX技术,简单的说就是在不刷新整个页面的情况下,动态更新页面中的局部信息,提高了网页的交互性。这下用Rvest就很困难了。如果自己去点每一个“LOAD MORE”,真的会“生不如死”的。
loadmore.png
今天就给大家再介绍一个神器:Selenium。它可以控制你的浏览器做出指定的动作,换句话说,它可以让你写一个程序来代替你上网。听上去是不是很酷?更酷的是,R有一个包(RSelenium)可以提供接口,让你通过写R程序来控制浏览器!这样我就可以让R程序来帮我不断的点击“LOAD MORE”,直到所有的运动员都展示在页面上,然后就可以“一网打尽”!
selenium.png
友情提示:我大概花了一天时间才掌握RSelenium的使用,对初学者来说可能需要花的时间会更长,多一点耐心,多查查Google会很有帮助!
抓取运动员数据的步骤是:
-
利用RSelenium抓取每个运动员所对应的URL,代码如下:
code4.png -
利用Rvest在每个运动员的页面上抓取感兴趣的数据:姓名,国家,比赛项目,性别,年龄,出生月,身高,体重。代码如下:
code5.png
由于数据量较大,抓取的时间会稍微久一些。
有了数据以后,接下来需要思考一下,我想知道关于运动员的哪些信息?
- 我想知道奥运运动员里最流行的名字有哪些?
- 本届奥运会的男女运动员比例是怎样的?
- 哪个月份出生的奥运运动员最多?灵感来自于一本叫《异类》的书,里面也研究过出生月份和运动员成长之间的关系
- 年龄、身高、体重是如何分布的?男女运动员的差异有多大?
- 谁的年纪最小/大,谁最高/矮,谁最重/轻?
有了问题就有了方向,接下来就是秀图时间:
-
Name Cloud,使用的是wordcloud2包。是不是看到了很多熟悉的名字呢?
Rio2016_namecloud.png
代码如下(# name cloud部分):
code6.png -
男女运动员比例,还是男运动员稍微多一些
Rio2016_gender_pie.png
代码见上图(# gender pie部分)
-
出生月份分布图,一月份出生的男运动员较多,而4月份出生的女运动员较多,原因是什么?我也不知道!回去再好好看看《异类》那本书
Rio2016_month_bar.png
代码如下:
code8.png -
年龄分布图,男女基本一致,女运动员稍微年轻一些
Rio2016_age_hist.png -
身高分布图,还是男生高一些,符合预期
Rio2016_height_hist.png -
体重分布图,还是男生“胖”一点阿
Rio2016_weight_hist.png
上面三副图的代码如下:
code7.png -
比比谁最年轻、谁最高、谁最重。怎么看上去有点像结婚证的赶脚?
Rio2016_age_barplot.png
Rio2016_height_barplot.png
Rio2016_weight_barplot.png
代码如下(只展示了第一副图的代码,后面的代码类似):
code9.png
友情提示:代码中大量运用了dplyr包的函数和pipe(%>%),初学者看起来可能会有点吃力。没有关系,Rapp公众号会陆续推出相关教程,让我们一起来学习吧。
【图说里约奥运】共有3集,前2集展示的是各个国家和运动员的数据。为了展示最完整的奥运奖牌榜,最后1集将在奥运结束后推出,敬请关注!
qrcode.jpg
网友评论