
对于我来说,学习新英雄的第一件事便是查看其技能描述。因此,我相信技能描述的文本量对于一个英雄的上手难度有着不小的影响。
因此,我希望能统计出王者荣耀里所有英雄的技能描述文本量,并对其排序,这样也许对自己练新英雄有参考作用。
当然,此排序只是客观的统计,不具有专业的指导作用。
基本思路在官网中,可以找到每个英雄的介绍页面,其中有技能介绍文本:
我的思路是:
- 保存官网上每个英雄的介绍页面到本地。
- 找到技能描述的文本并统计其数字。
当然,王者荣耀当前已经有一百多个英雄了,手动做这件事会很累且容易出错,肯定要借助编程的方法,我这里选择了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条)