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

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

目标

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

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

基本思路

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

我的思路是:

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

当然,王者荣耀当前已经有一百多个英雄了,手动做这件事会很累且容易出错,肯定要借助编程的方法,我这里选择了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模块的安装与使用示例》)
读取一个英雄的技能文本的代码如下,主要就是找到classskill-descp节点:

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1298432.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存