python list转json_Python 与 英雄联盟(1)

3614930b30e98482ed04510c4bb62dfd.png

在我写这篇文章前,兴奋地在知乎站内搜了一下关键词“python 英雄联盟”,又兴奋地发现,我似乎是第一个把python用在A(买关子)方面的人!!!我知道我的机会来了!!

英雄联盟:什么?!你python和我有什么关系?!

嘿嘿,不卖关子了,python就是和你英雄联盟有关系!

前情提要:

这篇文章涉及python爬虫,python数据分析,如果你对此感兴趣,那么

472003427f258f7019f4a1ddb5a33447.gif

老规矩,开头概括整篇文章。这篇文章关于英雄联盟玩家数据(掌上wegame app)的爬取及数据分析,和遇到的坑(有代码呦 )。

先磨刀(搭环境):

涉及python模块:requests,json(没想到吧!)

相关工具:夜神模拟器(任何一款安卓模拟器都行),fiddler。

假设H:你已具备相关爬虫知识(最简单的),会简单使用抓包工具。(你当然可以拒绝这个假设!)

目的:(灵感来源)分析自己的对战数据,以此来证明自己菜否。

25fa4a5977244efb6bfd97154572ba41.png

好吧,既然要分析数据,那得要数据啊。于是我赶紧去英雄联盟官网寻找自己得对战数据(web) 然后,

b7a621bb0a5b3e9f9389e6082f8e48cb.png

完全找不到。

然后我去pc端wegame找数据,数据虽然有,可发现无处下手。(抓包抓不到)

cff4ca1ee4f22a81fe853ba5a84479dd.png

最后,我去移动端找数据,数据虽然有,可无从下手+1。(无法抓包,模拟器中app闪退)。

1d85aa0ce89498af722beb30fafddcec.png

啊!天亡我也!这篇文章到此结束。

怎么可能?!虽然发现事情并不简单,可我难道就这样子放弃吗?

办法总是有得呀!虽然模拟器app闪退,我可以用真机呀,我可以换app呀!

于是我换了个掌上英雄联盟,进行真机抓取。

然后发现我需要作的工作是这样的:

629d729c1a883eb3323a08c32b88ad3d.png

是这样的:

a145ede8c735f559adb74be006eb51cd.png

这种方法是使用appium(appium在windows下安装是个深坑)进行真机抓取,需要定位每一个含有有价值信息的节点,以及数据的过滤,关键是要写自动脚本,要是数据量小还可以接受,可数据量一大起来(我的破手机)

bb62b4b59d6143e1e6b245fb432d5c5d.png

办法总是有的,办法总是留给愿意去付出努力的靓仔的!

偶然间看到一位大佬的文章,提出了解决app在模拟器上闪退的问题,然后嘿嘿,那么我的机会来了!

(友情链接)

(概述一下,就是使用xposed+justtrustme框架)

好!开始抓包!

(抓的时自己账号的对战数据)

226daca0bbc59f90d4232caa5a16e0ec.png
为保护玩家隐私,id已被我马赛克。

好,请求的数据已经很清楚地摆在我们面前,什么没看清?

那么这个呢?

c91b423f8efab516918c413781dbd7af.png

我无条件承认学好英语是一件收益匪浅地事情。

api? battle?detail?

6bf75d2444010fe87b6b4aff28c233a5.png

这不就是%#%$%$掐架,细节吗?(修正中.......)

这不就是对战数据的接口吗?

好,那么来看看这个请求返回的数据

234befa706a5410b5982bb914cd982d2.png

破肥特!!返回json数据,英文好在都看的懂。

那么继续来看看这个请求的headers。

97f267ade9b627335b7bb0d6c9815a65.png

很容易看出,post请求,并且带了条json数据。经过我周密分析,每一场对战的battle_id都是不同的,具体这battle_id是如何生成的,我们来继续分析。

然后

b7a621bb0a5b3e9f9389e6082f8e48cb.png

无解了。我不知道,我不会,我头疼。

难道要翻在这阴沟里了?

6fe5da92f74bf06fb54e1781ee738695.png

这么靓仔的我怎么可能翻船呢?

我错过了一个细节,当你在该页面往下滑你会发现

0d84362cb971a7d10edf200b09fa0e35.png

api?battle?list?

这不就是%¥%&掐架,串串吗?(修正中.......)

这不就是对战列表接口吗?

来看看这个接口返回的数据

91a43eaa8368491d57ab80ec76404325.png

bettle_id在这!破肥特!

进一步分析你会发现一个很重要的参数。

0dd3cc1493d63a4dcd501d1a5162bbf0.png

offset?

消除?偏移?(修正中.....)

这不就是偏移量吗?

经过我仔细观察发现,每次偏移量为10,返回10场对战数据(10个battle_id)。

好,既然不知道这个id如何生成,那么我就给他抓下来!

(经过实践,发现最多能抓到350条id,超过350条返回的都是空数据,也许服务器就只存储玩家近来350场对战数据,不管了,无所谓)

激动人心的代码来了:

import requests
import logging
import time
logging.captureWarnings(True)
url='https://m.wegame.com.cn/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.com.cn',
    '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!')


结果如下:

bb3c1bef1a103c604c80203cd62ba4a9.png

350场battle_id大功告成!

接下来就是battle_id的提取,以及对战数据请求的构造。

代码很简单啦:

import requests 
import logging
import json
import time
Battle_list=[]
url='https://m.wegame.com.cn/api/mobile/lua/proxy/index/mwg_lol_proxy/get_battle_detail'
logging.captureWarnings(True)
FileName=r'Z:VSPYbattle_list{}.json'
headers={
    'Accept':'application/json',
    'Cookie':'******',                                                      #同样地替换cookies
    'Content-Tyep':'application/json; charset=utf-8',
    'Content-Length':'98',
    'Host':'m.wegame.com.cn',
    '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')








结果如下:

ad79fa8a236102e8a1e0fe1254fb7c4e.png

350场对战数据大功告成!

我们来看看里面数据:

88abf4afb23d58574ddcc2e56b5393e0.png

哈哈哈啊哈!今天到此为止,至于数据分析嘛,下次再更!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值