文章链接:https://mp.weixin.qq.com/s/phJzZEQojndY-iNe77RF_w

恭喜OG成为ti8冠军,很可惜这次偶数年ti8中国队LGD与冠军失之交臂。

上学那会儿还是个dota的玩家,现在已经不玩了,对于这种国际性的赛事还是会比较关注的,这篇文章就是爬取ti8期间,bp英雄的统计(b是ban的简称:禁止一个英雄上场;p是pick的简称:挑选英雄上场)。

python爬虫之前写过几篇文章的,都是用requests+ BeautifulSoup 进行页面解析获取数据的。

python itchat 爬取微信好友信息

python爬虫学习:爬虫QQ说说并生成词云图,回忆满满

一如既往的,找到这样的页面,但是却解析不到这些数据。

再仔细一看,原来这些数据是js动态加载渲染的,可以看到是接口请求来的数据,庆幸的是这个接口不需要cookie之类的验证信息的,直接get请求可以拿到数据,这样处理起来就方便的,对照页面可以知道json格式的各字段名。

json结构分析

数据来源是接口,直接

response = requests.get(url)
data = json.loads(response.text)

通过json.loads 去解析string类型的数据,主要数据格式如下:

{total: 402,data: [{match_id: 4080856812,radiant: {team_id: 15,name: "PSG.LGD",tag: "PSG.LGD",country_code: "CN",score: 34,bans: [{ //每个英雄数据name: "spectre",name_cn: "幽鬼",id: 67}, ...],picks: [{name: "earthshaker",name_cn: "撼地者",id: 7}, ...]},dire: {team_id: 2586976,name: "OG",tag: "OG",country_code: "US",score: 35,bans: [{name: "tiny",name_cn: "小小",id: 19}, ...],picks: [{name: "furion",name_cn: "先知",id: 53}, ...]},radiant_win: 0,end_time: "2018-08-26 10:51"}, ...]
}

每个item含radiant、dire ,其中radiant_win: 1,代表radiant 获胜,0 则代表dire 获胜。bans里面的是ban的英雄数据列表,picks里面是pick的英雄数据列表。

这里是用循环不断去请求获取的,每次的数据是20条,可以改变size改变条数。

page = 1
while True:url = "https://www.dotamore.com/api/v1/league/matchlist?league_id=9870&page=%d&size=20" % pageresponse = requests.get(url)data = json.loads(response.text)page += 1for item in data["data"]:# 比赛从8月16开始,小于这个时间生成excel,跳出循环if item["end_time"] < "018-08-16 00:00"://生成excel...return//bp数据...

bp数据

每项里面的bans、picks数据都要处理,每个英雄是一条记录,重复的就+1,所以给每个英雄count 的属性,记录次数。

# item 指radiant 或dire 的bans、picks列表数据
def bp(item, bp_dict):if item is None:return# 遍历bans 或picks 数据for i, bp in enumerate(item):key = bp["name"]# 如果这个英雄已存在,count+1if key in bp_dict.keys():bp_dict[key]["count"] = bp_dict[key]["count"] + 1else:  # 不存在就记录一条数据bp_dict[key] = copy.deepcopy(bp)bp_dict[key].update(count=1)return bp_dict

每条英雄数据是个键值对字典,键是name 属性即英文名字,值就是bans、picks里的各项英雄数据,顺便加上了count 属性。每个英雄数据存在dict()

{ //每条英雄数据name: "tiny",name_cn: "小小",id: 19,count:1
}

分别获取两只队伍bp数据存放

b_dict = dict()
p_dict = dict()
# ban的数据
bp(item["radiant"]["bans"], b_dict)
bp(item["dire"]["bans"], b_dict)
# pick的数据
bp(item["radiant"]["picks"], p_dict)
bp(item["dire"]["picks"], p_dict)

也可以统计所有英雄的出场次数,非搬即选bp_list。
还可以获取冠军队伍的bp情况,team_id 即队伍的id。

if item["radiant_win"] == 0:if item["dire"]["team_id"] == "2586976":bp(item["dire"]["bans"], b_win_dict)bp(item["dire"]["picks"], p_win_dict)
else:if item["radiant"]["team_id"] == "2586976":bp(item["radiant"]["bans"], b_win_dict)bp(item["radiant"]["picks"], p_win_dict)

生成excel

以上数据我们得到的是字典,里面有各英雄的bp次数,现在要对这些数据进行排序,按次数从大到小排序,这里就用到sorted()方法

# x[0]是根据键排序,x[1]是根据值,这里的值是字典,取["count"]项排序,得到的是元祖的list
new_b_dict = sorted(b_dict.items(), key=lambda x: x[1]["count"], reverse=True)

得到的是数组,生成表格在之前这篇文章中有过使用,这里使用的是xlsxwriter三方库来操作excel 表格的。

# 创建excel表格
file = xlsxwriter.Workbook("dota.xlsx")
# 创建工作表1
sheet1 = file.add_worksheet("sheet1")
# 创建表头
headers = ["图片", "英雄", "ban", "", "图片", "英雄", "pick", "", "图片", "英雄", "bp_all"]
for i, header in enumerate(headers):# 第一行为表头sheet1.write(0, i, header)

第一行是表头,对应的每一列填充数据

def insert_data(sheet1, headers, bp_list, col1, col2, col3):for row in range(len(bp_list)):  # 行# 设置行高sheet1.set_row(row + 1, 30)for col in range(len(headers)):  # 列if col == col1:  # 英雄图片,根据id获取url = "http://cdn.dotamore.com/heros_id_62_35/%d.png" % bp_list[row][1]["id"]image_data = BytesIO(urlopen(url).read())sheet1.insert_image(row + 1, col, url, {"image_data": image_data})if col == col2:  # 英雄名name = bp_list[row][1]["name_cn"]sheet1.write(row + 1, col, name)if col == col3:  # 统计次数count = bp_list[row][1]["count"]sheet1.write(row + 1, col, count)

excel 表格生成,还可以插入柱状图。

def insert_chart(file, sheet1, bp_list, name, M, col_x, col_y):chart = file.add_chart({"type": "column"})  # 柱状图chart.add_series({"categories": ["sheet1", 1, col_x, len(bp_list), col_x],  # 图表类别标签范围,x轴,这里取英雄的名字,即英雄名字那一列,行数根据数据列表确定"values": ["sheet1", 1, col_y, len(bp_list), col_y],  # 图表数据范围,y轴,即次数那一列,行数根据数据列表确定"data_labels": {"value": True},})chart.set_title({"name": name})  # 图表标题chart.set_size({"width": 2000, "height": 400})chart.set_x_axis({'name': '英雄'})  # x轴描述chart.set_y_axis({'name': '次数'})  # y轴描述chart.set_style(3)  # 直方图类型sheet1.insert_chart(M, chart)  # 在表格M处插入柱状图

效果图:

这里只是简单的对数据进行筛选展示,这些数据还是可以用来做更多的数据分析的,数据来源:刀魔数据。
github地址:https://github.com/taixiang/py_dota

最后放上lgd的图片,希望他们明年能在ti9上再干回来

欢迎关注我的博客:https://blog.manjiexiang.cn/
更多精彩欢迎关注微信号:春风十里不如认识你

有个「佛系码农圈」,欢迎大家加入畅聊,开心就好!


过期了,可加我微信 tx467220125 拉你入群。

python告诉你ti8 dota2英雄bp相关推荐

  1. python告诉你ti8 dota2英雄bp 1

    文章链接: https://mp.weixin.qq.com/s/phJzZEQojndY-iNe77RF_w 恭喜OG成为ti8冠军,很可惜这次偶数年ti8中国队LGD与冠军失之交臂. 上学那会儿还 ...

  2. 【C#】WinForm 之 DOTA2英雄搭配助手(网页抓取+在线绿色版+源码开放)

    睡不着,无聊......再整理点好玩的出来.先上图 效果 碎碎念 自从13级后打出DOTA2的天梯积分以来简直是逆水行舟不进则退啊,室友已经高呼着被游戏玩了!!结果怒删游戏 其实我也发现这游戏不合适我 ...

  3. 实用Python是如何爬取英雄联盟(lol)全部皮肤,涨知识了

    实用Python是如何爬取英雄联盟(lol)全部皮肤,涨知识了 小三:"怎么了小二?一副无精打采的样子!" 小二:"唉!别提了,还不是最近又接触了一个叫英雄联盟的游戏,游 ...

  4. Python告诉你:为何年终奖多发一元,到手却少两千多?

    作者 | shenzhongqiang 来源 | Python数据与分析(ID:ML_Python) 年终奖多发一元,到手却要少两千多,甚至更多.听到这个消息的时候,大家是不是觉得有点意外,意外之余还 ...

  5. 啥是佩奇?Python告诉你

    作者 | 丁彦君 来源 | 恋习Python 昨天, 被<啥是佩奇>这支广告片刷屏了. 佩奇明明是个喜剧角色, 却看哭了所有人. ▼ <啥是佩奇>??? 快过年了 在农村爷爷给 ...

  6. 用Python分析了1982场英雄联盟数据,开局前预测游戏对局胜负!

    微信改版,加星标不迷路! 用Python分析如何打好英雄联盟? 作者:阿广 概述 前言 假设 游戏对战数据获取 分析和训练数据 游戏对战胜负预测 期望研究的问题 结论 阿广说 推荐阅读 前言 如今,只 ...

  7. 11月30日云栖精选夜读 | 用Python告诉你,现在的房租有多高?

    杭州房租:钱塘两岸最高,奥体单间达4830元/月.不少人感叹:躲过了高房价,躲不过高房租,面对房租上涨,感觉身体被掏空.2018年的这个夏天,房租正在成为摧垮年轻人的"第一根稻草" ...

  8. python玩王者荣耀皮肤_利用Python完成对王者荣耀英雄全皮肤的下载

    本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸. 基本环境配置 版本:Python3 系统:Windows 相关 ...

  9. python哪本好-在众多小说中,Python告诉你哪本小说好看

    Python Python开发 Python语言 在众多小说中,Python告诉你哪本小说好看 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及 ...

最新文章

  1. 解放双手!接私活必备的Java开源项目
  2. 用vue+webpack搭建的前端项目结构
  3. 编码时的一些普适原则
  4. window环境安装composer
  5. Android学习笔记之android:collapseColumns,android:shrinkColumns和stretchColumn
  6. redis——对项目的一些优化方案
  7. IDEA 启动时,报“淇℃伅”的字符
  8. c语言怎么用movc指令,【图片】求助大佬用c语言帮忙编写下程序【c程序吧】_百度贴吧...
  9. Android 如何优雅地实现@人功能?
  10. 黑苹果EFI大全下载,拥有各种电脑机型配置!
  11. 模拟电路实现延时功能
  12. PID控制算法的c语言实现 附录2 直流电机PWM调速系统中控制电压非线性研究
  13. LINUX中断机制与信号(http://linux.chinaitlab.com/soft/878170.html)
  14. 登录服务器的详细步骤
  15. hdu 5455 Fang Fang
  16. 电风扇计算机控制系统,语音识别电风扇控制系统设计.doc
  17. 热烈祝贺 | 方正璞华喜获“数字贸易专委会年度示范单位”殊荣及“终身荣誉会长”单位
  18. codevs 切糕 网络流
  19. 使用JavaScript 实现简单的移动和缓动的动画效果
  20. python调用百度api实现摄像头识别文字

热门文章

  1. 哈啰电动车“智慧门店”设想,经销商们买账吗?
  2. NFC模组,开发NFC功能 只要几条指令的事情
  3. ggplot2_ `scale_xxx()`标度调整
  4. 银行营销策略数据分析 - 智能定位
  5. 【U盘主控芯片的优缺点】
  6. 通过源码分析Mybatis运行原理
  7. uni-app获取当前时间日期及之后7天和星期几
  8. BF发卡网开源源码+详细教程
  9. 30张被厂商阉割掉的Andorid7.0原生2K壁纸,我们为你优选最优质的10张
  10. r语言做绘制精美pcoa图_PCOA分析