我用Python爬了《王者榮耀盒子》,發(fā)現(xiàn)王者榮耀最強(qiáng)套路!
原創(chuàng)【51CTO.com原創(chuàng)稿件】程序員的鄙視鏈,您聽說過嗎?話說:老婆漂亮的程序員,鄙視老婆不漂亮的程序員;有老婆的程序員,鄙視沒有老婆的程序員;沒有老婆有女朋友的程序員,鄙視單身狗。
在單身狗之間,才有語言、編輯器和操作系統(tǒng)的互相鄙視。不知為何,看到這句話的時候,我的內(nèi)心陣陣絞痛。
現(xiàn)在看看,這游戲也是如此。玩星際的,鄙視玩 Dota 的;玩 Dota 的,鄙視玩 LOL 的;玩 LOL 的,鄙視玩王者榮耀的。
雖說王者榮耀處于游戲鄙視鏈的低端,但是不得不說,它確實有自己獨到的魅力,正因為它降低了玩家的門檻,才有了如今的全民王者的熱潮。你永遠(yuǎn)不知道自己匹配的隊友和對手是老人,還是小孩。或者換種說法,是人,還是動物?
毫無疑問,王者榮耀從全民熱度等諸多表現(xiàn)上看,是非常成功的游戲??芍^男女老少通吃,本文不討論到底是女大學(xué)生坑,還是小學(xué)生坑,這樣高難度的問題。咱玩點簡單的,讓我先看一款王者榮耀神器-王者榮耀盒子。
《王者榮耀盒子》是專門為《王者榮耀》玩家量身打造的一款攻略應(yīng)用,可謂上分必備神器,這里有職業(yè)選手教你英雄出裝、銘文搭配和各種對線團(tuán)戰(zhàn)技巧,同時它也整合最全的游戲資訊以及游戲?qū)崟r動態(tài)。先看看它長什么樣:
APP 下載地址:http://www.eoemarket.com/soft/870210.html
本文內(nèi)容就是爬取《王者榮耀盒子》這款 APP 上的信息,廢話不多說,直接開始實戰(zhàn)!
運行平臺: Windows
Python版本: Python3.x
IDE: Sublime text3
什么是 Fiddler?
Fiddler 是位于客戶端和服務(wù)器端的 HTTP 代理,也是目前最常用的 HTTP 抓包工具之一 。
它能夠記錄客戶端和服務(wù)器之間的所有 HTTP 請求,可以針對特定的 HTTP 請求,分析請求數(shù)據(jù)、設(shè)置斷點、調(diào)試 Web 應(yīng)用、修改請求的數(shù)據(jù),甚至可以修改服務(wù)器返回的數(shù)據(jù),功能非常強(qiáng)大,是 Web 調(diào)試的利器。
既然是代理,也就是說:客戶端的所有請求都要先經(jīng)過 Fiddler,然后轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)器,反之,服務(wù)器端的所有響應(yīng),也都會先經(jīng)過 Fiddler 然后發(fā)送到客戶端。
基于這個原因,F(xiàn)iddler 支持所有可以設(shè)置 HTTP 代理為 127.0.0.1:8888 的瀏覽器和應(yīng)用程序。
使用了 Fiddler 之后,Web 客戶端和服務(wù)器的請求如下所示:
利用可以設(shè)置代理的這個特點,我們就可以對手機(jī) APP 進(jìn)行抓包了。怎么設(shè)置?不急不急,讓我先把 Fiddler 安裝上吧!
Fiddler 下載地址:http://fiddler2.com/
傻瓜式安裝,一鍵到底。Fiddler 軟件界面如圖所示:
手機(jī) APP 抓包設(shè)置
Fiddler 設(shè)置
打開 Fiddler 軟件,打開工具的設(shè)置。(Fiddler 軟件菜單欄:Tools->Options)
在 HTTPS 中設(shè)置如下:
在 Connections 中設(shè)置如下,這里使用默認(rèn) 8888 端口,當(dāng)然也可以自己更改,但是注意不要與已經(jīng)使用的端口沖突:
安全證書下載
在電腦瀏覽器中輸入地址: http://localhost:8888/,點擊 FiddlerRoot certificate,下載安全證書:
安全證書安裝
證書是需要在手機(jī)上進(jìn)行安裝的,這樣在電腦 Fiddler 軟件抓包的時候,手機(jī)使用電腦的網(wǎng)卡上網(wǎng)才不會報錯。
將下載好的 FiddlerRoot.cer 安裝證書拷貝到手機(jī)中,然后進(jìn)行證書安裝。以小米 5 手機(jī)為例:設(shè)置(Settings)->(系統(tǒng)和設(shè)備中的)更多設(shè)置->系統(tǒng)安全->從存儲設(shè)備安裝:
然后找到拷貝的 FiddlerRoot.cer 進(jìn)行安裝即可。安裝好之后,可以在信任的憑證中找到我們已經(jīng)安裝好的安全證書,在用戶中可以看到證書如下:
局域網(wǎng)設(shè)置
想要使用 Fiddler 進(jìn)行手機(jī)抓包,首先要確保手機(jī)和電腦的網(wǎng)絡(luò)在一個內(nèi)網(wǎng)中,可以讓電腦和手機(jī)都連接同一個路由器。
當(dāng)然,也可以讓電腦開放 WiFi 熱點,手機(jī)連入。這里,我使用的方法是,讓手機(jī)和電腦同時連入一個路由器中。***,讓手機(jī)使用電腦的代理 IP 進(jìn)行上網(wǎng)。
首先,查看電腦的 IP 地址,在 cmd 中使用命令 ipconfig 查看電腦 IP 地址。找到無線局域網(wǎng) WLAN 的 IPv4 地址,記下此地址。
在手機(jī)上,點擊連接的 WiFi 進(jìn)行網(wǎng)絡(luò)修改,添加代理。進(jìn)行手動設(shè)置,主機(jī)名即為上圖中找到的 IP 地址,端口號即為 Fiddler 設(shè)置中的端口號 8888:
Fiddler 手機(jī)抓包測試
上述步驟都設(shè)置完成之后,用手機(jī)瀏覽器打開百度首頁,我們就可以順利抓包了,截圖如下:
實戰(zhàn)走起
下載英雄圖片
先來個簡單的例子熱熱身,我想將《英雄聯(lián)盟盒子》中的英雄圖片下載下來,該如何操作?
先使用 Fiddler 抓包看一下,在手機(jī) APP《英雄聯(lián)盟盒子》中的菜單中點擊英雄,電腦 Fiddler 就會抓包如下:
可以看到,GET 請求的 url 地址,和返回的 JSON 格式的信息。那么編寫代碼如下:
- 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'])
從代碼運行結(jié)果中可以看到,百里玄策的英雄 ID 為 104,他的圖片存放地址為 http://pic.wankacn.com/2017-08-04_59844776a6adf.png:
知道了這些信息,我們就可以將這些英雄的圖片進(jìn)行下載了,編寫代碼如下:
- from urllib.request import urlretrieve
- import requests
- import os
- """
- 函數(shù)說明:下載《英雄聯(lián)盟盒子》中的英雄圖片
- Parameters:
- heros_url - GET請求地址,通過Fiddler抓包獲取
- header - header信息
- Returns:
- 無
- 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個英雄' % 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)
運行上述代碼,看下結(jié)果,72 個英雄的圖片,分分鐘搞定:

是不是很簡單?接下來,再玩一個加點難度的。
英雄推薦出裝查詢助手
點擊百里玄策這個英雄,可以看到,里面有他的簡介,包括技能介紹,以及推薦出裝等。那么,我們就了利用這個做一個自己的英雄出裝查詢小助手吧。
手機(jī)點擊百里玄策這個英雄,可以在電腦 Fiddler 看到如下抓包內(nèi)容:
我們看下 GET 請求的 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
很有特點發(fā)現(xiàn)了嗎?在 url 的 heroid 為 104,在上個小實例中,我們發(fā)現(xiàn),這個 104 正好是英雄的 ID,那么是不是可以通過設(shè)置這個 ID 來訪問不同的英雄界面呢?
測試一下答案就出來了,我們將 ID 改為 103,也就是女媧的 heroid,編寫代碼如下:
- 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'])
運行上述代碼,我們可以看到,打印的信息確實是英雄女媧的信息,返回的信息顯示,這個英雄還沒有上線。
推薦出裝保存在 equip_choice 中,可以看到這里沒有給出裝備的名字,只有裝備的 equip_id,那么在寫推薦出裝小程序之前,我們需要獲取所有裝備的 ID。
怎樣獲取武器的信息?抓包方法同上,點擊裝備大全:
通過 Fiddler 抓包信息,編寫代碼如下:
- 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'])
這樣我們就輕松得到了各個裝備的信息:
到這里,我們就可以整合代碼了,首先通過獲取每個英雄的 ID,然后根據(jù)每個英雄的 ID,再獲得英雄的詳細(xì)信息,包括推薦出裝,***通過推薦的裝備 ID,找到裝備的信息并打印出來。
根據(jù)實現(xiàn)效果,自己編寫代碼試一試如何?《王者榮耀》出裝小助手,運行效果如圖所示:
如果功能已經(jīng)實現(xiàn)了,那么先恭喜一聲!
上述功能代碼獲取地址:https://github.com/Jack-Cherish/python-spider/blob/master/hero.py ,歡迎 Follow、Star!
總結(jié)
本文的例子對于入門手機(jī) APP 內(nèi)容的爬取有一定的幫助作用。趁著《王者榮耀盒子》APP 沒有更新,很好爬,趕緊動手實踐吧!
爬取 APP 的內(nèi)容和爬取網(wǎng)頁的思路是一樣的,都是通過抓包進(jìn)行分析。如有問題,請留言。如有錯誤,還望指正,謝謝!
催家華
知名博客博主
現(xiàn)就讀于東北大學(xué)模式識別與智能系統(tǒng)專業(yè)。本科期間,曾擔(dān)任學(xué)生會”科技創(chuàng)新中心主任”一職,負(fù)責(zé)組織各類科技競賽相關(guān)活動。與此同時,熱愛科技競賽,曾于 2015 年獲得第十屆全國大學(xué)生“飛思卡爾”杯智能車競賽全國一等獎。研究生期間,致力于機(jī)器學(xué)習(xí),在知名博客已取得了不錯的關(guān)注度。
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】