admin管理员组文章数量:1619291
在我写这篇文章前,兴奋地在知乎站内搜了一下关键词“python 英雄联盟”,又兴奋地发现,我似乎是第一个把python用在A(买关子)方面的人!!!我知道我的机会来了!!
英雄联盟:什么?!你python和我有什么关系?!
嘿嘿,不卖关子了,python就是和你英雄联盟有关系!
前情提要:
这篇文章涉及python爬虫,python数据分析,如果你对此感兴趣,那么
老规矩,开头概括整篇文章。这篇文章关于英雄联盟玩家数据(掌上wegame app)的爬取及数据分析,和遇到的坑(有代码呦 )。
先磨刀(搭环境):
涉及python模块:requests,json(没想到吧!)
相关工具:夜神模拟器(任何一款安卓模拟器都行),fiddler。
假设H:你已具备相关爬虫知识(最简单的),会简单使用抓包工具。(你当然可以拒绝这个假设!)
目的:(灵感来源)分析自己的对战数据,以此来证明自己菜否。
好吧,既然要分析数据,那得要数据啊。于是我赶紧去英雄联盟官网寻找自己得对战数据(web) 然后,
完全找不到。
然后我去pc端wegame找数据,数据虽然有,可发现无处下手。(抓包抓不到)
最后,我去移动端找数据,数据虽然有,可无从下手+1。(无法抓包,模拟器中app闪退)。
啊!天亡我也!这篇文章到此结束。
。
。
。
怎么可能?!虽然发现事情并不简单,可我难道就这样子放弃吗?
办法总是有得呀!虽然模拟器app闪退,我可以用真机呀,我可以换app呀!
于是我换了个掌上英雄联盟,进行真机抓取。
然后发现我需要作的工作是这样的:
是这样的:
这种方法是使用appium(appium在windows下安装是个深坑)进行真机抓取,需要定位每一个含有有价值信息的节点,以及数据的过滤,关键是要写自动脚本,要是数据量小还可以接受,可数据量一大起来(我的破手机)
办法总是有的,办法总是留给愿意去付出努力的靓仔的!
偶然间看到一位大佬的文章,提出了解决app在模拟器上闪退的问题,然后嘿嘿,那么我的机会来了!
(概述一下,就是使用xposed+justtrustme框架)
好!开始抓包!
(抓的时自己账号的对战数据)为保护玩家隐私,id已被我马赛克。
好,请求的数据已经很清楚地摆在我们面前,什么没看清?
那么这个呢?
我无条件承认学好英语是一件收益匪浅地事情。
api? battle?detail?
这不就是%#%$%$掐架,细节吗?(修正中.......)
这不就是对战数据的接口吗?
好,那么来看看这个请求返回的数据
破肥特!!返回json数据,英文好在都看的懂。
那么继续来看看这个请求的headers。
很容易看出,post请求,并且带了条json数据。经过我周密分析,每一场对战的battle_id都是不同的,具体这battle_id是如何生成的,我们来继续分析。
然后
无解了。我不知道,我不会,我头疼。
难道要翻在这阴沟里了?
这么靓仔的我怎么可能翻船呢?
我错过了一个细节,当你在该页面往下滑你会发现
api?battle?list?
这不就是%¥%&掐架,串串吗?(修正中.......)
这不就是对战列表接口吗?
来看看这个接口返回的数据
bettle_id在这!破肥特!
进一步分析你会发现一个很重要的参数。
offset?
消除?偏移?(修正中.....)
这不就是偏移量吗?
经过我仔细观察发现,每次偏移量为10,返回10场对战数据(10个battle_id)。
好,既然不知道这个id如何生成,那么我就给他抓下来!
(经过实践,发现最多能抓到350条id,超过350条返回的都是空数据,也许服务器就只存储玩家近来350场对战数据,不管了,无所谓)
激动人心的代码来了:
import requests
import logging
import time
logging.captureWarnings(True)
url='https://m.wegame/api/mobile/lua/proxy/index/mwg_lol_proxy/get_battle_list'
headers={
'Accept':'application/json',
'Cookie':'***********', #cookie当然要换啦,这里太长,我就不写了
'Content-Tyep':'application/json; charset=utf-8',
'Content-Length':'113',
'Host':'m.wegame',
'Connection':'Keep-Alive',
'Accept-Encoding':'gzip',
'User-Agent':'okhttp/3.11.0'
}
for offset in range(0,350,10): #offset偏移量处理
try:
json={"offset": offset, "limit": 10, "filter_type": 0, "totalNum": 500, "game_id": 26, "slol_id": "j9GJB4l",
"area_id": 24, "isMe": "true"}
res=requests.post(url=url,json=json,verify=False)
print(res.status_code)
with open('battle_list{0}.json'.format(offset),'w+',encoding='utf8') as f: #保存为json文件
f.write(res.text)
time.sleep(2)
except:
print('error!')
结果如下:
350场battle_id大功告成!
接下来就是battle_id的提取,以及对战数据请求的构造。
代码很简单啦:
import requests
import logging
import json
import time
Battle_list=[]
url='https://m.wegame/api/mobile/lua/proxy/index/mwg_lol_proxy/get_battle_detail'
logging.captureWarnings(True)
FileName=r'Z:\VSPY\battle_list{}.json'
headers={
'Accept':'application/json',
'Cookie':'******', #同样地替换cookies
'Content-Tyep':'application/json; charset=utf-8',
'Content-Length':'98',
'Host':'m.wegame',
'Connection':'Keep-Alive',
'Accept-Encoding':'gzip',
'User-Agent':'okhttp/3.11.0'
}
for offset in range(0,350,10):
with open(FileName.format(offset),'r',encoding='utf8') as f:
data=f.read()
hjson=json.loads(data)
Datas=hjson['data']['player_battle_brief_list']
for i in Datas:
Battle_list.append(i.get('battle_id'))
print(Battle_list)
print(len(Battle_list))
for battle_id in Battle_list: #将每一个battle_id参数传入请求
data={"game_id":26,"dst_slol_id":"j9GJB4l","req_slol_id":"j9GJB4l","area_id":24,"battle_id":battle_id,"show_type":1}
try:
res=requests.post(url=url,json=data,verify=False)
with open(r'Z:\VSPY\战绩\{}.json'.format(battle_id),'w+',encoding='utf8') as f:
f.write(res.text)
print(res.status_code)
time.sleep(2)
except:
print('error')
结果如下:
350场对战数据大功告成!
我们来看看里面数据:
哈哈哈啊哈!今天到此为止,至于数据分析嘛,下次再更!
版权声明:本文标题:python联盟是什么意思_Python 与 英雄联盟(1) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728794151a1174008.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论