我们之前一直都在爬取网页数据,但有些企业并没有提供web网页服务,而是提供了app服务,还有些web网页数据的各种反爬虫措施太牛逼,这时候如果从app端爬取兴许更容易得多,本篇就来介绍app数据如何爬取

作为案例,选用简单的 王者荣耀盒子 的英雄胜率排行榜

方法:

1. 利用抓包工具(例如 Fiddler)得到包含所需数据的 url 以及数据的格式

2. 用代码模拟数据请求

操作步骤:

一、环境搭建

参看教程:https://blog.csdn.net/gld824125233/article/details/52588275

搭建完后设置Fiddler 的 url 过滤,这样就可以只看手机上的数据包,界面清爽不少

过滤操作:Tools-->Options-->HTTPS-->Decrypt-->from remote clients only

二、得到url和数据

1. 打开Fiddle界面,观察左侧栏请求的变化

同时手机打开 王者荣耀盒子,点击屏幕右下角的 辅助 --> 英雄排行,观察Fiddle界面左侧栏请求的变化

2. 找到包含所需数据的请求,一般都是后几个,慢慢试,这里找到的请求如下:

点击该请求,上部分是请求部分,点击 Raw 查看一个标准请求头格式,其中就有 url

下部分是响应部分,一般app的传输数据都是json格式,点击 JSON ,查看数据,发现所需要的数据都包含在一个叫ranking_list 的列表里面

三、编写代码获取数据

既然已经得到了该请求的url和请求方法等信息,那接下来的代码就是小事一桩了

1. 根据分析数据的结构,获取 ranking_list

# 导入请求库
import requests# 所需数据的url
url = 'http://gamehelper.gm825.com/wzry/hero/ranking?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=154BE40FAD86F1906AF64ECFB77B7781&ovr=5.1.1&device=Xiaomi_2014813&net_type=1&client_id=lbEmaFJKlM50o%2BaES6taUw%3D%3D&info_ms=&info_ma=FeiTA88o1ij4mk0KlrbC8spJRoB%2F35t38Dfg9cUZPqk%3D&mno=0&info_la=TZo6%2BEi6%2FED1iWhh5Ix7tQ%3D%3D&info_ci=TZo6%2BEi6%2FED1iWhh5Ix7tQ%3D%3D&mcc=0&clientversion=13.0.4.0&bssid=n67IYIRXbcwQBbrl5CiG5bmhG%2FSMFdSypVKXjBNrULU%3D&os_level=22&os_id=8bd64b36c5b20ff5&resolution=720_1280&dpi=320&client_ip=192.168.1.102&pdunid=3d1a68a37d22'
# 返回的数据是dict格式,用json获取
data= requests.get(url).json()
# 找到包含排名的列表,列表的每个元素都是dict类型
ranking_list = data['ranking_list']

2. 原始数据里用 ‘1~6’ 来表示该英雄的对应类型,可读性很差所以编写转化的代码

# 类型的格式化
def type_format(hero_type):if hero_type[0] == '1':return '战士'if hero_type[0] == '2':return '法师'if hero_type[0] == '3':return '坦克'if hero_type[0] == '4':return '刺客'if hero_type[0] == '5':return '射手'if hero_type[0] == '6':return '辅助'

3. 再格式化一下胜率和出场率

def rate(rate):return '{0}{1}'.format(rate, '%')

4. 然后遍历每个排名,提取格式化后的信息

for i in ranking_list:# 设置胜率排名hero_rank = str(ranking_list.index(i)+1)# 获取英雄的idhero_id = i['hero_id']# 获取英雄的名字hero_name = i['name']# 获取英雄的头像hero_icon = i['icon']# 获取英雄的类型hero_type = i['type']# 格式化类型hero_type = type_format(hero_type)# 获取英雄的胜率hero_winrate = i['winrate']# 格式化胜率hero_winrate = rate(hero_winrate)# 获取英雄的出场率hero_appearance_rate = i['appearance_rate']# 格式化出场率hero_appearance_rate = rate(hero_appearance_rate)

5. 最后写入文件

 # 以追加的方式写入文件with open('rank_list.txt', 'a', encoding='utf-8') as f:f.write('排名:'+hero_rank+'    英雄:'+hero_name+'    ID:'+hero_id+'    头像:'+hero_icon+'    类型:'+hero_type+'    胜率:'+hero_winrate+'    出场率:'+hero_appearance_rate+'\n')

结果展示

全部代码:

# 导入请求库
import requests# 类型的格式化
def type_format(hero_type):if hero_type[0] == '1':return '战士'if hero_type[0] == '2':return '法师'if hero_type[0] == '3':return '坦克'if hero_type[0] == '4':return '刺客'if hero_type[0] == '5':return '射手'if hero_type[0] == '6':return '辅助'def rate(rate):return '{0}{1}'.format(rate, '%')# 所需数据的url
url = 'http://gamehelper.gm825.com/wzry/hero/ranking?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=154BE40FAD86F1906AF64ECFB77B7781&ovr=5.1.1&device=Xiaomi_2014813&net_type=1&client_id=lbEmaFJKlM50o%2BaES6taUw%3D%3D&info_ms=&info_ma=FeiTA88o1ij4mk0KlrbC8spJRoB%2F35t38Dfg9cUZPqk%3D&mno=0&info_la=TZo6%2BEi6%2FED1iWhh5Ix7tQ%3D%3D&info_ci=TZo6%2BEi6%2FED1iWhh5Ix7tQ%3D%3D&mcc=0&clientversion=13.0.4.0&bssid=n67IYIRXbcwQBbrl5CiG5bmhG%2FSMFdSypVKXjBNrULU%3D&os_level=22&os_id=8bd64b36c5b20ff5&resolution=720_1280&dpi=320&client_ip=192.168.1.102&pdunid=3d1a68a37d22'
# 返回的数据是dict格式,用json获取
data= requests.get(url).json()
# 找到包含排名的列表,列表的每个元素都是dict类型
ranking_list = data['ranking_list']
# 遍历每个英雄排名
for i in ranking_list:# 设置胜率排名hero_rank = str(ranking_list.index(i)+1)# 获取英雄的idhero_id = i['hero_id']# 获取英雄的名字hero_name = i['name']# 获取英雄的头像hero_icon = i['icon']# 获取英雄的类型hero_type = i['type']# 格式化类型hero_type = type_format(hero_type)# 获取英雄的胜率hero_winrate = i['winrate']# 格式化胜率hero_winrate = rate(hero_winrate)# 获取英雄的出场率hero_appearance_rate = i['appearance_rate']# 格式化出场率hero_appearance_rate = rate(hero_appearance_rate)# 以追加的方式写入文件with open('rank_list.txt', 'a', encoding='utf-8') as f:f.write('排名:'+hero_rank+'    英雄:'+hero_name+'    ID:'+hero_id+'    头像:'+hero_icon+'    类型:'+hero_type+'    胜率:'+hero_winrate+'    出场率:'+hero_appearance_rate+'\n')

github:https://github.com/JeesonZhang/pythonspider/blob/master/app_crawl

python爬虫基础(12:app数据爬取)相关推荐

  1. python爬虫案例-陶瓷公司数据爬取

    用requests爬取要注意HTTPConnectionPool(host=xxx, port=xxx): Max retries exceeded with url...异常,出现这个异常的解决方法 ...

  2. python爬虫实例——某二手车数据爬取

    某二手车网站数据爬取 要求: 找到所要爬取的网站网址(url): 今天案例的网址(url):https://www.guazi.com/gy/dazhong/o1/#bread. 观察网站,点开检查, ...

  3. Python爬虫|高德地图地铁数据爬取与制图

    目录 一.高德地图数据爬取 1.爬取思路 2.python核心代码 二.Arcmap制图 一.高德地图数据爬取 1.爬取思路 首先,谷歌浏览器打开高德地图官网,点击上方菜单栏地铁进入地铁线路网站如下, ...

  4. Python爬虫 —— 以北京天气数据爬取为例

    本文以北京天气为例讲解数据爬取的整个流程,不涉及网络爬虫的原理,直接讲爬取代码怎么写! 1.首先找到你要爬取的网站url:'http://www.tianqihoubao.com/lishi/beij ...

  5. 实践▍Python爬虫基础:验证码的爬取和识别详解

    每天学一点Python 作者:HDMI,信息管理与信息系统  博客地址:zhihu.com/people/hdmi-blog 今天要给大家介绍的是验证码的爬取和识别,不过只涉及到最简单的图形验证码,也 ...

  6. Python爬虫应用实战-网站数据爬取及数据分析

    实战一:中国大学排名 前言 由于上一篇文章中教会了大家如何存储数据,但是由于篇幅过大,就没有加入实战篇.想必大家也等着急了吧,所以今天就为大家带来两篇实战内容,希望可以帮助到各位更好的认识到爬虫与My ...

  7. Python爬虫基础:验证码的爬取和识别详解

    今天要给大家介绍的是验证码的爬取和识别,不过只涉及到最简单的图形验证码,也是现在比较常见的一种类型. 运行平台:Windows Python版本:Python3.6 IDE: Sublime Text ...

  8. Python爬虫之淘宝数据爬取(商品名称,价格,图片,销量)

    代码详细注释,仅供交流与参考,不作商业用途 代码参考北京理工大学嵩天老师 import requests #导入第三方库 import re import osdef getHTMLText(url) ...

  9. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  10. python爬虫实战(一)--爬取知乎话题图片

    原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...

最新文章

  1. [CLR via C#]17. 委托
  2. 容器 vector :为何要有reserve
  3. oracle中ci是什么意思,enq: CI - contention(附AWR)
  4. 细说反射,Java 和 Android 开发者必须跨越的坎
  5. 1.2 torch_数据预处理
  6. 面试题鬼的很:Class.forName 和 ClassLoader 有什么区别?
  7. DOM4J介绍与代码示例【转载】
  8. 刘强东卸任京东集团CEO!接任人是他...
  9. UI设计实用干货素材|引导页模板
  10. 方格图片轮换JS特效
  11. 设计模式 (十一) 外观模式
  12. 影视APP直播盒子源码 第三方接口无需采集
  13. 型材行业ERP-MES应用点滴
  14. excel冻结窗口_东莞黄江办公自动化培训零基础电脑Excel培训中心
  15. 点阵发光管怎么用C语言编程,LED点阵经验各种点阵驱动方法讲解
  16. MiniGUI学习日记一----MiniGUI基础编程篇
  17. 智慧消防物联网落地案例(云南、福建、陕西) java 物联网智慧消防
  18. win10系统找不到telnet服务器,大神解答win10系统找不到Telnet服务的办法
  19. 码元,码元速率,波特率,比特率,数据率的理解
  20. poj-3258 River Hopscotch (二分)

热门文章

  1. 完成端口 完成端口 完成端口 还是完成端口
  2. Flink(五):watermark简介
  3. 靠部落格打响品牌 一个人赚全世界的钱
  4. html弹出div弹窗
  5. 海子的诗-以梦为马(祖国)
  6. java中四大层次结构
  7. mmap和mmap64
  8. python 按键精灵脚本_按键精灵的脚本 - 对于重复动作(含键盘鼠标)太好用了
  9. Shiro中principal和credential的区别
  10. Qt编程(一) Qt框架简介