用Python爬取《王者榮耀》英雄皮膚資料並視覺化分析,用圖說話

Python研究者發表於2021-08-17

大家好,我是辰哥~

今天辰哥帶大家分析一波當前熱門手遊《王者榮耀》英雄皮膚,比如皮膚上線時間皮膚型別(勇者;史詩;傳說等)、價格

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.text
selector = 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. 本文僅供讀者學習使用,不做其他用途!

相關文章