写点什么

用 Python 爬取《王者荣耀》英雄皮肤数据并可视化分析,用图说话

发布于: 1 小时前

大家好,我是辰哥~


今天辰哥带大家分析一波当前热门手游《王者荣耀》英雄皮肤,比如皮肤上线时间皮肤类型(勇者;史诗;传说等)、价格

1.获取数据

数据来源于《王者荣耀官方网站》,网页数据如下:



所需内容

  1. 英雄名称

  2. 英雄皮肤名称

  3. 上线时间

  4. 皮肤类型(勇者;史诗;传说等)

  5. 价格(这个在官方没有获取到,是辰哥这边手动统计的)


首先通过查看 network 分析获取所有皮肤的数据(通过分析发现是异步加载的)



查看响应数据



url = "https://pvp.qq.com/zlkdatasys/data_zlk_xpflby.json"response = requests.get(url).json()for i in response['pcblzlby_c6']:    print(i['pcblzlbybt_d3'],i['lbyrq_e5'],i['pcblzlbyxqydz_c4'])
复制代码


这里只获取到英雄皮肤名称、上线时间以及皮肤详细信息链接(包含皮肤类型、对应英雄)



这里只获取到了 189 款皮肤(9*21=189),接着在继续通过异步请求获得的皮肤详细信息链接,去获取皮肤的具体信息。



以其中一个皮肤为例



可以获取到皮肤类型(传说);皮肤名称(仲夏夜之梦);对应英雄(貂蝉);



通过查看源代码可以发现所需内容对应的网页标签,其中皮肤类型是图片的形式展示,但是我们需要的是文字内容,但是也不并非无规律可寻


皮肤类型规律:

勇者:1.png

限定:5.png

史诗:12.png

传说:15.png

KPL 限定:19.png

情人节限定:24.png

荣耀典藏:26.png

FMVP:38.png

战令限定:40.png

其他:剩下的就归类到其他类(赛季限定等等)


上面的规律是皮肤类型图片对应的文字内容。


url = "https:"+"//pvp.qq.com/coming/v2/skins/141-5.shtml"response = requests.get(url)response.encoding = 'gbk'text = response.textselector = etree.HTML(text)img = selector.xpath('//*[@id="showSkin"]/div/img/@src')[0]print(frompic_gettext(img))skin = selector.xpath('//*[@id="showSkin"]/div/div[2]/span[1]/text()')[0]print(skin)hero = selector.xpath('//*[@id="showSkin"]/div/div[2]/span[2]/text()')[0]print(hero)text = selector.xpath('//*[@id="showSkin"]/div/p/text()')[0]print(text)
复制代码



最终获取全部(189)的皮肤信息


url = "https://pvp.qq.com/zlkdatasys/data_zlk_xpflby.json"response = requests.get(url).json()for i in response['pcblzlby_c6']:    types,skin,hero,text = getdetail(str(i['pcblzlbyxqydz_c4']))    print(hero,skin,i['lbyrq_e5'],types,text)
复制代码


输出结果:



最后将数据保存到 excel,并手动统计皮肤对应的价格



在点券这列:


1.有具体点券信息的就直接统计(不包含首周优惠)


2.赛季专属的用 0 表示(免费获得)


3.战令限定的默认 388(购买战令进阶)


4.其他一些抽奖,夺宝的直接用对应文字统计。


在皮肤类型这里也清洗了一下(比如五五开黑节,牛年限定等等)

2.可视化

先来给口号字段做一下词云图


这里直接使用辰哥的可视化平台进行制作


(show.chenlove.cn)


以下的可视化图表都直接在上面的平台一键生成



上传前面的 excel 文件,


选择口号字段和词云图背景;


点击生成词云图



点击导出,下载到本地



同样一键给皮肤字段做一下词云图



上线时间分析



统计每年发布的皮肤数量


df = pd.read_excel("王者荣耀英雄皮肤.xlsx")time = df["上线时间"].tolist()clear_time = [str(i)[0:4] for i in time]result = Counter(clear_time)# 排序d = sorted(result.items(), key=lambda x: x[1], reverse=True)t = [i[0] for i in d]v = [i[1] for i in d]"""['2020', '2019', '2021', '2018', '2017'][47, 44, 43, 42, 14]"""
复制代码


同样的还是使用辰哥的可视化平台(选择饼图)


对结果进行可视化



可以看出从 2017~2021 上线皮肤数量逐年增加,由于 2021 年刚过一半,所以还未超过 2020 年的数量。


分析每年几月皮肤数量最多



统计 2017~2021 年皮肤数量最多的月份


for j in [str(i)[0:6] for i in time]:    if "2017" in str(j):        t_2017.append(j[4:6])    if "2018" in str(j):        t_2018.append(j[4:6])    if "2019" in str(j):        t_2019.append(j[4:6])    if "2020" in str(j):        t_2020.append(j[4:6])    if "2021" in str(j):        t_2021.append(j[4:6])# 排序d_2017 = sorted(Counter(t_2017).items(), key=lambda x: x[1], reverse=True)d_2018 = sorted(Counter(t_2018).items(), key=lambda x: x[1], reverse=True)d_2019 = sorted(Counter(t_2019).items(), key=lambda x: x[1], reverse=True)d_2020 = sorted(Counter(t_2020).items(), key=lambda x: x[1], reverse=True)d_2021 = sorted(Counter(t_2021).items(), key=lambda x: x[1], reverse=True)print("2017",d_2017[0])print("2018",d_2018[0])print("2019",d_2019[0])print("2020",d_2020[0])print("2021",d_2021[0])"""2017 ('10', 3)2018 ('10', 6)2019 ('02', 10)2020 ('01', 14)2021 ('02', 10)"""
复制代码


可以看到在 2017 和 2018 年 10 月上线皮肤较多,从 19 年开始,过年时当月上线的皮肤数量比同年其他月份数量多。


不同点券价格


统计 excel 中点券一列中包含几种价格,并进行排序


price = df["点券"].tolist()clear_price = [str(i) for i in price]result = Counter(clear_price)# 排序d = sorted(result.items(), key=lambda x: x[1], reverse=True)t = [i[0] for i in d]v = [i[1] for i in d]"""['888', '1788', '0', '388', '1688', '60', '夺宝', '488', '抽奖', '贵族限定', '660'][52, 30, 28, 21, 19, 17, 13, 6, 2, 1, 1]"""
复制代码


将结果导入可视化平台,生成可视化图



其中第三个是 0,因为赛季皮肤可以免费获取(所需点券为 0),以上就是《王者荣耀》获得皮肤的几种价格,像夺宝抽奖这种靠运气,无法去衡量点券,所以就直接展示中文意思。


几种不同皮肤类型



统计 excel 中类型字段,并排序


"""['史诗', '勇者', '限定', '战令限定', '其他', '赛季限定', 'KPL限定', 'FMVP', '荣耀典藏', '情人节限定', '鼠年限定', '猪年限定', '牛年限定', '五五开黑节', '传说', '狗年限定', '五周年限定', '四周年限定', '三周年限定', '战队赛专属', '二周年限定'][27, 27, 26, 21, 20, 18, 9, 6, 6, 5, 5, 5, 4, 2, 2, 2, 1, 1, 1, 1, 1]"""0
复制代码



当前统计到是 20 种类型,但远不止 20,因为对于“其他”标签的还包含多种,因此皮肤类型起码 20+,估计 20 多种。此外还可以看出史诗和勇者这两个类型的皮肤是较多的。


‍‍‍‍‍‍‍‍‍‍‍


同一种点券对应不同皮肤类型



同一种点券价格对应多种皮肤类型


比如 888 点券对应【'限定', '史诗', 'KPL 限定', '五五开黑节', '情人节限定'等】


分别统计点券为 888;1788;1688;0(免费)对应哪些皮肤类型,并绘制关系图(同样也是使用可视化平台进行绘制)



for i in range(0,len(price)): if str(price[i])=="888": if tp[i] not in c_888: c_888.append(tp[i]) if str(price[i])=="1788": if tp[i] not in c_1788: c_1788.append(tp[i]) if str(price[i])=="0": if tp[i] not in c_0: c_0.append(tp[i]) if str(price[i])=="1688": if tp[i] not in c_1688: c_1688.append(tp[i])"""888 ['限定', '史诗', 'KPL限定', '五五开黑节', '情人节限定', '勇者', '猪年限定', '其他', '二周年限定']1788 ['限定', '情人节限定', '牛年限定', 'KPL限定', '鼠年限定', '猪年限定', '狗年限定']0 ['其他', '赛季限定', '五周年限定', '四周年限定', '勇者', '三周年限定', '战队赛专属']1688 ['限定', 'FMVP', '传说', '其他']"""
复制代码


888 点券对应皮肤类型



1788 点券对应皮肤类型



0 点券对应皮肤类型



1688 点券对应皮肤类型



今天的文章就到这里了


上面所涉及的可视化都是通过辰哥的可视化平台进行制作。感兴趣的小伙伴可以去看看(show.chenlove.cn)

最后

1. 本文详细介绍了 python 爬虫获取《王者荣耀》英雄皮肤信息并且可视化


2. 本文仅供读者学习使用,不做其他用途!

发布于: 1 小时前阅读数: 2
用户头像

个人公众号:Python研究者 2021.04.26 加入

教你如何学Python,专注于Python入门与进阶、爬虫、数据分析挖掘、数据可视化。分享Python相关的技术文章、工具资源、视频教程、学习资料。

评论

发布
暂无评论
用Python爬取《王者荣耀》英雄皮肤数据并可视化分析,用图说话