中国领先的IT技术网站
|
|

我用Python爬了《王者荣耀盒子》,发现王者荣耀最强套路!

程序员的鄙视链,您听说过吗?话说:老婆漂亮的程序员,鄙视老婆不漂亮的程序员;有老婆的程序员,鄙视没有老婆的程序员;没有老婆有女朋友的程序员,鄙视单身狗。

作者:催家华来源:51CTO技术栈|2017-08-30 12:17

【沙龙】51CTO诚邀您9月23号和多位技术大咖一起聊智能CDN的优化之路,抓紧时间哦!


【51CTO.com原创稿件】程序员的鄙视链,您听说过吗?话说:老婆漂亮的程序员,鄙视老婆不漂亮的程序员;有老婆的程序员,鄙视没有老婆的程序员;没有老婆有女朋友的程序员,鄙视单身狗。

在单身狗之间,才有语言、编辑器和操作系统的互相鄙视。不知为何,看到这句话的时候,我的内心阵阵绞痛。

现在看看,这游戏也是如此。玩星际的,鄙视玩 Dota 的;玩 Dota 的,鄙视玩 LOL 的;玩 LOL 的,鄙视玩王者荣耀的。

虽说王者荣耀处于游戏鄙视链的低端,但是不得不说,它确实有自己独到的魅力,正因为它降低了玩家的门槛,才有了如今的全民王者的热潮。你永远不知道自己匹配的队友和对手是老人,还是小孩。或者换种说法,是人,还是动物?

毫无疑问,王者荣耀从全民热度等诸多表现上看,是非常成功的游戏。可谓男女老少通吃,本文不讨论到底是女大学生坑,还是小学生坑,这样高难度的问题。咱玩点简单的,让我先看一款王者荣耀神器-王者荣耀盒子。

《王者荣耀盒子》是专门为《王者荣耀》玩家量身打造的一款攻略应用,可谓上分必备神器,这里有职业选手教你英雄出装、铭文搭配和各种对线团战技巧,同时它也整合最全的游戏资讯以及游戏实时动态。先看看它长什么样:

APP 下载地址:http://www.eoemarket.com/soft/870210.html

本文内容就是爬取《王者荣耀盒子》这款 APP 上的信息,废话不多说,直接开始实战!

运行平台: Windows

Python版本: Python3.x

IDE: Sublime text3

什么是 Fiddler?

Fiddler 是位于客户端和服务器端的 HTTP 代理,也是目前最常用的 HTTP 抓包工具之一 。

它能够记录客户端和服务器之间的所有 HTTP 请求,可以针对特定的 HTTP 请求,分析请求数据、设置断点、调试 Web 应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 Web 调试的利器。

既然是代理,也就是说:客户端的所有请求都要先经过 Fiddler,然后转发到相应的服务器,反之,服务器端的所有响应,也都会先经过 Fiddler 然后发送到客户端。

基于这个原因,Fiddler 支持所有可以设置 HTTP 代理为 127.0.0.1:8888 的浏览器和应用程序。

使用了 Fiddler 之后,Web 客户端和服务器的请求如下所示:

利用可以设置代理的这个特点,我们就可以对手机 APP 进行抓包了。怎么设置?不急不急,让我先把 Fiddler 安装上吧!

Fiddler 下载地址:http://fiddler2.com/

傻瓜式安装,一键到底。Fiddler 软件界面如图所示:

手机 APP 抓包设置

Fiddler 设置

打开 Fiddler 软件,打开工具的设置。(Fiddler 软件菜单栏:Tools->Options)

在 HTTPS 中设置如下:

在 Connections 中设置如下,这里使用默认 8888 端口,当然也可以自己更改,但是注意不要与已经使用的端口冲突:

安全证书下载

在电脑浏览器中输入地址: http://localhost:8888/,点击 FiddlerRoot certificate,下载安全证书:

安全证书安装

证书是需要在手机上进行安装的,这样在电脑 Fiddler 软件抓包的时候,手机使用电脑的网卡上网才不会报错。

将下载好的 FiddlerRoot.cer 安装证书拷贝到手机中,然后进行证书安装。以小米 5 手机为例:设置(Settings)->(系统和设备中的)更多设置->系统安全->从存储设备安装:

然后找到拷贝的 FiddlerRoot.cer 进行安装即可。安装好之后,可以在信任的凭证中找到我们已经安装好的安全证书,在用户中可以看到证书如下:

局域网设置

想要使用 Fiddler 进行手机抓包,首先要确保手机和电脑的网络在一个内网中,可以让电脑和手机都连接同一个路由器。

当然,也可以让电脑开放 WiFi 热点,手机连入。这里,我使用的方法是,让手机和电脑同时连入一个路由器中。最后,让手机使用电脑的代理 IP 进行上网。

首先,查看电脑的 IP 地址,在 cmd 中使用命令 ipconfig 查看电脑 IP 地址。找到无线局域网 WLAN 的 IPv4 地址,记下此地址。

在手机上,点击连接的 WiFi 进行网络修改,添加代理。进行手动设置,主机名即为上图中找到的 IP 地址,端口号即为 Fiddler 设置中的端口号 8888:

Fiddler 手机抓包测试

上述步骤都设置完成之后,用手机浏览器打开百度首页,我们就可以顺利抓包了,截图如下:

实战走起

下载英雄图片

先来个简单的例子热热身,我想将《英雄联盟盒子》中的英雄图片下载下来,该如何操作?

先使用 Fiddler 抓包看一下,在手机 APP《英雄联盟盒子》中的菜单中点击英雄,电脑 Fiddler 就会抓包如下:

可以看到,GET 请求的 url 地址,和返回的 JSON 格式的信息。那么编写代码如下:

  1. import requests 
  2. if __name__ == '__main__':    
  3.     headers = {'Accept-Charset''UTF-8'
  4.             'Accept-Encoding''gzip,deflate'
  5.             'User-Agent''Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)'
  6.             'X-Requested-With''XMLHttpRequest'
  7.             'Content-type''application/x-www-form-urlencoded'
  8.             'Connection''Keep-Alive'
  9.             'Host''gamehelper.gm825.com'
  10.     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" 
  11.     req = requests.get(url = heros_url, headers = headers).json() 
  12.     print(req['list']) 

从代码运行结果中可以看到,百里玄策的英雄 ID 为 104,他的图片存放地址为 http://pic.wankacn.com/2017-08-04_59844776a6adf.png

知道了这些信息,我们就可以将这些英雄的图片进行下载了,编写代码如下:

  1. from urllib.request import urlretrieve 
  2. import requests 
  3. import os 
  4. ""
  5. 函数说明:下载《英雄联盟盒子》中的英雄图片 
  6. Parameters: 
  7.     heros_url - GET请求地址,通过Fiddler抓包获取 
  8.     header - header信息 
  9. Returns
  10.     无 
  11. Author: 
  12.     Jack Cui 
  13. Blog: 
  14.     http://blog.csdn.net/c406495762 
  15. Modify
  16.     2017-08-07 
  17. ""
  18. def hero_imgs_download(heros_url,header): 
  19.     req = requests.get(url = heros_url, headers = header).json() 
  20.     hero_num = len(req['list']) 
  21.     print('一共有%d个英雄' % hero_num) 
  22.     hero_images_path = 'hero_images' 
  23.     for each_hero in req['list']: 
  24.         hero_photo_url = each_hero['cover'
  25.         hero_name = each_hero['name'] + '.jpg' 
  26.         filename = hero_images_path + '/' + hero_name 
  27.         if hero_images_path not in os.listdir(): 
  28.             os.makedirs(hero_images_path) 
  29.         urlretrieve(url = hero_photo_url, filename = filename) 
  30. if __name__ == '__main__':    
  31.     headers = {'Accept-Charset''UTF-8'
  32.             'Accept-Encoding''gzip,deflate'
  33.             'User-Agent''Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)'
  34.             'X-Requested-With''XMLHttpRequest'
  35.             'Content-type''application/x-www-form-urlencoded'
  36.             'Connection''Keep-Alive'
  37.             'Host''gamehelper.gm825.com'
  38.     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" 
  39.     hero_imgs_download(heros_url,headers) 

运行上述代码,看下结果,72 个英雄的图片,分分钟搞定:


是不是很简单?接下来,再玩一个加点难度的。

英雄推荐出装查询助手

点击百里玄策这个英雄,可以看到,里面有他的简介,包括技能介绍,以及推荐出装等。那么,我们就了利用这个做一个自己的英雄出装查询小助手吧。

 

手机点击百里玄策这个英雄,可以在电脑 Fiddler 看到如下抓包内容:

我们看下 GET 请求的 URL:

  1. 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 

很有特点发现了吗?在 url 的 heroid 为 104,在上个小实例中,我们发现,这个 104 正好是英雄的 ID,那么是不是可以通过设置这个 ID 来访问不同的英雄界面呢?

测试一下答案就出来了,我们将 ID 改为 103,也就是女娲的 heroid,编写代码如下:

  1. import requests 
  2. if __name__ == '__main__':    
  3.     headers = {'Accept-Charset''UTF-8'
  4.             'Accept-Encoding''gzip,deflate'
  5.             'User-Agent''Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)'
  6.             'X-Requested-With''XMLHttpRequest'
  7.             'Content-type''application/x-www-form-urlencoded'
  8.             'Connection''Keep-Alive'
  9.             'Host''gamehelper.gm825.com'
  10.     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'
  11.     req = requests.get(url = hero_url, headers = headers).json() 
  12.     print(req['info']) 

运行上述代码,我们可以看到,打印的信息确实是英雄女娲的信息,返回的信息显示,这个英雄还没有上线。

推荐出装保存在 equip_choice 中,可以看到这里没有给出装备的名字,只有装备的 equip_id,那么在写推荐出装小程序之前,我们需要获取所有装备的 ID。

怎样获取武器的信息?抓包方法同上,点击装备大全:

通过 Fiddler 抓包信息,编写代码如下:

  1. import requests 
  2. if __name__ == '__main__':    
  3.     headers = {'Accept-Charset''UTF-8'
  4.             'Accept-Encoding''gzip,deflate'
  5.             'User-Agent''Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 5 MIUI/V8.1.6.0.MAACNDI)'
  6.             'X-Requested-With''XMLHttpRequest'
  7.             'Content-type''application/x-www-form-urlencoded'
  8.             'Connection''Keep-Alive'
  9.             'Host''gamehelper.gm825.com'
  10.     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" 
  11.     req = requests.get(url = weapon_url, headers = headers).json() 
  12.     print(req['list']) 

这样我们就轻松得到了各个装备的信息:

到这里,我们就可以整合代码了,首先通过获取每个英雄的 ID,然后根据每个英雄的 ID,再获得英雄的详细信息,包括推荐出装,最后通过推荐的装备 ID,找到装备的信息并打印出来。

根据实现效果,自己编写代码试一试如何?《王者荣耀》出装小助手,运行效果如图所示:

如果功能已经实现了,那么先恭喜一声!

上述功能代码获取地址:https://github.com/Jack-Cherish/python-spider/blob/master/hero.py ,欢迎 Follow、Star!

总结

本文的例子对于入门手机 APP 内容的爬取有一定的帮助作用。趁着《王者荣耀盒子》APP 没有更新,很好爬,赶紧动手实践吧!

爬取 APP 的内容和爬取网页的思路是一样的,都是通过抓包进行分析。如有问题,请留言。如有错误,还望指正,谢谢!

催家华

知名博客博主

现就读于东北大学模式识别与智能系统专业。本科期间,曾担任学生会”科技创新中心主任”一职,负责组织各类科技竞赛相关活动。与此同时,热爱科技竞赛,曾于 2015 年获得第十届全国大学生“飞思卡尔”杯智能车竞赛全国一等奖。研究生期间,致力于机器学习,在知名博客已取得了不错的关注度。

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

【编辑推荐】

  1. Python爬虫实战:股票数据定向爬虫
  2. 关于高效使用Python字典的清单
  3. Python开发者面向文档编程的正确姿势
  4. 用Python画一个中国地图
  5. 学习用Python编程时要避免的3个错误
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

C语言核心技术

在这本书中,C 语言专家 Peter Prinz和Tony Crawford为你提供大量的编程参考信息。全书叙述清晰,语句简洁,分析深刻。本书主题包括: ...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× 学习达标赢Beats耳机