韩服王者大师500强,到底强在哪?

如题明示,作者曾经是一个loler。

我最早接触这款火爆游戏《英雄联盟》是在2013年,已经整整过去了五个年头,算是一个大半个骨灰级玩家。这五个年头,从S3到了今年的S8,我与它的联系从不可割舍到若即若离,再到如今的转身后的“独木桥”,心理上经历过巨大的冲击和变化,这一切,是生活迫使我这么做。

人的成长,有主动,也有被动,主动起码有选择的余地,被动的情形像极了无头苍蝇乱打一通,好的情况下,还能浑浑噩噩过此一生。

很可惜,我是后者。

这五年,我从考研、毕业、工作辗转至于如今。

我硕士专业是制药工程,这不是我的爱好。相信你能很快想象,这必然是基于“”学好数理化“的思想下的被动选择的,这不怪谁。毕竟,懵懂的日子里,也曾幻想过那是什么高大上的工程系,至少也可以学个制剂什么的嘛,可惜事实上,都是摇瓶子的工作,导师干什么的,你就是干什么,这算是好的情形,差一点的呢,导师扔给你一个项目,咱们工厂见——我就是这么个例子。

那几年,我茫然无助,只想着能草草毕业,就好了。

可惜,事与愿违,一切来得始料未及。

我完全没有意识到,毕业就是失业,很快我就面临着找工作的巨大压力,这使得我不得不割舍与改变——我所学的专业和内心的躁动格格不入,我的内心强烈地抵制者,我想要逃出这囚笼。

其实吧,直到前段时间我才幡然醒悟,错的不是专业,而是你的选择,这才从这种患得患失的心绪中走出来,至于为什么醒悟,这或许是成长吧,不过也算是成长的代价。

只不过,刚毕业的我,不明白这个道理。

这两年,大数据的变革,AI风口的迫近,我萌生了新的想法,为什么他们都能跨专业、转行呢?

我才27岁,奔三还有三年呢,我上我也行啊!

于是乎,去年春节后之后,我一头扎入,学习至今python有三四个月了。

这里不得不嘲讽自己一点,自己他么又不是大神,最起码也得转行成功了,再来扯犊子情怀啊?

不得不承认这一点。

而且,我目前还不敢脱产,我的的确确还是化学从业者。

只不过,本着我对python爬虫、数据分析的热情,以及我这人的性格憋不住的性格,我还是得装一回b,毕竟我曾学习了三四个月,我有自己的一份产出与付出,自我肯定,不行么?

好吧,到这里,你算是看明白了,前文之所以要提起lol,与今天这篇公众号的目的有些关联。

虽然,我不玩联盟了,这并不妨碍我对她的热爱。

好了,废话不多说,虽然说了这么多了。

今天,我们将要借用python爬取opgg网站上的韩服500强数据,顺便分析一下:这五百强到底强在哪?是英雄池还是天赋?如果你是一个天赋异禀的召唤师,想要达到这样得水平,又需要哪些参数标准呢?

先看下目标有哪些数据值得提取:

第一级页面:

链接:http://www.op.gg/ranking/ladder/

第一名是有着“黄金左手“之称的中国选手knight,据我观察,这货霸占韩服第一名的榜单许久了,不愧是天赋异禀,名副其实。(其他召唤师,原谅我许久不玩了。就算我玩,你他么爱谁谁,我只关心韩服第一是中国人,那就够了,。)

我们提取的数据有Id、rank排名、段位、胜点、胜率、胜场数、败场数,等级。

第二级页面:

随手点开一个棒子的id名称后,进入以上页面,那我们要看看他们排位的英雄池、然后胜率、胜场数、败场数、kda等信息,我们需要点击单独排位赛,看第二个框框:

两级页面,我们的策略是什么?

第一级页面,用re.findall直接提取所有数据,只不过第一面的信息有两种构造,需要分别提取。如果你打开审查元素,一定会发现的,一种是前五名的数据结构,还有一种是第五名以后的召唤师数据结构。

第二级页面,当我们点击单独排位时,发现页面等待许久才能响应,查看源代码发现数据有的是空值,这尼玛,绝壁是动态加载。为了简单高效的完成数据提取,这里我们用selenium强行爬取,然后pyquery解析,虽然粗暴,但也免去了解析真实请求页的烦恼。

其次,保存的数据以什么格式好呢?

那么就json格式吧,当然,保存在数据库也是可以的。

好了,定制好策略,就高兴开始爬取吧。

第一级页面爬取代码如下:

指定伪装头,以及响应内容的函数html_parse:

请求页面,解析数据:

这里如果its(第一种数据构造的提取方法)存在则返回,如果不存在,就继续往下面提取第二种数据构造。

第二种构造提取方式(也就是普通排名,第六名至第五百名):

至此,如果我们要爬取五百名召唤师的数据,page应该是1到5,即便是第一页需要两种数据提取方式,有了以上办法的扩展后,同样适用。

最后,保存,以及构造urls,用多进程map提取:

至此,第一级页面就可以提取了。

第二级页面爬取:

先看下保存那些数据:

自上而下,依次是召唤师昵称,最近二十把使用的英雄(玩的最多的前三个),以及他们对应的kda,胜率,胜场,和败场。

导入模块:

伪装setting(可选)以及设置无headless浏览(必要):

解析网页:

webdriver初始化一个Chrome实例,需要配置chromedriver这个必要插件;

设置浏览器窗口:

显式等待两秒后请求页面,然后再等待两秒,等js加载,最后点击“排位赛”,再等待一定时间进行下一步操作(这样做是有必要的,否则会抛出session不存在的错误,导致提取不到数据)。

解析页面,用选择器提取需要的数据存入字典,然后用yield迭代返回,注意清空字典。

保存数据,生成urls列表,并用用多进程map运行程序:

值得一提的是,这里我们的数据以第一级页面的info_href构造而来的,用到了pandas读取json数据,其他方式也可行。

如果爬取错误,为了避免重复爬取,可以这样做:

好了,爬取篇到此结束,下一篇我们尝试用这些数据来分析一波。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180724G1HLJ200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券