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

发表于:2017-8-30 11:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:催家华    来源:51Testing软件测试网采编

  实战走起
  下载英雄图片
  先来个简单的例子热热身,我想将《英雄联盟盒子》中的英雄图片下载下来,该如何操作?
  先使用 Fiddler 抓包看一下,在手机 APP《英雄联盟盒子》中的菜单中点击英雄,电脑 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'])
  从代码运行结果中可以看到,百里玄策的英雄 ID 为 104,他的图片存放地址为 http://pic.wankacn.com/2017-08-04_59844776a6adf.png:
  知道了这些信息,我们就可以将这些英雄的图片进行下载了,编写代码如下:
  from urllib.request import urlretrieve
  import requests
  import os
  """
  函数说明:下载《英雄联盟盒子》中的英雄图片
  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)
  运行上述代码,看下结果,72 个英雄的图片,分分钟搞定:
  是不是很简单?接下来,再玩一个加点难度的。
   
  英雄推荐出装查询助手
  点击百里玄策这个英雄,可以看到,里面有他的简介,包括技能介绍,以及推荐出装等。那么,我们就了利用这个做一个自己的英雄出装查询小助手吧。
  手机点击百里玄策这个英雄,可以在电脑 Fiddler 看到如下抓包内容:
  我们看下 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
  很有特点发现了吗?在 url 的 heroid 为 104,在上个小实例中,我们发现,这个 104 正好是英雄的 ID,那么是不是可以通过设置这个 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,然后根据每个英雄的 ID,再获得英雄的详细信息,包括推荐出装,最后通过推荐的装备 ID,找到装备的信息并打印出来。
  根据实现效果,自己编写代码试一试如何?《王者荣耀》出装小助手,运行效果如图所示:
  如果功能已经实现了,那么先恭喜一声!
  上述功能代码获取地址:https://github.com/Jack-Cherish/python-spider/blob/master/hero.py ,欢迎 Follow、Star!
  总结
  本文的例子对于入门手机 APP 内容的爬取有一定的帮助作用。趁着《王者荣耀盒子》APP 没有更新,很好爬,赶紧动手实践吧!
  爬取 APP 的内容和爬取网页的思路是一样的,都是通过抓包进行分析。如有问题,请留言。如有错误,还望指正,谢谢!
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号