用Stata帮你打《王者荣耀》

2017-08-04 李正旸 司海涛 爬虫俱乐部 爬虫俱乐部

大大大大大新闻————爬虫俱乐部新推出了视频讲解环节。小编突然浮现出一个画面——看着视频嗑着瓜子学着stata,妈妈再也不用担心我的stata了!详情请猛戳文章下面的视频。

要问时下最火的手游是什么?《王者荣耀》当 之无愧,一有闲暇,掏出手机就能大杀四方,在峡谷里放浪形骸。那么选什么英雄容易升段位呢?哪位英雄又非常适合自己呢?这就需要对所有的英雄有所了解,特 别是每个英雄的技能,对技能的熟知能够轻易地帮你统领战场。我们知道通过官网或一些app可以查询每位英雄的技能具体是什么、冷却时间和消耗分别是多少, 但是全部浏览一遍会耗费大量的时间。在这里,万能的Stata君又来帮助我们了!

四个步骤便能get到所有英雄的技能数据。

选定目标网站并分析源代码

小编先介绍如何用Stata爬取单个英雄的技能数据,我们要先通过官网http://pvp.qq.com/找到含有全部英雄资料的界面:

点开任意英雄的介绍页面,例如点击第一个英雄“铠”,发现网址是:http://pvp.qq.com/web201605/herodetail/193.shtml

用Stata爬取数据关键是要对网站源代码进行分析,通过分析你会发现:

通过匹配</h2>可以找到英雄的名称:“铠”

通过匹配"skill-name"、"skill-desc"、"skill-tips"把技能的名称、冷却值、消耗以及技能介绍都筛选出来。

copy网页源代码

首先我们用copy命令将网页的内容copy到计算机硬盘,并进行转码:

clear

cap mkdir E:/王者荣耀

cd E:/王者荣耀

cap copy "http://pvp.qq.com/web201605/herodetail/193.shtml"  193.txt,replace

while _rc != 0 {

    sleep 1000

    cap copy "http://pvp.qq.com/web201605/herodetail/193.shtm"  ///

    193.txt, replace

}

*检查是否乱码

unicode analyze 193.txt  

*进行转码

unicode encoding set gb18030

unicode translate 193.txt,transutf8

unicode erasebackups,badidea

要注意的是:capture如果成功执行身后的command时,_rc 等于0,如果没有成功抓取,_rc不等于0,这时我们让程序停1秒,然后继续抓取直到抓取成功,从而防止因为网速问题导致网页没有抓取成功。

整理信息

infix strL v 1-20000 using 193.txt   

keep if ustrregexm(v,`"(</h2>)|("skill-name")|("skill-desc")|("skill-tips")"')   //匹配并保留目标信息

我们发现第一行是英雄名称,从第二行开始,每三行就是一个技能的全部信息,我们可以用一个循环将这三行合并为一行:

forvalues i = `=_N'(-1)1 {    /*从第16行向上循环,其递减步长为1*/

        if ustrregexm(v[`i'], "skill-tips") & ustrregexm(v[`i' - 1], "skill-desc")  & ustrregexm(v[`i' - 2 ], "skill-name") {   /*例如:第一次循环从第16行开始匹配,如果同时满足变量v的第16行匹配到skill-tips、第15行匹配到skill-desc、第14行匹配到skill-name三个条件时,执行以下程序*/

            replace v = v + v[_n +1] + v[_n +2] in `=`i'-2'   //每个技能的第三行和第二行加到第一行

            drop in `=`i'-1'/`i'  //合并过后,删除每个技能的第二行、第三行

        }

}

可以看到此时数据就很整齐了,我们可以用以下程序分别提取目标信息:

gen 人物=ustrregexs(1) if ustrregexm(v,">(.*?)</h2>")

gen 技能=ustrregexs(1) if ustrregexm(v,"<b>(.*?)</b>")

gen 冷却值=ustrregexs(1) if ustrregexm(v,"冷却值:(.*?)<")

gen 消耗=ustrregexs(1) if ustrregexm(v,"消耗:(.*?)<")

gen 技能说明=ustrregexs(1) if ustrregexm(v,`"="skill-desc">(.*?)</p>"')

gen 技能补充=ustrregexs(1) if ustrregexm(v,`"="skill-tips">(.*?)</div>"')

drop v

其中undefined是指英雄的第五个技能还未定义,我们需要剔除所有缺失项并删除undefined,可以用以下程序:

carryforward 人物, replace   //用carryforward命令将人物名称补齐

drop if 技能==""|技能=="undefined"

加入循环进行批量抓取

 进行批量处理,需要进一步分析网站http://pvp.qq.com/web201605/herodetail/193.shtml,我们发现数字193是可以改变的,每个数字就是一位英雄的编码ename,例如:“鬼谷子”是189,“不知火舞”是157。通过查阅每位英雄对应的网站,可判断出ename大致是在100到200之间,如果不放心数据的完整性,可以扩大取值范围。

有了ename就可以进行循环抓取了,但是循环时有些网页是不存在的,例如:http://pvp.qq.com/web201605/herodetail/100.shtml,我们进行copy时,stata会报错:file http://pvp.qq.com/web201605/herodetail/100.shtml not found,并且返回值_rc等于601,所以如果_rc等于601,我们让其跳过并进行下一个循环即可,程序如下:

if _rc == 601{

    continue

}

完整程序如下:

clear

cap mkdir E:/王者荣耀

cd E:/王者荣耀

unicode encoding set gb18030

forvalue i = 100(1)200{

    cap copy "http://pvp.qq.com/web201605/herodetail/`i'.shtml" temp.txt,replace

    if _rc == 601{

            continue

        }

    while _rc != 0 {

        sleep 1000

        cap copy "http://pvp.qq.com/web201605/herodetail/`i'.shtml" temp.txt, replace

    }

    clear

    unicode translate temp.txt,transutf8

    unicode erasebackups,badidea

    infix strL v 1-20000 using temp.txt

    keep if ustrregexm(v,`"(</h2>)|("skill-name")|("skill-desc")|("skill-tips")"')

    forvalues c = `=_N'(-1)1 {

        if ustrregexm(v[`c'], "skill-tips") & ustrregexm(v[`c' - 1], "skill-desc")  & ustrregexm(v[`c' - 2 ], "skill-name") {

            replace v = v + v[_n +1] + v[_n +2] in `=`c'-2'

            drop in `=`c'-1'/`c'

        }

    }

    gen 人物=ustrregexs(1) if ustrregexm(v,">(.*?)</h2>")

    gen 技能=ustrregexs(1) if ustrregexm(v,"<b>(.*?)</b>")

    gen 冷却值=ustrregexs(1) if ustrregexm(v,"冷却值:(.*?)<")

    gen 消耗=ustrregexs(1) if ustrregexm(v,"消耗:(.*?)<")

    gen 技能说明=ustrregexs(1) if ustrregexm(v,`"="skill-desc">(.*?)</p>"')

    gen 技能补充=ustrregexs(1) if ustrregexm(v,`"="skill-tips">(.*?)</div>"')

    drop v

    carryforward 人物, replace

    drop if 技能==""|技能=="undefined"

    save "`i'.dta",replace

}

openall    

综上我们就得到了一个完整的英雄技能数据,结果如下:

 你还在为不熟悉技能而担心坑队友吗?你还在为如何升段位而心力交瘁吗?快使用Stata吧,帮助你精准分析每个英雄的数据,带你迅速超神!

(Tips:网页源代码可能随着游戏的更新而修改,大家爬虫时要再研究一下源代码。此外大家玩游戏一定要适度,千万不要沉迷游戏无法自拔!)

 

什么?!没看懂!!不要紧!!戳下面,听爬虫小将的详细讲解,也欢迎大家的批评指正哟!


以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

                        文字编辑:徐露露

技术总编:刘贝贝



往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word.docx)文档

7.Stata 15Markdown——没有做不到,只有想不到!

8.矩阵和宏的故事

9.shelloutopen anything

10.Putpdf--神奇的转换工具



关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部



微信扫一扫
关注该公众号