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中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
详解python之配置日志的几种方式
May 22 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
pandas实现选取特定索引的行
Apr 20 Python
python处理csv中的空值方法
Jun 22 Python
对web.py设置favicon.ico的方法详解
Dec 04 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
python虚拟环境完美部署教程
Aug 06 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
Nov 15 Python
详解Python requests模块
Jun 21 Python
Python 匹配文本并在其上一行追加文本
May 11 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
php的ZipArchive类用法实例
2014/10/20 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
python把转列表为集合的方法
2019/06/28 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
python 如何设置守护进程
2020/10/29 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
Footshop法国:购买运动鞋
2020/01/19 全球购物
新员工培训个人的自我评价
2013/10/09 职场文书
社区党员先进事迹
2014/01/22 职场文书
八年级数学教学反思
2014/01/31 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
学生安全承诺书
2014/05/22 职场文书
初中物理教学反思
2016/02/19 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL