摘要:創(chuàng)建表格創(chuàng)建工作表創(chuàng)建表頭圖片英雄圖片英雄圖片英雄第一行為表頭第一行是表頭,對(duì)應(yīng)的每一列填充數(shù)據(jù)行設(shè)置行高列英雄圖片,根據(jù)獲取英雄名統(tǒng)計(jì)次數(shù)表格生成,還可以插入柱狀圖。
文章鏈接:https://mp.weixin.qq.com/s/phJzZEQojndY-iNe77RF_w
恭喜OG成為ti8冠軍,很可惜這次偶數(shù)年ti8中國(guó)隊(duì)LGD與冠軍失之交臂。
上學(xué)那會(huì)兒還是個(gè)dota的玩家,現(xiàn)在已經(jīng)不玩了,對(duì)于這種國(guó)際性的賽事還是會(huì)比較關(guān)注的,這篇文章就是爬取ti8期間,bp英雄的統(tǒng)計(jì)(b是ban的簡(jiǎn)稱(chēng):禁止一個(gè)英雄上場(chǎng);p是pick的簡(jiǎn)稱(chēng):挑選英雄上場(chǎng))。
python爬蟲(chóng)之前寫(xiě)過(guò)幾篇文章的,都是用requests+ BeautifulSoup 進(jìn)行頁(yè)面解析獲取數(shù)據(jù)的。
python itchat 爬取微信好友信息
python爬蟲(chóng)學(xué)習(xí):爬蟲(chóng)QQ說(shuō)說(shuō)并生成詞云圖,回憶滿(mǎn)滿(mǎn)
一如既往的,找到這樣的頁(yè)面,但是卻解析不到這些數(shù)據(jù)。
再仔細(xì)一看,原來(lái)這些數(shù)據(jù)是js動(dòng)態(tài)加載渲染的,可以看到是接口請(qǐng)求來(lái)的數(shù)據(jù),慶幸的是這個(gè)接口不需要cookie之類(lèi)的驗(yàn)證信息的,直接get請(qǐng)求可以拿到數(shù)據(jù),這樣處理起來(lái)就方便的,對(duì)照頁(yè)面可以知道json格式的各字段名。
json結(jié)構(gòu)分析數(shù)據(jù)來(lái)源是接口,直接
response = requests.get(url) data = json.loads(response.text)
通過(guò)json.loads 去解析string類(lèi)型的數(shù)據(jù),主要數(shù)據(jù)格式如下:
{ total: 402, data: [{ match_id: 4080856812, radiant: { team_id: 15, name: "PSG.LGD", tag: "PSG.LGD", country_code: "CN", score: 34, bans: [{ //每個(gè)英雄數(shù)據(jù) 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" }, ...] }
每個(gè)item含radiant、dire ,其中radiant_win: 1,代表radiant 獲勝,0 則代表dire 獲勝。bans里面的是ban的英雄數(shù)據(jù)列表,picks里面是pick的英雄數(shù)據(jù)列表。
這里是用循環(huán)不斷去請(qǐng)求獲取的,每次的數(shù)據(jù)是20條,可以改變size改變條數(shù)。
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開(kāi)始,小于這個(gè)時(shí)間生成excel,跳出循環(huán) if item["end_time"] < "018-08-16 00:00": //生成excel ... return //bp數(shù)據(jù) ...bp數(shù)據(jù)
每項(xiàng)里面的bans、picks數(shù)據(jù)都要處理,每個(gè)英雄是一條記錄,重復(fù)的就+1,所以給每個(gè)英雄count 的屬性,記錄次數(shù)。
# item 指radiant 或dire 的bans、picks列表數(shù)據(jù) def bp(item, bp_dict): if item is None: return # 遍歷bans 或picks 數(shù)據(jù) for i, bp in enumerate(item): key = bp["name"] # 如果這個(gè)英雄已存在,count+1 if key in bp_dict.keys(): bp_dict[key]["count"] = bp_dict[key]["count"] + 1 else: # 不存在就記錄一條數(shù)據(jù) bp_dict[key] = copy.deepcopy(bp) bp_dict[key].update(count=1) return bp_dict
每條英雄數(shù)據(jù)是個(gè)鍵值對(duì)字典,鍵是name 屬性即英文名字,值就是bans、picks里的各項(xiàng)英雄數(shù)據(jù),順便加上了count 屬性。每個(gè)英雄數(shù)據(jù)存在dict()
{ //每條英雄數(shù)據(jù) name: "tiny", name_cn: "小小", id: 19, count:1 }
分別獲取兩只隊(duì)伍bp數(shù)據(jù)存放
b_dict = dict() p_dict = dict() # ban的數(shù)據(jù) bp(item["radiant"]["bans"], b_dict) bp(item["dire"]["bans"], b_dict) # pick的數(shù)據(jù) bp(item["radiant"]["picks"], p_dict) bp(item["dire"]["picks"], p_dict)
也可以統(tǒng)計(jì)所有英雄的出場(chǎng)次數(shù),非搬即選bp_list。
還可以獲取冠軍隊(duì)伍的bp情況,team_id 即隊(duì)伍的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
以上數(shù)據(jù)我們得到的是字典,里面有各英雄的bp次數(shù),現(xiàn)在要對(duì)這些數(shù)據(jù)進(jìn)行排序,按次數(shù)從大到小排序,這里就用到sorted()方法
# x[0]是根據(jù)鍵排序,x[1]是根據(jù)值,這里的值是字典,取["count"]項(xiàng)排序,得到的是元祖的list new_b_dict = sorted(b_dict.items(), key=lambda x: x[1]["count"], reverse=True)
得到的是數(shù)組,生成表格在之前這篇文章中有過(guò)使用,這里使用的是xlsxwriter三方庫(kù)來(lái)操作excel 表格的。
# 創(chuàng)建excel表格 file = xlsxwriter.Workbook("dota.xlsx") # 創(chuàng)建工作表1 sheet1 = file.add_worksheet("sheet1") # 創(chuàng)建表頭 headers = ["圖片", "英雄", "ban", "", "圖片", "英雄", "pick", "", "圖片", "英雄", "bp_all"] for i, header in enumerate(headers): # 第一行為表頭 sheet1.write(0, i, header)
第一行是表頭,對(duì)應(yīng)的每一列填充數(shù)據(jù)
def insert_data(sheet1, headers, bp_list, col1, col2, col3): for row in range(len(bp_list)): # 行 # 設(shè)置行高 sheet1.set_row(row + 1, 30) for col in range(len(headers)): # 列 if col == col1: # 英雄圖片,根據(jù)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: # 統(tǒng)計(jì)次數(shù) 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], # 圖表類(lèi)別標(biāo)簽范圍,x軸,這里取英雄的名字,即英雄名字那一列,行數(shù)根據(jù)數(shù)據(jù)列表確定 "values": ["sheet1", 1, col_y, len(bp_list), col_y], # 圖表數(shù)據(jù)范圍,y軸,即次數(shù)那一列,行數(shù)根據(jù)數(shù)據(jù)列表確定 "data_labels": {"value": True}, }) chart.set_title({"name": name}) # 圖表標(biāo)題 chart.set_size({"width": 2000, "height": 400}) chart.set_x_axis({"name": "英雄"}) # x軸描述 chart.set_y_axis({"name": "次數(shù)"}) # y軸描述 chart.set_style(3) # 直方圖類(lèi)型 sheet1.insert_chart(M, chart) # 在表格M處插入柱狀圖
效果圖:
這里只是簡(jiǎn)單的對(duì)數(shù)據(jù)進(jìn)行篩選展示,這些數(shù)據(jù)還是可以用來(lái)做更多的數(shù)據(jù)分析的,數(shù)據(jù)來(lái)源:刀魔數(shù)據(jù)。
github地址:https://github.com/taixiang/py_dota
最后放上lgd的圖片,希望他們明年能在ti9上再干回來(lái)
歡迎關(guān)注我的博客:https://blog.manjiexiang.cn/
更多精彩歡迎關(guān)注微信號(hào):春風(fēng)十里不如認(rèn)識(shí)你
有個(gè)「佛系碼農(nóng)圈」,歡迎大家加入暢聊,開(kāi)心就好!
過(guò)期了,可加我微信 tx467220125 拉你入群。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42309.html
摘要:都說(shuō)年末了,該給自己寫(xiě)寫(xiě)總結(jié)了。我現(xiàn)在做一些簡(jiǎn)單的爬蟲(chóng)都會(huì)用它。并且對(duì)數(shù)據(jù)的實(shí)時(shí)性要求較高,或者爬數(shù)據(jù)的時(shí)候封的太厲害了。對(duì)于這一類(lèi)的爬蟲(chóng)。消息隊(duì)列用于分發(fā)消息給某個(gè)爬蟲(chóng)節(jié)點(diǎn)。爬蟲(chóng)節(jié)點(diǎn)完成具體的爬蟲(chóng),格式化爬蟲(chóng)數(shù)據(jù)。最后,感謝我的,謝謝 都說(shuō)年末了,該給自己寫(xiě)寫(xiě)總結(jié)了。今天我想談一談的是我在公司這一年多里的負(fù)責(zé)的部分工作---爬蟲(chóng)。做了這么久的爬蟲(chóng),是該寫(xiě)點(diǎn)什么,留下點(diǎn)什么。在我所負(fù)責(zé)...
摘要:有什么作用通過(guò)有效的爬蟲(chóng)手段批量采集數(shù)據(jù),可以降低人工成本,提高有效數(shù)據(jù)量,給予運(yùn)營(yíng)銷(xiāo)售的數(shù)據(jù)支撐,加快產(chǎn)品發(fā)展。因?yàn)樾畔⑹峭耆_(kāi)的,所以是合法的。 showImg(https://segmentfault.com/img/remote/1460000011359885?w=566&h=316); 什么是爬蟲(chóng)? 網(wǎng)絡(luò)爬蟲(chóng)也叫網(wǎng)絡(luò)蜘蛛,如果把互聯(lián)網(wǎng)比喻成一個(gè)蜘蛛網(wǎng),那么蜘蛛就是在...
摘要:數(shù)據(jù)庫(kù)文件已經(jīng)超過(guò)了了。復(fù)聯(lián)從開(kāi)始便是漫威宇宙各路超級(jí)英雄的集結(jié),到現(xiàn)在的第部,更是全英雄的匯聚。所以,滅霸出現(xiàn)的次數(shù)居然高于了鋼鐵俠。情感分析,又稱(chēng)為意見(jiàn)挖掘傾向性分析等。 showImg(https://segmentfault.com/img/remote/1460000019095022); 作者 | 羅昭成責(zé)編 | 唐小引 《復(fù)聯(lián) 4》國(guó)內(nèi)上映第十天,程序員的江湖里開(kāi)始流傳這...
摘要:如果沒(méi)有,請(qǐng)記住列表中的第一項(xiàng)是項(xiàng)。通過(guò)練習(xí),您將更好地計(jì)算列表中的項(xiàng)目。例如,要將項(xiàng)添加到我們的水果列表中,我們可以使用名為的方法。通過(guò)這樣做,該項(xiàng)目的值也將被刪除。在中,這意味著使用以及名稱(chēng)和要?jiǎng)h除的項(xiàng)目的名稱(chēng)。 showImg(https://segmentfault.com/img/remote/1460000019177365?w=852&h=479); 來(lái)源 | 愿碼(C...
閱讀 1079·2021-11-24 10:27
閱讀 3351·2021-11-18 10:02
閱讀 2408·2021-11-16 11:45
閱讀 3173·2021-11-15 18:10
閱讀 841·2021-09-22 15:23
閱讀 1544·2019-08-30 15:53
閱讀 3030·2019-08-30 13:20
閱讀 1678·2019-08-30 12:53