本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)用爪、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請(qǐng)及時(shí)聯(lián)系我們以作處理
1.概述
《王者榮耀》上線至今5個(gè)年頭了,作為這些年國(guó)內(nèi)最熱門的手游(沒有之一)胁镐,除了帶來(lái)游戲娛樂之外偎血,我們?cè)谶@五周年之際,試著從他們的官網(wǎng)找點(diǎn)樂趣盯漂,學(xué)習(xí)一下Python爬蟲的一些簡(jiǎn)單基礎(chǔ)操作颇玷。
本篇將主要介紹簡(jiǎn)單的Python爬蟲,包括網(wǎng)頁(yè)分析就缆、數(shù)據(jù)請(qǐng)求帖渠、數(shù)據(jù)解析和數(shù)據(jù)保存,適用于基本不帶反爬的一些網(wǎng)站竭宰,旨在進(jìn)行學(xué)習(xí)交流空郊,請(qǐng)勿用作任何商業(yè)非法用途。
網(wǎng)頁(yè)分析其實(shí)就是打開你需要請(qǐng)求數(shù)據(jù)的網(wǎng)頁(yè)羞延,然后「F12」看下這個(gè)網(wǎng)頁(yè)源數(shù)據(jù)長(zhǎng)啥樣(如果你會(huì)web知識(shí)會(huì)更好處理渣淳,不過我沒系統(tǒng)學(xué)過,操作多了就熟悉一點(diǎn))伴箩;
數(shù)據(jù)請(qǐng)求我們用人見人愛的「requests」庫(kù)入愧,關(guān)于該庫(kù)的更詳細(xì)用法大家可以去查詢?cè)撴溄恿私?https://requests.readthedocs.io/zh_CN/latest/);
數(shù)據(jù)解析一般視請(qǐng)求的數(shù)據(jù)格式而定嗤谚,如果請(qǐng)求的數(shù)據(jù)是html格式棺蛛,我將介紹「bs4」和「xpath」兩種方式進(jìn)行解析,若請(qǐng)求的數(shù)據(jù)是json格式巩步,我將介紹json和eval兩種方式進(jìn)行解析旁赊;
數(shù)據(jù)保存這里分為兩種情況,如果是圖片類會(huì)用到「open」和「write」函數(shù)方法椅野,若是文本類的我會(huì)用到pandas的「to_excel」保存為表單格式终畅。
2.網(wǎng)頁(yè)分析
我們?cè)诟攀稣f(shuō)提到請(qǐng)求的數(shù)據(jù)會(huì)有html格式或者json格式籍胯,兩種情況下其實(shí)對(duì)應(yīng)的真實(shí)請(qǐng)求地址是有差異的,怎么判斷呢离福,作為初學(xué)者我的個(gè)人經(jīng)驗(yàn)就是去試試杖狼,本章節(jié)兩種嘗試方案都會(huì)介紹,大家在實(shí)操中視情況而選吧妖爷!
2.1.html頁(yè)面源數(shù)據(jù)
以下面這張英雄列表頁(yè)面為例蝶涩,按住“「F12」”,然后點(diǎn)一下開發(fā)者模式中左上角的那個(gè)有鼠標(biāo)箭頭的圖標(biāo)絮识,再在左側(cè)選取你需要的數(shù)據(jù)區(qū)域绿聘,在開發(fā)者模式區(qū)域就會(huì)出現(xiàn)這個(gè)數(shù)據(jù)區(qū)域的數(shù)據(jù)信息,比如這里的“詳情頁(yè)地址”次舌、“頭像圖片地址”和“名稱”熄攘,我們需要的也算這些信息,所以可以直接請(qǐng)求該鏈接即可垃它。
2.2.json源數(shù)據(jù)
對(duì)于局內(nèi)道具列表數(shù)據(jù)鲜屏,我們發(fā)現(xiàn)上述方案無(wú)法獲取烹看,那么這種情況下我們可以選擇開發(fā)者模式中的「Network——>XHR」国拇,然后刷新頁(yè)面,在name里找啊找惯殊,一般就能到了某個(gè)數(shù)據(jù)是我們需要的酱吝。
點(diǎn)「Preview」發(fā)現(xiàn)里面正是我們需要的源數(shù)據(jù),然后在「Headers」里可以找到請(qǐng)求到該源數(shù)據(jù)的真實(shí)鏈接地址土思,這里數(shù)據(jù)請(qǐng)求方式為「get」务热,我們下一節(jié)會(huì)介紹。
3.數(shù)據(jù)請(qǐng)求
我們提到這里用 requests 庫(kù)進(jìn)行數(shù)據(jù)請(qǐng)求己儒,requests 有兩種比較常用的請(qǐng)求方式:post和get崎岂。剛好這里我們用的到就是get一種即可,另外請(qǐng)求的時(shí)候可帶很多參數(shù)闪湾,比如請(qǐng)求頭冲甘、cookie等等,具體大家查概述中鏈接文檔了解吧途样。
簡(jiǎn)單的例子:
importrequests#英雄列表頁(yè)地址url?='https://pvp.qq.com/web201605/herolist.shtml'resp?=?requests.get(url)#設(shè)置解碼方式(由于請(qǐng)求的數(shù)據(jù)中文亂碼江醇,這里進(jìn)行解碼)resp.encoding=resp.apparent_encoding
請(qǐng)求到的html源數(shù)據(jù)
importrequests#局內(nèi)道具詳情頁(yè)地址url?='https://pvp.qq.com/web201605/js/item.json'resp?=?requests.get(url)#設(shè)置解碼方式(由于請(qǐng)求的數(shù)據(jù)中文亂碼,這里進(jìn)行解碼)resp.encoding=resp.apparent_encoding
局內(nèi)道具json數(shù)據(jù)
4.數(shù)據(jù)解析
對(duì)于不同的源數(shù)據(jù)解析方式不同何暇,html數(shù)據(jù)解析這里介紹兩種比較常用的入門級(jí)方式「bs4」和「xpath」陶夜,對(duì)于「json」數(shù)據(jù)其實(shí)相對(duì)來(lái)說(shuō)更好處理,這里介紹兩種簡(jiǎn)單的方式利用「json」和「eval」裆站。
4.1.html數(shù)據(jù)解析
4.1.1.bs4
Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù)条辟,它能夠通過你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航黔夭、查找、修改文檔的方式羽嫡。
更多操作詳情大家可以去看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)~
看html數(shù)據(jù)結(jié)構(gòu)纠修,我們可以找到想要的數(shù)據(jù)在「ul」節(jié)點(diǎn),滿足「class="herolist clearfix"「下的全部」li」節(jié)點(diǎn)中厂僧。對(duì)于bs4來(lái)說(shuō)扣草,可以用「find_all」方法去定位。(更多解釋見代碼注釋哦)
#?bs4?解析frombs4importBeautifulSoup#?先將請(qǐng)求到的數(shù)據(jù)轉(zhuǎn)化為BeautifulSoup對(duì)象soup?=?BeautifulSoup(resp.text,'html.parser')#?定位全部的滿足?class?=?"herolist?clearfix"颜屠,由于class是關(guān)鍵字所以這里用class_#?返回結(jié)果只有1個(gè)的列表辰妙,因此取索引0ul?=?soup.find_all('ul',?class_="herolist?clearfix")[0]#?定位?ul?下面全部的?li,li中藏著我們需要的數(shù)據(jù)信息lis?=?ul.find_all('li')#?創(chuàng)建一個(gè)空表用于存儲(chǔ)數(shù)據(jù)herolists?=?[]#?遍歷全部的liforliinlis:#?創(chuàng)建空字典甫窟,用于存儲(chǔ)?英雄列表信息herolist?=?{}#?get_text()?獲取節(jié)點(diǎn)下面的文案部分herolist['英雄名稱']?=?li.get_text()#?get()?獲取?具體值密浑,英雄詳情頁(yè)地址在?li節(jié)點(diǎn)的子節(jié)點(diǎn)a下面herolist['英雄詳情頁(yè)']?=?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 文檔中查找信息的語(yǔ)言,可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷粗井。更多語(yǔ)法操作可以查看(https://www.w3school.com.cn/xpath/xpath_syntax.asp )尔破。
由于本質(zhì)過程上和bs4差不多,只是語(yǔ)法函數(shù)操作不太同浇衬,這里不做詳細(xì)介紹懒构,直接看代碼了解下先。
#?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['英雄詳情頁(yè)']?=?html_li.xpath('./a/@href')[0]????herolist['英雄頭像']?=?html_li.xpath('./a/img/@src')[0]????herolists.append(herolist)
4.2.json數(shù)據(jù)解析
在請(qǐng)求的數(shù)據(jù)是json格式時(shí)耘擂,直接查看數(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ù)保存
對(duì)于圖片類數(shù)據(jù)秩霍,請(qǐng)求圖片數(shù)據(jù)然后寫入本地保存;對(duì)于文本數(shù)據(jù)表單蚁阳,轉(zhuǎn)化為dataframe類型存為excel文件(需要用到pandas庫(kù))铃绒。
5.1.存儲(chǔ)圖片類數(shù)據(jù)
我們?cè)谟⑿哿斜碇杏杏⑿垲^像數(shù)據(jù),這里演示將英雄頭像數(shù)據(jù)存入本地螺捐。
#?遍歷數(shù)據(jù)解析中?英雄列表forliinherolists:#?獲取英雄頭像網(wǎng)頁(yè)地址#?如'//game.gtimg.cn/images/yxzj/img201606/heroimg/506/506.jpg'head_url?=?li['英雄頭像']#?組合 https:url?=?f'https:{head_url}'#?獲取該英雄名稱颠悬,用于賦值給圖片文件名稱head_name?=?li['英雄名稱']#?請(qǐng)求圖片數(shù)據(jù)head_data?=?requests.get(url)#?設(shè)置存儲(chǔ)圖片的全路徑head_path?=?f'保存地址'#?打開空文件寫入圖片數(shù)據(jù)open(head_path,'wb').write(head_data.content)
英雄頭像圖片數(shù)據(jù)存儲(chǔ)
5.2.文本數(shù)據(jù)表單存儲(chǔ)
importpandasaspd#?列表轉(zhuǎn)化為dataframe類型df?=?pd.DataFrame(li)
數(shù)據(jù)預(yù)覽
#?由于數(shù)據(jù)中存在一些網(wǎng)頁(yè)符號(hào),作為?菜鳥的我只會(huì)用replace簡(jiǎn)單替換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>','')#?存為表格,頁(yè)簽取名為“裝備數(shù)據(jù)信息list”df.to_excel(r'地址',index=False,sheet_name='裝備數(shù)據(jù)信息list')
道具文本數(shù)據(jù)表單
6.你也來(lái)玩一玩
標(biāo)題中我們提到王者榮耀五周年糠悼,有102個(gè)英雄和326個(gè)皮膚届榄。其實(shí),在英雄列表中我們抓取的html數(shù)據(jù)中只有93個(gè)倔喂,如何獲取全部的呢铝条?大家可以參考json數(shù)據(jù)請(qǐng)求的方式去找一找靖苇,如何根據(jù)相關(guān)數(shù)據(jù)的特點(diǎn)(比如英雄頭像地址里變動(dòng)的其實(shí)是 英雄的id,英雄詳情頁(yè)也是)班缰。
大家可以看看新英雄和新皮膚贤壁,如何爬取相關(guān)數(shù)據(jù)試試。
?
https://pvp.qq.com/coming/v2/
?
6.1.英雄新皮膚數(shù)
上線五年埠忘,一共93個(gè)英雄新出過皮膚脾拆,其中貂蟬、花木蘭和孫悟空新增皮膚最多莹妒,高達(dá)5個(gè)C!
在93個(gè)英雄中旨怠,大部分只新增過1個(gè)皮膚~
6.2.新增皮膚上線時(shí)間
從上線月份來(lái)看渠驼,1月是英雄上線高峰,這個(gè)和1月大部分為春節(jié)月有關(guān)鉴腻,畢竟這款產(chǎn)品春節(jié)也是最賺錢的迷扇。
從上線年份來(lái)看,2015年其實(shí)10月底產(chǎn)品才上線爽哎,所以整體新增皮膚不多蜓席,16及17年游戲高速增長(zhǎng)期吧,團(tuán)隊(duì)產(chǎn)能并沒有明顯提高倦青?所以在18年之后瓮床,團(tuán)隊(duì)大了,新增皮膚蹭的飛漲产镐!
6.3.王者英雄產(chǎn)能
2015年10月28日王者首發(fā)時(shí),有33個(gè)英雄踢步,大家熟悉的亞瑟癣亚、項(xiàng)羽、安琪拉等都是第一批获印。截止到現(xiàn)在述雾,5年時(shí)間內(nèi)新增英雄69個(gè)。
從上線月份來(lái)看兼丰,2玻孟、8、11和1月份是新英雄出的最多的鳍征,為啥笆螋帷?
從上線年份來(lái)看艳丛,2015年上線2個(gè)月內(nèi)上線7個(gè)新英雄匣掸,很快趟紊,畢竟存了很多量嘛。隨后可以看到2016年新英雄產(chǎn)出是高峰碰酝,隨后逐年降低的趨勢(shì)霎匈,為啥?「畢竟英雄設(shè)計(jì)是非常非常費(fèi)腦袋的八桶帧n踔觥!」