王者榮耀五周年,爬取102個英雄+326款皮膚,分析上線時間

本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請及時聯(lián)系我們以作處理

1.概述

《王者榮耀》上線至今5個年頭了,作為這些年國內(nèi)最熱門的手游(沒有之一),除了帶來游戲娛樂之外,我們在這五周年之際,試著從他們的官網(wǎng)找點樂趣,學(xué)習(xí)一下Python爬蟲的一些簡單基礎(chǔ)操作。

本篇將主要介紹簡單的Python爬蟲,包括網(wǎng)頁分析、數(shù)據(jù)請求、數(shù)據(jù)解析和數(shù)據(jù)保存,適用于基本不帶反爬的一些網(wǎng)站,旨在進行學(xué)習(xí)交流,請勿用作任何商業(yè)非法用途。

網(wǎng)頁分析其實就是打開你需要請求數(shù)據(jù)的網(wǎng)頁,然后「F12」看下這個網(wǎng)頁源數(shù)據(jù)長啥樣(如果你會web知識會更好處理,不過我沒系統(tǒng)學(xué)過,操作多了就熟悉一點);

數(shù)據(jù)請求我們用人見人愛的「requests」庫,關(guān)于該庫的更詳細用法大家可以去查詢該鏈接了解(https://requests.readthedocs.io/zh_CN/latest/);

數(shù)據(jù)解析一般視請求的數(shù)據(jù)格式而定,如果請求的數(shù)據(jù)是html格式,我將介紹「bs4」和「xpath」兩種方式進行解析,若請求的數(shù)據(jù)是json格式,我將介紹json和eval兩種方式進行解析;

數(shù)據(jù)保存這里分為兩種情況,如果是圖片類會用到「open」和「write」函數(shù)方法,若是文本類的我會用到pandas的「to_excel」保存為表單格式。

2.網(wǎng)頁分析

我們在概述說提到請求的數(shù)據(jù)會有html格式或者json格式,兩種情況下其實對應(yīng)的真實請求地址是有差異的,怎么判斷呢,作為初學(xué)者我的個人經(jīng)驗就是去試試,本章節(jié)兩種嘗試方案都會介紹,大家在實操中視情況而選吧!

2.1.html頁面源數(shù)據(jù)

以下面這張英雄列表頁面為例,按住“「F12」”,然后點一下開發(fā)者模式中左上角的那個有鼠標箭頭的圖標,再在左側(cè)選取你需要的數(shù)據(jù)區(qū)域,在開發(fā)者模式區(qū)域就會出現(xiàn)這個數(shù)據(jù)區(qū)域的數(shù)據(jù)信息,比如這里的“詳情頁地址”、“頭像圖片地址”和“名稱”,我們需要的也算這些信息,所以可以直接請求該鏈接即可。


2.2.json源數(shù)據(jù)

對于局內(nèi)道具列表數(shù)據(jù),我們發(fā)現(xiàn)上述方案無法獲取,那么這種情況下我們可以選擇開發(fā)者模式中的「Network——>XHR」,然后刷新頁面,在name里找啊找,一般就能到了某個數(shù)據(jù)是我們需要的。


點「Preview」發(fā)現(xiàn)里面正是我們需要的源數(shù)據(jù),然后在「Headers」里可以找到請求到該源數(shù)據(jù)的真實鏈接地址,這里數(shù)據(jù)請求方式為「get」,我們下一節(jié)會介紹。


3.數(shù)據(jù)請求

我們提到這里用 requests 庫進行數(shù)據(jù)請求,requests 有兩種比較常用的請求方式:post和get。剛好這里我們用的到就是get一種即可,另外請求的時候可帶很多參數(shù),比如請求頭、cookie等等,具體大家查概述中鏈接文檔了解吧。

簡單的例子:

importrequests#英雄列表頁地址url?='https://pvp.qq.com/web201605/herolist.shtml'resp?=?requests.get(url)#設(shè)置解碼方式(由于請求的數(shù)據(jù)中文亂碼,這里進行解碼)resp.encoding=resp.apparent_encoding


請求到的html源數(shù)據(jù)

importrequests#局內(nèi)道具詳情頁地址url?='https://pvp.qq.com/web201605/js/item.json'resp?=?requests.get(url)#設(shè)置解碼方式(由于請求的數(shù)據(jù)中文亂碼,這里進行解碼)resp.encoding=resp.apparent_encoding


局內(nèi)道具json數(shù)據(jù)

4.數(shù)據(jù)解析

對于不同的源數(shù)據(jù)解析方式不同,html數(shù)據(jù)解析這里介紹兩種比較常用的入門級方式「bs4」和「xpath」,對于「json」數(shù)據(jù)其實相對來說更好處理,這里介紹兩種簡單的方式利用「json」和「eval」。

4.1.html數(shù)據(jù)解析

4.1.1.bs4

Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫,它能夠通過你喜歡的轉(zhuǎn)換器實現(xiàn)慣用的文檔導(dǎo)航、查找、修改文檔的方式。

更多操作詳情大家可以去看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)~

看html數(shù)據(jù)結(jié)構(gòu),我們可以找到想要的數(shù)據(jù)在「ul」節(jié)點,滿足「class="herolist clearfix"「下的全部」li」節(jié)點中。對于bs4來說,可以用「find_all」方法去定位。(更多解釋見代碼注釋哦)


#?bs4?解析frombs4importBeautifulSoup#?先將請求到的數(shù)據(jù)轉(zhuǎn)化為BeautifulSoup對象soup?=?BeautifulSoup(resp.text,'html.parser')#?定位全部的滿足?class?=?"herolist?clearfix",由于class是關(guān)鍵字所以這里用class_#?返回結(jié)果只有1個的列表,因此取索引0ul?=?soup.find_all('ul',?class_="herolist?clearfix")[0]#?定位?ul?下面全部的?li,li中藏著我們需要的數(shù)據(jù)信息lis?=?ul.find_all('li')#?創(chuàng)建一個空表用于存儲數(shù)據(jù)herolists?=?[]#?遍歷全部的liforliinlis:#?創(chuàng)建空字典,用于存儲?英雄列表信息herolist?=?{}#?get_text()?獲取節(jié)點下面的文案部分herolist['英雄名稱']?=?li.get_text()#?get()?獲取?具體值,英雄詳情頁地址在?li節(jié)點的子節(jié)點a下面herolist['英雄詳情頁']?=?li.find('a').get('href')????herolist['英雄頭像']?=?li.find('a').find('img').get('src')????herolists.append(herolist)


數(shù)據(jù)解析結(jié)果

4.1.2.xpath

XPath 是一門在 XML 文檔中查找信息的語言,可用來在 XML 文檔中對元素和屬性進行遍歷。更多語法操作可以查看(https://www.w3school.com.cn/xpath/xpath_syntax.asp )。

由于本質(zhì)過程上和bs4差不多,只是語法函數(shù)操作不太同,這里不做詳細介紹,直接看代碼了解下先。

#?xpath?解析fromlxmlimportetreehtml?=?etree.HTML(resp.text)html_ul?=?html.xpath('//ul[@class="herolist?clearfix"]')[0]html_lis?=?html_ul.xpath('./li')herolists?=?[]forhtml_liinhtml_lis:????herolist?=?{}????herolist['英雄名稱']?=?html_li.xpath('./a/text()')[0]????herolist['英雄詳情頁']?=?html_li.xpath('./a/@href')[0]????herolist['英雄頭像']?=?html_li.xpath('./a/img/@src')[0]????herolists.append(herolist)

4.2.json數(shù)據(jù)解析

在請求的數(shù)據(jù)是json格式時,直接查看數(shù)據(jù)類型發(fā)現(xiàn)是str,如下:


我們可采用json.loads()和eval方法將其轉(zhuǎn)化為列表的形式,該列表和上面html數(shù)據(jù)解析后的結(jié)果格式一樣。

import?jsonjs?=?resp.text#?json.loads()?處理li?=?json.loads(js)#?直接?eval()?處理lis?=?eval(js)


json數(shù)據(jù)解析

5.數(shù)據(jù)保存

對于圖片類數(shù)據(jù),請求圖片數(shù)據(jù)然后寫入本地保存;對于文本數(shù)據(jù)表單,轉(zhuǎn)化為dataframe類型存為excel文件(需要用到pandas庫)。

5.1.存儲圖片類數(shù)據(jù)

我們在英雄列表中有英雄頭像數(shù)據(jù),這里演示將英雄頭像數(shù)據(jù)存入本地。

#?遍歷數(shù)據(jù)解析中?英雄列表forliinherolists:#?獲取英雄頭像網(wǎng)頁地址#?如'//game.gtimg.cn/images/yxzj/img201606/heroimg/506/506.jpg'head_url?=?li['英雄頭像']#?組合 https:url?=?f'https:{head_url}'#?獲取該英雄名稱,用于賦值給圖片文件名稱head_name?=?li['英雄名稱']#?請求圖片數(shù)據(jù)head_data?=?requests.get(url)#?設(shè)置存儲圖片的全路徑head_path?=?f'保存地址'#?打開空文件寫入圖片數(shù)據(jù)open(head_path,'wb').write(head_data.content)


英雄頭像圖片數(shù)據(jù)存儲

5.2.文本數(shù)據(jù)表單存儲

importpandasaspd#?列表轉(zhuǎn)化為dataframe類型df?=?pd.DataFrame(li)


數(shù)據(jù)預(yù)覽

#?由于數(shù)據(jù)中存在一些網(wǎng)頁符號,作為?菜鳥的我只會用replace簡單替換df['des1']?=?df['des1'].str.replace('<br>',',').str.replace('<p>','').str.replace('</p>','')df['des2']?=?df['des2'].str.replace('<br>',',').str.replace('<p>','').str.replace('</p>','')#?存為表格,頁簽取名為“裝備數(shù)據(jù)信息list”df.to_excel(r'地址',index=False,sheet_name='裝備數(shù)據(jù)信息list')


道具文本數(shù)據(jù)表單

6.你也來玩一玩

標題中我們提到王者榮耀五周年,有102個英雄和326個皮膚。其實,在英雄列表中我們抓取的html數(shù)據(jù)中只有93個,如何獲取全部的呢?大家可以參考json數(shù)據(jù)請求的方式去找一找,如何根據(jù)相關(guān)數(shù)據(jù)的特點(比如英雄頭像地址里變動的其實是 英雄的id,英雄詳情頁也是)。

大家可以看看新英雄和新皮膚,如何爬取相關(guān)數(shù)據(jù)試試。

?

https://pvp.qq.com/coming/v2/

?

6.1.英雄新皮膚數(shù)

上線五年,一共93個英雄新出過皮膚,其中貂蟬、花木蘭和孫悟空新增皮膚最多,高達5個??!


在93個英雄中,大部分只新增過1個皮膚~

6.2.新增皮膚上線時間

從上線月份來看,1月是英雄上線高峰,這個和1月大部分為春節(jié)月有關(guān),畢竟這款產(chǎn)品春節(jié)也是最賺錢的。


從上線年份來看,2015年其實10月底產(chǎn)品才上線,所以整體新增皮膚不多,16及17年游戲高速增長期吧,團隊產(chǎn)能并沒有明顯提高?所以在18年之后,團隊大了,新增皮膚蹭的飛漲!


6.3.王者英雄產(chǎn)能

2015年10月28日王者首發(fā)時,有33個英雄,大家熟悉的亞瑟、項羽、安琪拉等都是第一批。截止到現(xiàn)在,5年時間內(nèi)新增英雄69個。

從上線月份來看,2、8、11和1月份是新英雄出的最多的,為啥啊?


從上線年份來看,2015年上線2個月內(nèi)上線7個新英雄,很快,畢竟存了很多量嘛。隨后可以看到2016年新英雄產(chǎn)出是高峰,隨后逐年降低的趨勢,為啥?「畢竟英雄設(shè)計是非常非常費腦袋的?。?!」

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容