Python3爬虫使用Fidder实现APP爬取示例


Posted in Python onNovember 27, 2018

之前爬取都是网页上的数据,今天要来说一下怎么借助Fidder来爬取手机APP上的数据。

一、环境配置

1、Fidder的安装和配置

没有安装Fidder软件的可以进入 这个网址 下载,然后就是傻瓜式的安装,安装步骤很简单。在安装完成后,打开软件,进行如下设置:

Python3爬虫使用Fidder实现APP爬取示例

Python3爬虫使用Fidder实现APP爬取示例

这里使用默认的8888端口就好了,如果要修改的话,要避免和其他端口冲突。

2、手机的配置

首先打开cmd,输入ipconfig查看IP地址,记录下这个IP地址:

Python3爬虫使用Fidder实现APP爬取示例

想要使用FIdder进行手机抓包,要让手机和PC处在同一个内网中,方法就是连接同一个无线网络。然后打开手机,进入Wi-FI设置修改代理为手动代理,再把上面的IP地址和8888端口号输入进去:

Python3爬虫使用Fidder实现APP爬取示例

然后打开浏览器,输入http://127.0.0.1:8888,会看到如下界面,点击FidderRoot certificate下载证书:

Python3爬虫使用Fidder实现APP爬取示例

下载好之后如果出现无法安装的情况,可以进入设置进行手动安装证书,我的安装步骤是“设置->系统安全->从SD卡安装”,不同的手机安装步骤不同,不过也差不多吧。

3、抓包测试

在完成上面的步骤之后,我们先进行一下抓包测试,打开手机的浏览器,然后打开百度的网页,可以看到出现了对应的包,这样就可以进行之后的抓取了。

Python3爬虫使用Fidder实现APP爬取示例

二、抓取步骤

这次使用的APP是王者荣耀盒子,打开APP,点击英雄,可以看到第一个英雄-上官婉儿,然后点进去。

Python3爬虫使用Fidder实现APP爬取示例

然后在Fidder中可以找到如下这个包:

Python3爬虫使用Fidder实现APP爬取示例

然后在右侧可以看到如下信息:

Python3爬虫使用Fidder实现APP爬取示例

把这些信息复制一下,然后解码一下就可以看到如下数据了,包括英雄名字、英雄图片、英雄技能等信息:

Python3爬虫使用Fidder实现APP爬取示例

但是在推荐装备的信息里,只有装备的id值,却没有装备的名字,那我们要怎么获得这些装备的名字呢?还是同样的办法,点击查看所有装备,然后抓包,找到对应的包,再进行爬取。在获得所有的装备和对应的id后,可以再爬取所有的英雄名称,然后就可以制作我们自己的英雄攻略了==

运行结果如下:

Python3爬虫使用Fidder实现APP爬取示例

三、完整代码

"""
 Version: Python3.5
 Author: OniOn
 Time: 2018/11/26 21:20
 """
 import requests
 
 # 装备信息
 EQUIP_LIST = []
 # 英雄信息
 HERO_LIST = []
 
 
 # 爬取英雄信息
 def get_hero(hero_id):
  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=13.0.4.0&version_code=13040&cuid=192384A3D29A295307CA7B96762D3911&ovr=6.0.1&device=Xiaomi_Redmi+4X&net_type=1&client_id=&info_ms=&info_ma=Z6OSFnQs6mXn4axI72A6yENV6NHXHBW%2FwZ6YjXKCGko%3D&mno=0&info_la=zdisjKfT0Zj1UXN2un%2BlyA%3D%3D&info_ci=zdisjKfT0Zj1UXN2un%2BlyA%3D%3D&mcc=0&clientversion=13.0.4.0&bssid=bFL4zw1N%2FGL43totbQy7Q9D8UfrPgiMUFRNSpM25pnY%3D&os_level=23&os_id=a2aa922677827ab1&resolution=720_1280&dpi=320&client_ip=10.12.88.95&pdunid=257ed0277cf4".format(
   hero_id)
  res = requests.post(url)
  js = res.json()
  img_url = js['info']['big_img']
  skill_tips = js['info']['skill_tips'] # 使用技巧
  skill_list = [] # 技能介绍
  for i in js['info']['skill_list']:
   desc = i['description'] if '<br>' not in i['description'] else i['description'].replace('<br>', '')
   skill_list.append({
    "name": i['name'] + "({})".format(i['intro']),
    "type": i['tags'],
    "desc": desc
   })
  print("英雄图片链接:{}".format(img_url))
  print("英雄使用技巧:{}".format(skill_tips))
  for i in skill_list:
   print('{} 类型:{} \n技能介绍:{}'.format(i['name'], i['type'], i['desc']))
  print("推荐装备:", end="")
  equip_choice = [] # 推荐装备
  all_money = 
  for i in js['info']['equip_choice'][]['list']:
   equip_choice.append(EQUIP_LIST[int(i['equip_id'])]['name'])
   all_money += int(EQUIP_LIST[int(i['equip_id'])]['price'])
  print(' '.join(equip_choice), " (装备总金额:{})".format(all_money))
 
 
 # 爬取所有装备的基本信息
 def get_all_equip():
  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=13.0.4.0&version_code=13040&cuid=192384A3D29A295307CA7B96762D3911&ovr=6.0.1&device=Xiaomi_Redmi+4X&net_type=1&client_id=&info_ms=&info_ma=Z6OSFnQs6mXn4axI72A6yENV6NHXHBW%2FwZ6YjXKCGko%3D&mno=0&info_la=zdisjKfT0Zj1UXN2un%2BlyA%3D%3D&info_ci=zdisjKfT0Zj1UXN2un%2BlyA%3D%3D&mcc=0&clientversion=13.0.4.0&bssid=bFL4zw1N%2FGL43totbQy7Q9D8UfrPgiMUFRNSpM25pnY%3D&os_level=23&os_id=a2aa922677827ab1&resolution=720_1280&dpi=320&client_ip=10.12.88.95&pdunid=257ed0277cf4"
  res = requests.get(url)
  for i in res.json()['list']:
   EQUIP_LIST.append({
    'price': i['price'],
    'name': i['name'],
    # 'equip_id': i['equip_id']
   })
 
 
 # 爬取所有英雄的基本信息
 def get_all_hero():
  # 英雄定位: type 1-战士 2-法师 3-坦克 4-刺客 5-射手 6-辅助
  type_list = ['战士', '法师', '坦克', '刺客', '射手', '辅助']
  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=13.0.4.0&version_code=13040&cuid=192384A3D29A295307CA7B96762D3911&ovr=6.0.1&device=Xiaomi_Redmi+4X&net_type=1&client_id=&info_ms=&info_ma=Z6OSFnQs6mXn4axI72A6yENV6NHXHBW%2FwZ6YjXKCGko%3D&mno=0&info_la=zdisjKfT0Zj1UXN2un%2BlyA%3D%3D&info_ci=zdisjKfT0Zj1UXN2un%2BlyA%3D%3D&mcc=0&clientversion=13.0.4.0&bssid=bFL4zw1N%2FGL43totbQy7Q9D8UfrPgiMUFRNSpM25pnY%3D&os_level=23&os_id=a2aa922677827ab1&resolution=720_1280&dpi=320&client_ip=10.12.88.95&pdunid=257ed0277cf4"
  res = requests.get(url)
  for i in res.json()['list']:
   HERO_LIST.append({
    "name": i['name'],
    "id": i['hero_id'],
    'type': '/'.join([type_list[int(j) - ] for j in i['type']])
   })
 
 
 if __name__ == '__main__':
  get_all_hero()
  length = len(HERO_LIST)
  print("-" * 50)
  for i in range(0, length // 5 * 5, 5):
   print('{}(id:{}) '.format(HERO_LIST[i]['name'], HERO_LIST[i]['id']), end=' ')
   print('{}(id:{}) '.format(HERO_LIST[i + 1]['name'], HERO_LIST[i + 1]['id']), end=' ')
   print('{}(id:{}) '.format(HERO_LIST[i + 2]['name'], HERO_LIST[i + 2]['id']), end=' ')
   print('{}(id:{}) '.format(HERO_LIST[i + 3]['name'], HERO_LIST[i + 3]['id']), end=' ')
   print('{}(id:{}) '.format(HERO_LIST[i + 4]['name'], HERO_LIST[i + 4]['id']))
  for i in range(length // 5 * 5, length):
   print('{}(id:{}) '.format(HERO_LIST[i]['name'], HERO_LIST[i]['id']), end=' ')
  print('\n', "-" * 50)
  get_all_equip()
  get_hero(input("\n请输入您想查看的英雄id:"))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python读写配置文件的方法
Jun 03 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
CentOS7安装Python3的教程详解
Apr 10 Python
Python整数对象实现原理详解
Jul 01 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
通过python实现弹窗广告拦截过程详解
Jul 10 Python
Python Gitlab Api 使用方法
Aug 28 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
python如何查看微信消息撤回
Nov 27 #Python
python中退出多层循环的方法
Nov 27 #Python
为什么Python中没有&quot;a++&quot;这种写法
Nov 27 #Python
django session完成状态保持的方法
Nov 27 #Python
Python3实现腾讯云OCR识别
Nov 27 #Python
python利用百度AI实现文字识别功能
Nov 27 #Python
python如何实现一个刷网页小程序
Nov 27 #Python
You might like
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
python实现图书借阅系统
2019/02/20 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python中logging日志库实例详解
2020/02/19 Python
python实现拼接图片
2020/03/23 Python
Python socket服务常用操作代码实例
2020/06/22 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
python计算auc的方法
2020/09/09 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
初三学习计划书范文
2014/04/30 职场文书
pandas中pd.groupby()的用法详解
2022/06/16 Python