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实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Python3获取拉勾网招聘信息的方法实例
Apr 03 Python
Django给admin添加Action的步骤详解
May 01 Python
Python基于scipy实现信号滤波功能
May 08 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
python画条形图的具体代码
Apr 20 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
pw的一个放后门的方法分析
2007/10/08 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
python 调用HBase的简单实例
2016/12/18 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
python pillow模块使用方法详解
2019/08/30 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
C#的几个面试问题
2016/05/22 面试题
人事助理岗位职责
2013/11/18 职场文书
普通院校学生的自荐信
2013/11/27 职场文书
军训学生自我鉴定
2014/02/12 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
总经理岗位职责
2015/02/04 职场文书
会计求职简历自我评价
2015/03/10 职场文书
刑事法律意见书
2015/06/04 职场文书
初婚未育证明样本
2015/06/18 职场文书