之前写了一个自动签到的脚本,我姐本来让我给她写一个手机app自动签到的脚本的,后来发现自己不会爬手机app,现在抽时间找了教程,看完教程后来爬一下手机app试一试。在爬手机app时先要安装的的软件是Fiddler :
- 下载地址: https://pan.baidu.com/s/1dQx4-ADztgKTCK__uG7xUw 密码: r8kg
- 安装好Fiddler后打开.exe文件,开始配置,首先点击"tools" -> "Teletik Fiddler Options",按照下面图进行配置
- 打开浏览器,输入"http://localhost:8888/",点击最下方,下载证书
- 将下载的证书传到手机上,并进行安装
我的手机是华为nova2,安装的时候是从文件夹搜索并安装的,我也不知道为什么不能在系统安全那直接安装。
安装好证书后,修改手机WLAN的配置 ,并且手机与电脑需要保证在同一局域网中。需要修改的是 : 将所连WiFi的代理改为手动,服务器主机名一项填写自己电脑的IP地址,服务器端口一项填写8888(因为Fiddler一般默认端口是8888),然后保存。就可以开始抓包了。打开一个手机app,这里选的是王者荣耀盒子,会看到Fiddler中出现很多信息,只需挑选有用的即可 :
左边选中的链接是显示英雄页面,右下方可以对比手机页面,可以看是否将所有的英雄显示。接下来将英雄信息爬取下来 :
import requests
def main():
headers = {
# 将Fiddler右上方的内容填在headers中
"Accept-Charset": "UTF-8",
"Accept-Encoding": "gzip,deflate",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; HUAWEI CAZ-TL10 Build/HUAWEICAZ-TL10)",
"X-Requested-With": "XMLHttpRequest",
"Content-type": "application/x-www-form-urlencoded",
"Connection": "Keep-Alive",
"Host": "gamehelper.gm825.com"
}
# 右上方有个get请求,将get后的网址赋给heros_url
heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=&info_ms=&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"
# 英雄的列表显示在json格式下
res = requests.get(url=heros_url, headers=headers).json()
# 打印列表
print(res['list'])
# 计算有多少个英雄
print(len(res['list']))
if __name__ == "__main__":
main()
上述代码可以将英雄爬下来,下面是运行结果 (上面还有好多):
可以观察到,每个英雄的图片也各自的字典的"cover"下,接下来将图片下载到电脑 :
import requests
import os
from urllib.request import urlretrieve
# 右上方有个get请求,将get后的网址赋给heros_url
heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=&info_ms=&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"
def imgs_download(heros_url, headers):
res = requests.get(url=heros_url, headers=headers).json()
hero_path = "heros_img"
for hero in res['list']:
img_url = hero['cover']
hero_name = hero['name'] + ".png"
filename = hero_path + "/" + hero_name
if hero_path not in os.listdir():
os.makedirs(hero_path)
urlretrieve(url=img_url, filename=filename)
def main():
headers = {
# 将Fiddler右上方的内容填在headers中
"Accept-Charset": "UTF-8",
"Accept-Encoding": "gzip,deflate",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; HUAWEI CAZ-TL10 Build/HUAWEICAZ-TL10)",
"X-Requested-With": "XMLHttpRequest",
"Content-type": "application/x-www-form-urlencoded",
"Connection": "Keep-Alive",
"Host": "gamehelper.gm825.com"
}
# 英雄的列表显示在json格式下
# res = requests.get(url=heros_url, headers=headers).json()
# 打印列表
# print(res['list'])
# 计算有多少个英雄
# print(len(res['list']))
imgs_download(heros_url, headers)
if __name__ == "__main__":
main()
上述是下载图片的源码,下载有点慢,部分结果如下图 (是按照拼音首字母排序,本来最新的一个是司马懿的):
接下来就是打印每个英雄的历史背景与使用技巧,个人觉得英雄出装和铭文这种东西得靠自己摸索(说实话是我懒得我爬他的铭文和推荐出装了)
import requests
# import os
# from urllib.request import urlretrieve
# 右上方有个get请求,将get后的网址赋给heros_url
heros_url = "http://gamehelper.gm825.com/wzry/hero/list?channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=&info_ms=&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"
def hero_info(heros_url, headers):
res = requests.get(url=heros_url, headers=headers).json()
for hero in res['list']:
id = hero['hero_id']
info_url = "http://gamehelper.gm825.com/wzry/hero/detail?hero_id=" + id + "&channel_id=90001a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.1.0&version_code=13010&cuid=F6DFAFC3BED1C29825EC8D404110F5C5&ovr=7.0&device=HUAWEI_HUAWEI+CAZ-TL10&net_type=1&client_id=UTAH2jTRdl%2FfxnOjEiOS4A%3D%3D&info_ms=%2BpdbZccbIPeH%2BTpoBwY0gw%3D%3D&info_ma=hoeVma%2BgYmXjgZG7TVJzaoLyRRILGMIaVltuIflvZFE%3D&mno=0&info_la=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&info_ci=mh%2FAbS1DsM0kM7IDlFIbYQ%3D%3D&mcc=0&clientversion=13.0.1.0&bssid=zRqQJG5mLlFy6mYG4YA%2BE0UcqUCBAXmZcXNHROzwWy8%3D&os_level=24&os_id=c0be30adbd11c768&resolution=1080_1788&dpi=480&client_ip=192.168.2.114&pdunid=WWUDU16A29002522"
res = requests.get(url=info_url, headers=headers).json()
print(hero['name'] + " : ")
print("历史上的他/她 : " + res['info']['history_intro'])
print("背景故事 : " + res['info']['background_story'])
print("对抗技巧 : " + res['info']['hero_tips'])
print("团战思想 : " + res['info']['melee_tips'] + "\n")
def main():
headers = {
# 将Fiddler右上方的内容填在headers中
"Accept-Charset": "UTF-8",
"Accept-Encoding": "gzip,deflate",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; HUAWEI CAZ-TL10 Build/HUAWEICAZ-TL10)",
"X-Requested-With": "XMLHttpRequest",
"Content-type": "application/x-www-form-urlencoded",
"Connection": "Keep-Alive",
"Host": "gamehelper.gm825.com"
}
hero_info(heros_url, headers)
if __name__ == "__main__":
main()
上述代码将app中描述英雄的背景与实战技巧打印出来,具体结果实例如下 :
以上就是爬取手机app信息的内容,自己也还是处于入门阶段,所以只有先试水一下这种简单一点。