摘要:創建表格創建工作表創建表頭圖片英雄圖片英雄圖片英雄第一行為表頭第一行是表頭,對應的每一列填充數據行設置行高列英雄圖片,根據獲取英雄名統計次數表格生成,還可以插入柱狀圖。
文章鏈接: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" % page response = requests.get(url) data = json.loads(response.text) page += 1 for 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+1 if key in bp_dict.keys(): bp_dict[key]["count"] = bp_dict[key]["count"] + 1 else: # 不存在就記錄一條數據 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 拉你入群。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42309.html
摘要:都說年末了,該給自己寫寫總結了。我現在做一些簡單的爬蟲都會用它。并且對數據的實時性要求較高,或者爬數據的時候封的太厲害了。對于這一類的爬蟲。消息隊列用于分發消息給某個爬蟲節點。爬蟲節點完成具體的爬蟲,格式化爬蟲數據。最后,感謝我的,謝謝 都說年末了,該給自己寫寫總結了。今天我想談一談的是我在公司這一年多里的負責的部分工作---爬蟲。做了這么久的爬蟲,是該寫點什么,留下點什么。在我所負責...
摘要:數據庫文件已經超過了了。復聯從開始便是漫威宇宙各路超級英雄的集結,到現在的第部,更是全英雄的匯聚。所以,滅霸出現的次數居然高于了鋼鐵俠。情感分析,又稱為意見挖掘傾向性分析等。 showImg(https://segmentfault.com/img/remote/1460000019095022); 作者 | 羅昭成責編 | 唐小引 《復聯 4》國內上映第十天,程序員的江湖里開始流傳這...
摘要:如果沒有,請記住列表中的第一項是項。通過練習,您將更好地計算列表中的項目。例如,要將項添加到我們的水果列表中,我們可以使用名為的方法。通過這樣做,該項目的值也將被刪除。在中,這意味著使用以及名稱和要刪除的項目的名稱。 showImg(https://segmentfault.com/img/remote/1460000019177365?w=852&h=479); 來源 | 愿碼(C...
閱讀 1070·2021-11-24 10:27
閱讀 3343·2021-11-18 10:02
閱讀 2404·2021-11-16 11:45
閱讀 3166·2021-11-15 18:10
閱讀 831·2021-09-22 15:23
閱讀 1535·2019-08-30 15:53
閱讀 3025·2019-08-30 13:20
閱讀 1671·2019-08-30 12:53