对于我来说,学习新英雄的第一件事便是查看其技能描述。因此,我相信技能描述的文本量对于一个英雄的上手难度有着不小的影响。
因此,我希望能统计出王者荣耀里所有英雄的技能描述文本量,并对其排序,这样也许对自己练新英雄有参考作用。
当然,此排序只是客观的统计,不具有专业的指导作用。
基本思路在官网中,可以找到每个英雄的介绍页面,其中有技能介绍文本:
我的思路是:
保存官网上每个英雄的介绍页面到本地。找到技能描述的文本并统计其数字。当然,王者荣耀当前已经有一百多个英雄了,手动做这件事会很累且容易出错,肯定要借助编程的方法,我这里选择了python做这件事。
1. 找到英雄介绍页面地址列表(此处我使用windows自带的Edge浏览器,用其他浏览器我发现保存的网页源代码会有差异)
打开官网找到英雄列表:
使用浏览器ctrl+S将网页保存到本地herolist.html,再用文本形式打开它,可以看到每个英雄的介绍页面地址:
上一步得到的信息还是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)
运行后可以看到地址列表被正确解析出来:
接下来,就可以抓取所有英雄的介绍页面并保存到本地了,代码如下:(保存网页的代码主要参考了《两种通过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()
随后可以看到所有网页都被保存到了本地:
打开上一步中得到的英雄介绍页面的源代码,就可以看到我们想要的信息:
只不过还是会遇到在第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')
运行后结果如下:
接下来,就是遍历所有英雄并统计其文本量了,代码如下:
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))
运行后输出结果:
将上一步输出的结果保存到一个文本里(需要改成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 |
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)