Python爬虫:英雄联盟近期战绩查询 |
您所在的位置:网站首页 › lol查战绩查询网站 › Python爬虫:英雄联盟近期战绩查询 |
c语言选手早已听说Python的方便和其各大爬虫模块的实用性,于是暑假无所事事的我决定在没有系统学习Python语法的情况下,一边写一个和自己兴趣有关的爬虫,一边学习一下Python方便的语法,体验Python的方便之处。 一·用到的语法 1.requests.get()这个是常用的爬虫模块,可以爬取网页的json文件,语法为request.get(url,param,headers) 其中url是必须要的,用来给网络文件定位;param不一定需要,具体是干啥的我也没遇到过;headers是防止被反爬虫的,可以把自己的user-agent模拟成浏览器,并且可以输入cookie,保证可以不被网页的反爬虫机制阻挡。 2.re.findall()这个是正则表达式模块re里面的,对于正则表达式还需要继续学习,但是本项目只需要使用这个找出英文单词(英雄名)和数字(英雄代码),比较简单 3.for循环Python的循环很有意思,遍历数组arr中的元素用到循环for elem in arr:其中我们还可以在后面加上[x:]表示从下标为x的开始和[:x]表示只遍历前面的x个 4.printPython的print只可以输出字符串,不可以输出数字,如果输出数组需要转换为字符串str(num) 5.inputinput也是处理字符串,如果要读取数字也需要转换: int(input("请输入数字:")) 二·分析LOL战绩查询的网站进入网站社区个人中心-英雄联盟官方网站-腾讯游戏 (qq.com),登录以后按f12使用开发工具。到网络-JS里面寻找对局的JS文件。 刚开始你会发现JS文件是空的,这是因为它已经载入好了,而载入的时候你还没有按下F12,所以就没有抓取到。这时候刷新一下,就会有一堆js文件出现。 我们可以在这一堆文件里面找到这几个?c=Battle开头的。点开观察一下,第一个是matchList,点击浏览发现里面记录的是对局Id: 所以我们的第一步就确定了:爬取matchList,获得gameId。 然后我们再根据gameId一局局爬取对局信息: 这时候打开一局游戏的js文件观察: 首先是url:这时候我们就发现gameId的用处了:每一句的url区分就靠这个gameId,所以我们就根据gameId的修改爬取数据。 下面还有Cookie: 在写hearder的时候我们就可以复制这个Cookie (注意:这个Cookie是会变化的,所以可能你几个小时之前可以爬取数据,现在就对json报错了,那就是Cookie变了,需要重新复制一个) 然后点浏览: 在一级目录msg的下方有gameInfo,gameStats,participants三个目录:我们分别找一找有什么值得爬取的数据: gameInfo里,有个gameTypeId:根据我一局一局和掌盟比对发现 然后看gameStats下面的teamStats 0是蓝色方,1是红色方,我们可以看到队伍胜利情况:这局0['win']=='Win',所以是蓝色方胜利。 然后看Participants:一共有0-9十个人(废话),我们看看第一个(0): 可以看到召唤师名字和其队伍,其实排列顺序是0-4是蓝色方,5-9是红色方。 然后我们看stats 有很多东西,我们这里爬取:英雄 击杀 死亡 助攻 伤害(物理 魔法 真实)推塔 经济 如果想爬取更多(比如插眼个数)也是可以的,这里面还有很多数据可以爬取 这时候其实就已经差不多了,我们先做,最后还有个小问题,我也是做完才发现的= = 三·代码实现 头文件: import requests,json,re分别是爬虫,读取json,正则 爬取matchList:url和cookie按照之前的url和Cookie填写: url = '太长了0.0' headers = {'Cookie':'太长了','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}然后爬取:我们查看js文件发现前16个字符和gameId无关,掠过: res = requests.get(url,headers=headers)#解析网页 #print(res.text) json1 = json.loads(res.text[16:]) games = json1['msg']['games'] gameIds = [] for game in games: gameId = game['gameId'] gameIds.append(gameId) #print(gameIds)这里把json和gameId输出检查一下,没问题以后继续。 爬取游戏:首先我们确定一下要爬多少场: x = int(input("输入查询的对局场数:"))然后我们遍历gameId的前x场: 注意这里的url中的gameId是可变的。 输出游戏id 游戏类型 游戏结果 接下来遍历每一个玩家(participants0-9) 输出我们爬取的数据 for i in gameIds[:x]: url2 = 'https://lol.sw.game.qq.com/lol/api/?c=Battle&a=combatGains&areaId=18&gameId='+str(i)+'&r1=combatGains' headers2 = {'Cookie':'请使用自己的','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'} res2 = requests.get(url2,headers=headers2) json2 = json.loads(res2.text[18:]) print("\n对局ID:"+str(i)) gameInfo = json2['msg']['gameInfo'] gameType = gameInfo['gameTypeId'] if gameType==19: print("匹配模式(召唤师峡谷)") if gameType==18: print("排位模式(召唤师峡谷)") if gameType==21: print("极地大乱斗(嚎哭深渊)") win = json2['msg']['gameStats']['teamStats'][0]['win'] if win == 'win': print("结果:蓝色方胜利") else: print("结果:红色方胜利") participants = json2['msg']['participants'] for par in participants: if par == participants[0]: print("蓝色方:") if par == participants[5]: print("红色方:") summonerName = par['summonerName'] chId = par['championId'] print(chId) stats = par['stats'] kill = stats['kills'] death = stats['deaths'] assist = stats['assists'] totDam = stats['totalDamageDealtToChampions'] phyDam = stats['physicalDamageDealtToChampions'] magDam = stats['magicDamageDealtToChampions'] truDam = stats['trueDamageDealtToChampions'] damTak = stats['totalDamageTaken'] tower = stats['towerKills'] gold = stats['goldEarned'] print(" 召唤师名称:" + str(summonerName) + "\n 经济:"+str(gold)+"\n K/D/A:" + str(kill) + "/" + str(death) + "/" + str(assist) + " 推塔个数:" + str(tower) + "\n 对英雄伤害:" + str(totDam) + " 物理伤害:" + str(phyDam) + " 魔法伤害:" + str(magDam) + " 真实伤害:" + str(truDam) + "\n 承受伤害:" + str(damTak)+"\n")大致就完成了,但是这时候输出的英雄是英雄Id(数字),而不是英雄名字,说实话正常人谁知道英雄的代码是多少,所以我们还需要爬取英雄Id和名字的对应关系。 四·爬取英雄名字这时候我们就需要在一堆js文件里面寻找可能附带有英雄Id的(比如champion,hero等字样的),可是我找了好半天也找不到,所以只好在官网的其他地方找找: 游戏资料-英雄联盟官方网站-腾讯游戏 (qq.com) 最终我在英雄资料页找到了,随便打开一个英雄页面,我们发现了这个: 芜!这不就是我要找的英雄Id和名称对应吗:266号是剑魔,103号是阿狸 刚开始,对于python不熟悉的我采取的一个笨比方法:复制过来,用c语言写出python代码(真就我用代码写代码) #include #include char str[102400]; int main(){ FILE *src = fopen("champion_src.txt","r"); FILE *dst = fopen("champion_dst.txt","w"); char c; int i = 0; while(~fscanf(src,"%c",&c)){ if((c>='a'&&c='A'&&c='0'&&c |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |