我用Python爬了《王者榮耀盒子》,發(fā)現(xiàn)王者榮耀最強(qiáng)套路!
原創(chuàng)【51CTO.com原創(chuàng)稿件】程序員的鄙視鏈,您聽(tīng)說(shuō)過(guò)嗎?話(huà)說(shuō):老婆漂亮的程序員,鄙視老婆不漂亮的程序員;有老婆的程序員,鄙視沒(méi)有老婆的程序員;沒(méi)有老婆有女朋友的程序員,鄙視單身狗。
在單身狗之間,才有語(yǔ)言、編輯器和操作系統(tǒng)的互相鄙視。不知為何,看到這句話(huà)的時(shí)候,我的內(nèi)心陣陣絞痛。
現(xiàn)在看看,這游戲也是如此。玩星際的,鄙視玩 Dota 的;玩 Dota 的,鄙視玩 LOL 的;玩 LOL 的,鄙視玩王者榮耀的。
雖說(shuō)王者榮耀處于游戲鄙視鏈的低端,但是不得不說(shuō),它確實(shí)有自己獨(dú)到的魅力,正因?yàn)樗档土送婕业拈T(mén)檻,才有了如今的全民王者的熱潮。你永遠(yuǎn)不知道自己匹配的隊(duì)友和對(duì)手是老人,還是小孩。或者換種說(shuō)法,是人,還是動(dòng)物?
毫無(wú)疑問(wèn),王者榮耀從全民熱度等諸多表現(xiàn)上看,是非常成功的游戲??芍^男女老少通吃,本文不討論到底是女大學(xué)生坑,還是小學(xué)生坑,這樣高難度的問(wèn)題。咱玩點(diǎn)簡(jiǎn)單的,讓我先看一款王者榮耀神器-王者榮耀盒子。
《王者榮耀盒子》是專(zhuān)門(mén)為《王者榮耀》玩家量身打造的一款攻略應(yīng)用,可謂上分必備神器,這里有職業(yè)選手教你英雄出裝、銘文搭配和各種對(duì)線(xiàn)團(tuán)戰(zhàn)技巧,同時(shí)它也整合最全的游戲資訊以及游戲?qū)崟r(shí)動(dòng)態(tài)。先看看它長(zhǎng)什么樣:
APP 下載地址:http://www.eoemarket.com/soft/870210.html
本文內(nèi)容就是爬取《王者榮耀盒子》這款 APP 上的信息,廢話(huà)不多說(shuō),直接開(kāi)始實(shí)戰(zhàn)!
運(yùn)行平臺(tái): Windows
Python版本: Python3.x
IDE: Sublime text3
什么是 Fiddler?
Fiddler 是位于客戶(hù)端和服務(wù)器端的 HTTP 代理,也是目前最常用的 HTTP 抓包工具之一 。
它能夠記錄客戶(hù)端和服務(wù)器之間的所有 HTTP 請(qǐng)求,可以針對(duì)特定的 HTTP 請(qǐng)求,分析請(qǐng)求數(shù)據(jù)、設(shè)置斷點(diǎn)、調(diào)試 Web 應(yīng)用、修改請(qǐng)求的數(shù)據(jù),甚至可以修改服務(wù)器返回的數(shù)據(jù),功能非常強(qiáng)大,是 Web 調(diào)試的利器。
既然是代理,也就是說(shuō):客戶(hù)端的所有請(qǐng)求都要先經(jīng)過(guò) Fiddler,然后轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)器,反之,服務(wù)器端的所有響應(yīng),也都會(huì)先經(jīng)過(guò) Fiddler 然后發(fā)送到客戶(hù)端。
基于這個(gè)原因,F(xiàn)iddler 支持所有可以設(shè)置 HTTP 代理為 127.0.0.1:8888 的瀏覽器和應(yīng)用程序。
使用了 Fiddler 之后,Web 客戶(hù)端和服務(wù)器的請(qǐng)求如下所示:
利用可以設(shè)置代理的這個(gè)特點(diǎn),我們就可以對(duì)手機(jī) APP 進(jìn)行抓包了。怎么設(shè)置?不急不急,讓我先把 Fiddler 安裝上吧!
Fiddler 下載地址:http://fiddler2.com/
傻瓜式安裝,一鍵到底。Fiddler 軟件界面如圖所示:
手機(jī) APP 抓包設(shè)置
Fiddler 設(shè)置
打開(kāi) Fiddler 軟件,打開(kāi)工具的設(shè)置。(Fiddler 軟件菜單欄:Tools->Options)
在 HTTPS 中設(shè)置如下:
在 Connections 中設(shè)置如下,這里使用默認(rèn) 8888 端口,當(dāng)然也可以自己更改,但是注意不要與已經(jīng)使用的端口沖突:
安全證書(shū)下載
在電腦瀏覽器中輸入地址: http://localhost:8888/,點(diǎn)擊 FiddlerRoot certificate,下載安全證書(shū):
安全證書(shū)安裝
證書(shū)是需要在手機(jī)上進(jìn)行安裝的,這樣在電腦 Fiddler 軟件抓包的時(shí)候,手機(jī)使用電腦的網(wǎng)卡上網(wǎng)才不會(huì)報(bào)錯(cuò)。
將下載好的 FiddlerRoot.cer 安裝證書(shū)拷貝到手機(jī)中,然后進(jìn)行證書(shū)安裝。以小米 5 手機(jī)為例:設(shè)置(Settings)->(系統(tǒng)和設(shè)備中的)更多設(shè)置->系統(tǒng)安全->從存儲(chǔ)設(shè)備安裝:
然后找到拷貝的 FiddlerRoot.cer 進(jìn)行安裝即可。安裝好之后,可以在信任的憑證中找到我們已經(jīng)安裝好的安全證書(shū),在用戶(hù)中可以看到證書(shū)如下:
局域網(wǎng)設(shè)置
想要使用 Fiddler 進(jìn)行手機(jī)抓包,首先要確保手機(jī)和電腦的網(wǎng)絡(luò)在一個(gè)內(nèi)網(wǎng)中,可以讓電腦和手機(jī)都連接同一個(gè)路由器。
當(dāng)然,也可以讓電腦開(kāi)放 WiFi 熱點(diǎn),手機(jī)連入。這里,我使用的方法是,讓手機(jī)和電腦同時(shí)連入一個(gè)路由器中。***,讓手機(jī)使用電腦的代理 IP 進(jìn)行上網(wǎng)。
首先,查看電腦的 IP 地址,在 cmd 中使用命令 ipconfig 查看電腦 IP 地址。找到無(wú)線(xiàn)局域網(wǎng) WLAN 的 IPv4 地址,記下此地址。
在手機(jī)上,點(diǎn)擊連接的 WiFi 進(jìn)行網(wǎng)絡(luò)修改,添加代理。進(jìn)行手動(dòng)設(shè)置,主機(jī)名即為上圖中找到的 IP 地址,端口號(hào)即為 Fiddler 設(shè)置中的端口號(hào) 8888:
Fiddler 手機(jī)抓包測(cè)試
上述步驟都設(shè)置完成之后,用手機(jī)瀏覽器打開(kāi)百度首頁(yè),我們就可以順利抓包了,截圖如下:
實(shí)戰(zhàn)走起
下載英雄圖片
先來(lái)個(gè)簡(jiǎn)單的例子熱熱身,我想將《英雄聯(lián)盟盒子》中的英雄圖片下載下來(lái),該如何操作?
先使用 Fiddler 抓包看一下,在手機(jī) APP《英雄聯(lián)盟盒子》中的菜單中點(diǎn)擊英雄,電腦 Fiddler 就會(huì)抓包如下:
可以看到,GET 請(qǐng)求的 url 地址,和返回的 JSON 格式的信息。那么編寫(xiě)代碼如下:
- import requests
- if __name__ == '__main__':
- headers = {'Accept-Charset': 'UTF-8',
- 'Accept-Encoding': 'gzip,deflate',
- 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
- 'X-Requested-With': 'XMLHttpRequest',
- 'Content-type': 'application/x-www-form-urlencoded',
- 'Connection': 'Keep-Alive',
- 'Host': 'gamehelper.gm825.com'}
- heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8"
- req = requests.get(url = heros_url, headers = headers).json()
- print(req['list'])
從代碼運(yùn)行結(jié)果中可以看到,百里玄策的英雄 ID 為 104,他的圖片存放地址為 http://pic.wankacn.com/2017-08-04_59844776a6adf.png:
知道了這些信息,我們就可以將這些英雄的圖片進(jìn)行下載了,編寫(xiě)代碼如下:
- from urllib.request import urlretrieve
- import requests
- import os
- """
- 函數(shù)說(shuō)明:下載《英雄聯(lián)盟盒子》中的英雄圖片
- Parameters:
- heros_url - GET請(qǐng)求地址,通過(guò)Fiddler抓包獲取
- header - header信息
- Returns:
- 無(wú)
- Author:
- Jack Cui
- Blog:
- http://blog.csdn.net/c406495762
- Modify:
- 2017-08-07
- """
- def hero_imgs_download(heros_url,header):
- req = requests.get(url = heros_url, headers = header).json()
- hero_num = len(req['list'])
- print('一共有%d個(gè)英雄' % hero_num)
- hero_images_path = 'hero_images'
- for each_hero in req['list']:
- hero_photo_url = each_hero['cover']
- hero_name = each_hero['name'] + '.jpg'
- filename = hero_images_path + '/' + hero_name
- if hero_images_path not in os.listdir():
- os.makedirs(hero_images_path)
- urlretrieve(url = hero_photo_url, filename = filename)
- if __name__ == '__main__':
- headers = {'Accept-Charset': 'UTF-8',
- 'Accept-Encoding': 'gzip,deflate',
- 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
- 'X-Requested-With': 'XMLHttpRequest',
- 'Content-type': 'application/x-www-form-urlencoded',
- 'Connection': 'Keep-Alive',
- 'Host': 'gamehelper.gm825.com'}
- heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8"
- hero_imgs_download(heros_url,headers)
運(yùn)行上述代碼,看下結(jié)果,72 個(gè)英雄的圖片,分分鐘搞定:

是不是很簡(jiǎn)單?接下來(lái),再玩一個(gè)加點(diǎn)難度的。
英雄推薦出裝查詢(xún)助手
點(diǎn)擊百里玄策這個(gè)英雄,可以看到,里面有他的簡(jiǎn)介,包括技能介紹,以及推薦出裝等。那么,我們就了利用這個(gè)做一個(gè)自己的英雄出裝查詢(xún)小助手吧。
手機(jī)點(diǎn)擊百里玄策這個(gè)英雄,可以在電腦 Fiddler 看到如下抓包內(nèi)容:
我們看下 GET 請(qǐng)求的 URL:
- http://gamehelper.gm825.com/wzry/hero/detail?hero_id=104&channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8
很有特點(diǎn)發(fā)現(xiàn)了嗎?在 url 的 heroid 為 104,在上個(gè)小實(shí)例中,我們發(fā)現(xiàn),這個(gè) 104 正好是英雄的 ID,那么是不是可以通過(guò)設(shè)置這個(gè) ID 來(lái)訪問(wèn)不同的英雄界面呢?
測(cè)試一下答案就出來(lái)了,我們將 ID 改為 103,也就是女?huà)z的 heroid,編寫(xiě)代碼如下:
- import requests
- if __name__ == '__main__':
- headers = {'Accept-Charset': 'UTF-8',
- 'Accept-Encoding': 'gzip,deflate',
- 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
- 'X-Requested-With': 'XMLHttpRequest',
- 'Content-type': 'application/x-www-form-urlencoded',
- 'Connection': 'Keep-Alive',
- 'Host': 'gamehelper.gm825.com'}
- hero_url = "http://gamehelper.gm825.com/wzry/hero/detail?hero_id={}&channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8".format('103')
- req = requests.get(url = hero_url, headers = headers).json()
- print(req['info'])
運(yùn)行上述代碼,我們可以看到,打印的信息確實(shí)是英雄女?huà)z的信息,返回的信息顯示,這個(gè)英雄還沒(méi)有上線(xiàn)。
推薦出裝保存在 equip_choice 中,可以看到這里沒(méi)有給出裝備的名字,只有裝備的 equip_id,那么在寫(xiě)推薦出裝小程序之前,我們需要獲取所有裝備的 ID。
怎樣獲取武器的信息?抓包方法同上,點(diǎn)擊裝備大全:
通過(guò) Fiddler 抓包信息,編寫(xiě)代碼如下:
- import requests
- if __name__ == '__main__':
- headers = {'Accept-Charset': 'UTF-8',
- 'Accept-Encoding': 'gzip,deflate',
- 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)',
- 'X-Requested-With': 'XMLHttpRequest',
- 'Content-type': 'application/x-www-form-urlencoded',
- 'Connection': 'Keep-Alive',
- 'Host': 'gamehelper.gm825.com'}
- weapon_url = "http://gamehelper.gm825.com/wzry/equip/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8"
- req = requests.get(url = weapon_url, headers = headers).json()
- print(req['list'])
這樣我們就輕松得到了各個(gè)裝備的信息:
到這里,我們就可以整合代碼了,首先通過(guò)獲取每個(gè)英雄的 ID,然后根據(jù)每個(gè)英雄的 ID,再獲得英雄的詳細(xì)信息,包括推薦出裝,***通過(guò)推薦的裝備 ID,找到裝備的信息并打印出來(lái)。
根據(jù)實(shí)現(xiàn)效果,自己編寫(xiě)代碼試一試如何?《王者榮耀》出裝小助手,運(yùn)行效果如圖所示:
如果功能已經(jīng)實(shí)現(xiàn)了,那么先恭喜一聲!
上述功能代碼獲取地址:https://github.com/Jack-Cherish/python-spider/blob/master/hero.py ,歡迎 Follow、Star!
總結(jié)
本文的例子對(duì)于入門(mén)手機(jī) APP 內(nèi)容的爬取有一定的幫助作用。趁著《王者榮耀盒子》APP 沒(méi)有更新,很好爬,趕緊動(dòng)手實(shí)踐吧!
爬取 APP 的內(nèi)容和爬取網(wǎng)頁(yè)的思路是一樣的,都是通過(guò)抓包進(jìn)行分析。如有問(wèn)題,請(qǐng)留言。如有錯(cuò)誤,還望指正,謝謝!
催家華
知名博客博主
現(xiàn)就讀于東北大學(xué)模式識(shí)別與智能系統(tǒng)專(zhuān)業(yè)。本科期間,曾擔(dān)任學(xué)生會(huì)”科技創(chuàng)新中心主任”一職,負(fù)責(zé)組織各類(lèi)科技競(jìng)賽相關(guān)活動(dòng)。與此同時(shí),熱愛(ài)科技競(jìng)賽,曾于 2015 年獲得第十屆全國(guó)大學(xué)生“飛思卡爾”杯智能車(chē)競(jìng)賽全國(guó)一等獎(jiǎng)。研究生期間,致力于機(jī)器學(xué)習(xí),在知名博客已取得了不錯(cuò)的關(guān)注度。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】