栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Cocos2d-x

用python统计王者荣耀里所有英雄的技能描述文本量并排序

Cocos2d-x 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用python统计王者荣耀里所有英雄的技能描述文本量并排序

目标

对于我来说,学习新英雄的第一件事便是查看其技能描述。因此,我相信技能描述的文本量对于一个英雄的上手难度有着不小的影响。
因此,我希望能统计出王者荣耀里所有英雄的技能描述文本量,并对其排序,这样也许对自己练新英雄有参考作用。

当然,此排序只是客观的统计,不具有专业的指导作用。

基本思路

在官网中,可以找到每个英雄的介绍页面,其中有技能介绍文本:

我的思路是:

  1. 保存官网上每个英雄的介绍页面到本地。
  2. 找到技能描述的文本并统计其数字。

当然,王者荣耀当前已经有一百多个英雄了,手动做这件事会很累且容易出错,肯定要借助编程的方法,我这里选择了python做这件事。

1. 找到英雄介绍页面地址列表

(此处我使用windows自带的Edge浏览器,用其他浏览器我发现保存的网页源代码会有差异)

打开官网找到英雄列表:

使用浏览器ctrl+S将网页保存到本地herolist.html,再用文本形式打开它,可以看到每个英雄的介绍页面地址:

2. 解析出英雄介绍页面地址列表

上一步得到的信息还是html格式,为了能在接下来方便使用,还需要处理一下。

首先,是将这个节点拷贝到一个新的文件heropages.xml,因为只有这部分的信息是感兴趣的。

另外还有个问题是,我用来解析信息的库是python的xml库,xml的语法和html语法稍有些不同。例如这里出现的标签(详见HTML img 标签)在html中没有标签结束的符号,这会让我在将他解析为xml的时候出问题。为此我这里用了一个“歪招”:使用文本替换的方式在合适的位置补上 img 的结束标签:

接下来,就可以将其当作正确的xml来解析了,python代码如下:(此处主要参考了《python ElementTree模块使用详情》)

import xml.etree.ElementTree as ET
tree = ET.parse("D:/Temp/heropages.xml")
node_ul = tree.find("ul")
nodes_heros = node_ul.findall("li")
for node_hero in nodes_heros:
    node_a = node_hero.find("a")
    node_img = node_a.find("img")
    pageLink = node_a.get("href")
    print(node_img.text)
    print(pageLink)

运行后可以看到地址列表被正确解析出来:

3. 保存所有英雄介绍页面到本地

接下来,就可以抓取所有英雄的介绍页面并保存到本地了,代码如下:(保存网页的代码主要参考了《两种通过urllib抓取并保存本地的方式》)

import xml.etree.ElementTree as ET
import urllib.request

tree = ET.parse("D:/Temp/heropages.xml")
node_ul = tree.find("ul")
nodes_heros = node_ul.findall("li")
for node_hero in nodes_heros:
    node_a = node_hero.find("a")
    node_img = node_a.find("img")
    pageLink = node_a.get("href")

    page = urllib.request.urlopen(pageLink)
    file = open ('D:/Temp/heros/'+node_img.text+'.html','wb')
    file.write(page.read())
    file.close()

随后可以看到所有网页都被保存到了本地:

4. 解析出英雄的技能描述文本

打开上一步中得到的英雄介绍页面的源代码,就可以看到我们想要的信息:

只不过还是会遇到在第2步遇到的问题——使用xml来解析html会有问题。
此时再用当时的歪招的话会很麻烦,所以我不得不用更正确的方式了。

我查到lxml可以用来解析html,因此安装了这个库

pip3 install lxml

(这里主要参考了《爬虫之 lxml模块的安装与使用示例》)
读取一个英雄的技能文本的代码如下,主要就是找到class为skill-desc的p节点:

from lxml import etree

with open('D:/Temp/heros/百里守约.html', 'r') as f:
    tree = etree.HTML(f.read()) 
    skills = tree.xpath("//p[@class='skill-desc']")
    for skill in skills:
        print(skill.text)
        print('n')

运行后结果如下:

5. 统计王者荣耀里所有英雄的技能描述文本量

接下来,就是遍历所有英雄并统计其文本量了,代码如下:

from lxml import etree
import os

heros  = os.listdir('D:/Temp/heros/')
for hero in heros:
    with open('D:/Temp/heros/'+hero, 'r') as f:
        tree = etree.HTML(f.read()) 
        skills = tree.xpath("//p[@class='skill-desc']")
        skill_text_number = 0      
        for skill in skills:
            if(skill.text):
                skill_text_number += len(skill.text)
        print(hero.strip(".html")+','+str(skill_text_number))

运行后输出结果:

6. 排序

将上一步输出的结果保存到一个文本里(需要改成ASCII编码)并将后缀改为.csv即可通过Excel打开。
之后,就可以在Excel中对其排序了,最后结果如下:

项目Value
妲己233
韩信318
小乔326
曜335
程咬金337
亚瑟343
公孙离345
橘右京356
貂蝉358
庄周363
艾琳368
牛魔370
曹操380
典韦383
露娜384
嬴政389
甄姬396
墨子397
蔡文姬398
金蝉398
赵云401
孙膑406
刘禅411
夏洛特417
白起418
钟无艳424
鲁班七号424
虞姬425
哪吒428
姜子牙428
后羿429
武则天429
大乔432
不知火舞435
孙悟空439
鲁班大师452
孙尚香456
黄忠456
安琪拉457
兰陵王459
马可波罗462
花木兰472
关羽473
刘备474
宫本武藏479
云中君486
项羽487
司空震491
高渐离491
老夫子500
暃501
西施502
李白511
狄仁杰511
娜可露露512
梦奇515
钟馗517
成吉思汗519
阿轲521
雅典娜521
杨玉环525
夏侯惇526
达摩529
张飞530
王昭君530
扁鹊539
廉颇545
伽罗547
澜553
张良557
百里守约560
铠563
桑启569
盾山575
瑶577
杨戬578
东皇太一579
吕布581
干将莫邪582
刘邦584
猪八戒591
李元芳602
太乙真人603
诸葛亮619
周瑜621
嫦娥628
鬼谷子631
司马懿649
孙策650
女娲654
百里玄策681
上官婉儿686
镜689
阿古朵704
云缨706
芈月707
蒙恬708
明世隐723
马超729
沈梦溪766
苏烈806
狂铁820
蒙犽855
裴擒虎874
弈星897
米莱狄898
元歌961
盘古1109
李信1149
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/896770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号