查看原文
其他

"有你才有团"——Stata爬取王者荣耀英雄海报

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者王宇晖,北京师范大学—香港浸会大学联合国际学院

本文编辑:陈梦华

技术总编:李婷婷

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

    《王者荣耀》是腾讯旗下的MOBA竞技手游,自2015年推出以来风靡全国,屹立不倒。随着暑期的到来,天气越来越酷热难耐,更多的人选择宅在家里喝冷饮打王者。同时,根据7月13日最新消息,2021年6月《王者荣耀》吸金近2.77亿美元,位列全球手游畅销榜冠军。

今天,笔者就用Stata来爬取王者荣耀的所有英雄和对应的海报,并输出到一个word文档中,来看看如此吸金的游戏人物塑造的如何。

1、观察目标网站

首先我们进入到王者荣耀的官方网站英雄资料页面,网址:(https://pvp.qq.com/web201605/herolist.shtml),打开后如下图所示:

  该页面显示出来了游戏内所有的英雄,然后我们再随意点击两个英雄进入到每个英雄的页面,如下图所示:

图片上的背景图片即是该英雄的1080p高清海报,也是我们最后想要得到的。

我们观察发现不同的英雄页面网址只有红色方框内所显示的序号不同,其他的都一样。因为每个英雄对应的序号并不是依次排序的,而是断断续续的,所以我们必须有每个英雄的这个特殊序号才可以进入到每个英雄所对应的网页。因此我们可以整理出基本思路:

1、通过英雄列表页面的源代码获取所有英雄所对应的序号。

2、爬取每一个英雄对应网页内的高清海报。

2、观察网页源代码

我们看一下每个英雄的高清海报页面的网页源代码,这里以猪八戒的为例:

因为我们要让每个英雄的名字和他们的海报图片地址一一对应,图中红色方框中的内容就是我们想要得到的。通过搜索源代码,我们可以发现,图片地址前面的"background"在整个源代码中只出现了一次,猪八戒名字前后的"h2"也只在这里出现。因此,我们可以通过这两个关键词来定位我们所需要的信息。

那么再来看看英雄列表页面的网页源代码:  我们可以看到,从第120行开始,就是每个英雄对应的相关内容,与此同时,我们还可以发现,只有在英雄相关的小图片地址后才会出现width="91",因此我们可以通过这个特殊标签保留目标信息,至此,我们已经有了所有的爬取思路了,废话不多说,我们直接开始行动!

3、数据爬取

首先我们先创建一个新的文件夹,然后把英雄列表这一页面的网页源代码导入到Stata中,清洗得到所有的英雄所对应的序号,程序如下所示:
clear allcap mkdir "D:\王者荣耀"cd "D:\王者荣耀"copy "https://pvp.qq.com/web201605/herolist.shtml" herolist.txt, replaceinfix strL v 1-100000 using herolist.txt, clear //导入数据replace v = ustrfrom(v, "gb18030", 1) //数据转码keep if index(v, "width="91"") //保留所有有width="91"的行drop in -3/-1split v, p("/") //用/符号来分割keep v8levelsof v8 到此步为止,我们可以找到所有英雄所对应的特殊序号。

有了所有英雄对应的特殊序号,那么接下来我们就可以对每一个英雄进行名字和海报图片地址的提取了,首先我们对每一个英雄高清海报页面所对应的网页源代码进行爬取,然后将源代码分别导入Stata进行处理,保留目标信息,最后保存每一个dta文件。程序如下:
foreach i in `r(levels)'{cap copy "https://pvp.qq.com/web201605/herodetail/`i'.shtml" temp.txt, replacewhile _rc != 0 {sleep 5000cap copy "https://pvp.qq.com/web201605/herodetail/`i'.shtml" temp.txt, replace}infix strL v 1-100000 using temp.txt, clearreplace v = ustrfrom(v, "gb18030", 1)keep if index(v, "h2") | index(v,"background")sxpose, clearsplit _var1, p("(" ")") //分隔出海报图片网址split _var2, p(">""<") //分隔出英雄的名称keep _var23 _var12 //保留目标信息rename _all (url name)save "`i'.dta", replace}以猪八戒为例,结果如图所示:

4、文件合并

现在我们已经有了每一个英雄对应的dta文件,其中包含英雄名称和海报图片地址。下面我们要把所有的文件合并在一起,并对海报图片链接进行完善,程序如下:

clearlocal files: dir "." file "*.dta"foreach file in `files' {append using `file'}order name urlreplace url=ustrregexra(url,`"'"',"")*replace url=subinstr(url,`"'"',"",.) //另一种删除引号用法replace url="http:"+url //在url前面加上http:最终的结果如图:如上图所示,我们就已经得到了所有我们想要的数据了。

5、结果输出

有了所有的英雄名字和海报图片网址,我们就可以把名字和海报一一对应的输出到word文档上。那么我们先删除掉目录下所有之前生成的dta文件,然后把每一个英雄对应的海报图片给保存下来,图片的名字和英雄名字一一对应,程序如下:

cap !del *.dtaforvalues j=1/`=_N'{copy "`=url[`j']'" "`=name[`j']'.jpg", replace}我们的目录下就保存了所有英雄的高清海报。

接下来我们一个名字一个图片一一对应地把所有内容输出到一个word文档中,将英雄名字居中,换行后是英雄海报图片,最后把word文档保存为hok.docx,使用shellout命令来打开文档,程序如下:

putdocx beginforvalues n=1/`=_N'{putdocx paragraph, halign(center) //开始一个段落并居中putdocx text ("`=name[`n']'"), bold linebreak //将字体加粗并换行putdocx image "`=name[`n']'.jpg", width(6) //导入图片}putdocx save hok.docx, replaceshellout hok.docx到此,我们的任务已经全部完成,所有的精美海报都被我们保存在了一个word文档中,来看看我们最后的文档吧!

笔者希望每一位小伙伴在玩游戏的时候一定要适度娱乐,理性消费,千万不要深夜冲动,掉入抽奖的陷阱!氪金一时爽,事后火葬场。

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。

转发分享一下吧~

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐 

  爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

  善用dataex命令,高效沟通你我他

  用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
         看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

  可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

  好玩有趣的手绘图形库——cutecharts

  爬虫实战|摩尔庄园微博话题讨论

  一季度财报出炉,哪些公司最烧钱?

  一季度财报出炉,哪些公司最赚钱?

  技能篇 | 图片合并大法

  批量空气质量数据文件合并分析

  Stata17之日期时间新功能

  Stata17之Lasso新功能

爱奇艺视频弹幕爬取之《小舍得》

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



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

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

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存