本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理
1.概述
《王者榮耀》上線至今5個年頭了,作為這些年國內最熱門的手游(沒有之一),除了帶來游戲娛樂之外,我們在這五周年之際,試著從他們的官網找點樂趣,學習一下Python爬蟲的一些簡單基礎操作。
本篇將主要介紹簡單的Python爬蟲,包括網頁分析、數據請求、數據解析和數據保存,適用于基本不帶反爬的一些網站,旨在進行學習交流,請勿用作任何商業非法用途。
網頁分析其實就是打開你需要請求數據的網頁,然后「F12」看下這個網頁源數據長啥樣(如果你會web知識會更好處理,不過我沒系統學過,操作多了就熟悉一點);
數據請求我們用人見人愛的「requests」庫,關于該庫的更詳細用法大家可以去查詢該鏈接了解(https://requests.readthedocs.io/zh_CN/latest/);
數據解析一般視請求的數據格式而定,如果請求的數據是html格式,我將介紹「bs4」和「xpath」兩種方式進行解析,若請求的數據是json格式,我將介紹json和eval兩種方式進行解析;
數據保存這里分為兩種情況,如果是圖片類會用到「open」和「write」函數方法,若是文本類的我會用到pandas的「to_excel」保存為表單格式。
2.網頁分析
我們在概述說提到請求的數據會有html格式或者json格式,兩種情況下其實對應的真實請求地址是有差異的,怎么判斷呢,作為初學者我的個人經驗就是去試試,本章節兩種嘗試方案都會介紹,大家在實操中視情況而選吧!
2.1.html頁面源數據
以下面這張英雄列表頁面為例,按住“「F12」”,然后點一下開發者模式中左上角的那個有鼠標箭頭的圖標,再在左側選取你需要的數據區域,在開發者模式區域就會出現這個數據區域的數據信息,比如這里的“詳情頁地址”、“頭像圖片地址”和“名稱”,我們需要的也算這些信息,所以可以直接請求該鏈接即可。
2.2.json源數據
對于局內道具列表數據,我們發現上述方案無法獲取,那么這種情況下我們可以選擇開發者模式中的「Network——>XHR」,然后刷新頁面,在name里找啊找,一般就能到了某個數據是我們需要的。
點「Preview」發現里面正是我們需要的源數據,然后在「Headers」里可以找到請求到該源數據的真實鏈接地址,這里數據請求方式為「get」,我們下一節會介紹。
3.數據請求
我們提到這里用 requests 庫進行數據請求,requests 有兩種比較常用的請求方式:post和get。剛好這里我們用的到就是get一種即可,另外請求的時候可帶很多參數,比如請求頭、cookie等等,具體大家查概述中鏈接文檔了解吧。
簡單的例子:
importrequests#英雄列表頁地址url?='https://pvp.qq.com/web201605/herolist.shtml'resp?=?requests.get(url)#設置解碼方式(由于請求的數據中文亂碼,這里進行解碼)resp.encoding=resp.apparent_encoding
請求到的html源數據
importrequests#局內道具詳情頁地址url?='https://pvp.qq.com/web201605/js/item.json'resp?=?requests.get(url)#設置解碼方式(由于請求的數據中文亂碼,這里進行解碼)resp.encoding=resp.apparent_encoding
局內道具json數據
4.數據解析
對于不同的源數據解析方式不同,html數據解析這里介紹兩種比較常用的入門級方式「bs4」和「xpath」,對于「json」數據其實相對來說更好處理,這里介紹兩種簡單的方式利用「json」和「eval」。
4.1.html數據解析
4.1.1.bs4
Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫,它能夠通過你喜歡的轉換器實現慣用的文檔導航、查找、修改文檔的方式。
更多操作詳情大家可以去看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)~
看html數據結構,我們可以找到想要的數據在「ul」節點,滿足「class="herolist clearfix"「下的全部」li」節點中。對于bs4來說,可以用「find_all」方法去定位。(更多解釋見代碼注釋哦)
#?bs4?解析frombs4importBeautifulSoup#?先將請求到的數據轉化為BeautifulSoup對象soup?=?BeautifulSoup(resp.text,'html.parser')#?定位全部的滿足?class?=?"herolist?clearfix",由于class是關鍵字所以這里用class_#?返回結果只有1個的列表,因此取索引0ul?=?soup.find_all('ul',?class_="herolist?clearfix")[0]#?定位?ul?下面全部的?li,li中藏著我們需要的數據信息lis?=?ul.find_all('li')#?創建一個空表用于存儲數據herolists?=?[]#?遍歷全部的liforliinlis:#?創建空字典,用于存儲?英雄列表信息herolist?=?{}#?get_text()?獲取節點下面的文案部分herolist['英雄名稱']?=?li.get_text()#?get()?獲取?具體值,英雄詳情頁地址在?li節點的子節點a下面herolist['英雄詳情頁']?=?li.find('a').get('href')????herolist['英雄頭像']?=?li.find('a').find('img').get('src')????herolists.append(herolist)
數據解析結果
4.1.2.xpath
XPath 是一門在 XML 文檔中查找信息的語言,可用來在 XML 文檔中對元素和屬性進行遍歷。更多語法操作可以查看(https://www.w3school.com.cn/xpath/xpath_syntax.asp )。
由于本質過程上和bs4差不多,只是語法函數操作不太同,這里不做詳細介紹,直接看代碼了解下先。
#?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數據解析
在請求的數據是json格式時,直接查看數據類型發現是str,如下:
我們可采用json.loads()和eval方法將其轉化為列表的形式,該列表和上面html數據解析后的結果格式一樣。
import?jsonjs?=?resp.text#?json.loads()?處理li?=?json.loads(js)#?直接?eval()?處理lis?=?eval(js)
json數據解析
5.數據保存
對于圖片類數據,請求圖片數據然后寫入本地保存;對于文本數據表單,轉化為dataframe類型存為excel文件(需要用到pandas庫)。
5.1.存儲圖片類數據
我們在英雄列表中有英雄頭像數據,這里演示將英雄頭像數據存入本地。
#?遍歷數據解析中?英雄列表forliinherolists:#?獲取英雄頭像網頁地址#?如'//game.gtimg.cn/images/yxzj/img201606/heroimg/506/506.jpg'head_url?=?li['英雄頭像']#?組合 https:url?=?f'https:{head_url}'#?獲取該英雄名稱,用于賦值給圖片文件名稱head_name?=?li['英雄名稱']#?請求圖片數據head_data?=?requests.get(url)#?設置存儲圖片的全路徑head_path?=?f'保存地址'#?打開空文件寫入圖片數據open(head_path,'wb').write(head_data.content)
英雄頭像圖片數據存儲
5.2.文本數據表單存儲
importpandasaspd#?列表轉化為dataframe類型df?=?pd.DataFrame(li)
數據預覽
#?由于數據中存在一些網頁符號,作為?菜鳥的我只會用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>','')#?存為表格,頁簽取名為“裝備數據信息list”df.to_excel(r'地址',index=False,sheet_name='裝備數據信息list')
道具文本數據表單
6.你也來玩一玩
標題中我們提到王者榮耀五周年,有102個英雄和326個皮膚。其實,在英雄列表中我們抓取的html數據中只有93個,如何獲取全部的呢?大家可以參考json數據請求的方式去找一找,如何根據相關數據的特點(比如英雄頭像地址里變動的其實是 英雄的id,英雄詳情頁也是)。
大家可以看看新英雄和新皮膚,如何爬取相關數據試試。
?
https://pvp.qq.com/coming/v2/
?
6.1.英雄新皮膚數
上線五年,一共93個英雄新出過皮膚,其中貂蟬、花木蘭和孫悟空新增皮膚最多,高達5個!!
在93個英雄中,大部分只新增過1個皮膚~
6.2.新增皮膚上線時間
從上線月份來看,1月是英雄上線高峰,這個和1月大部分為春節月有關,畢竟這款產品春節也是最賺錢的。
從上線年份來看,2015年其實10月底產品才上線,所以整體新增皮膚不多,16及17年游戲高速增長期吧,團隊產能并沒有明顯提高?所以在18年之后,團隊大了,新增皮膚蹭的飛漲!
6.3.王者英雄產能
2015年10月28日王者首發時,有33個英雄,大家熟悉的亞瑟、項羽、安琪拉等都是第一批。截止到現在,5年時間內新增英雄69個。
從上線月份來看,2、8、11和1月份是新英雄出的最多的,為啥啊?
從上線年份來看,2015年上線2個月內上線7個新英雄,很快,畢竟存了很多量嘛。隨后可以看到2016年新英雄產出是高峰,隨后逐年降低的趨勢,為啥?「畢竟英雄設計是非常非常費腦袋的啊!!」