亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python告訴你ti8 dota2英雄bp

zhonghanwen / 3120人閱讀

摘要:創(chuàng)建表格創(chuàng)建工作表創(chuàng)建表頭圖片英雄圖片英雄圖片英雄第一行為表頭第一行是表頭,對應(yīng)的每一列填充數(shù)據(jù)行設(shè)置行高列英雄圖片,根據(jù)獲取英雄名統(tǒng)計次數(shù)表格生成,還可以插入柱狀圖。

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

恭喜OG成為ti8冠軍,很可惜這次偶數(shù)年ti8中國隊LGD與冠軍失之交臂。

上學(xué)那會兒還是個dota的玩家,現(xiàn)在已經(jīng)不玩了,對于這種國際性的賽事還是會比較關(guān)注的,這篇文章就是爬取ti8期間,bp英雄的統(tǒng)計(b是ban的簡稱:禁止一個英雄上場;p是pick的簡稱:挑選英雄上場)。

python爬蟲之前寫過幾篇文章的,都是用requests+ BeautifulSoup 進行頁面解析獲取數(shù)據(jù)的。

python itchat 爬取微信好友信息

python爬蟲學(xué)習(xí):爬蟲QQ說說并生成詞云圖,回憶滿滿

一如既往的,找到這樣的頁面,但是卻解析不到這些數(shù)據(jù)。

再仔細一看,原來這些數(shù)據(jù)是js動態(tài)加載渲染的,可以看到是接口請求來的數(shù)據(jù),慶幸的是這個接口不需要cookie之類的驗證信息的,直接get請求可以拿到數(shù)據(jù),這樣處理起來就方便的,對照頁面可以知道json格式的各字段名。

json結(jié)構(gòu)分析

數(shù)據(jù)來源是接口,直接

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

通過json.loads 去解析string類型的數(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: [{ //每個英雄數(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"
    }, ...]
}

每個item含radiant、dire ,其中radiant_win: 1,代表radiant 獲勝,0 則代表dire 獲勝。bans里面的是ban的英雄數(shù)據(jù)列表,picks里面是pick的英雄數(shù)據(jù)列表。

這里是用循環(huán)不斷去請求獲取的,每次的數(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開始,小于這個時間生成excel,跳出循環(huán)
        if item["end_time"] < "018-08-16 00:00":
            //生成excel
            ...
        return
        //bp數(shù)據(jù)
        ...
bp數(shù)據(jù)

每項里面的bans、picks數(shù)據(jù)都要處理,每個英雄是一條記錄,重復(fù)的就+1,所以給每個英雄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"]
        # 如果這個英雄已存在,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ù)是個鍵值對字典,鍵是name 屬性即英文名字,值就是bans、picks里的各項英雄數(shù)據(jù),順便加上了count 屬性。每個英雄數(shù)據(jù)存在dict()

{ //每條英雄數(shù)據(jù)
    name: "tiny",
    name_cn: "小小",
    id: 19,
    count:1
}

分別獲取兩只隊伍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)計所有英雄的出場次數(shù),非搬即選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

以上數(shù)據(jù)我們得到的是字典,里面有各英雄的bp次數(shù),現(xiàn)在要對這些數(shù)據(jù)進行排序,按次數(shù)從大到小排序,這里就用到sorted()方法

# x[0]是根據(jù)鍵排序,x[1]是根據(jù)值,這里的值是字典,取["count"]項排序,得到的是元祖的list
new_b_dict = sorted(b_dict.items(), key=lambda x: x[1]["count"], reverse=True)

得到的是數(shù)組,生成表格在之前這篇文章中有過使用,這里使用的是xlsxwriter三方庫來操作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)

第一行是表頭,對應(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)計次數(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],  # 圖表類別標簽范圍,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})  # 圖表標題
    chart.set_size({"width": 2000, "height": 400})
    chart.set_x_axis({"name": "英雄"})  # x軸描述
    chart.set_y_axis({"name": "次數(shù)"})  # y軸描述
    chart.set_style(3)  # 直方圖類型
    sheet1.insert_chart(M, chart)  # 在表格M處插入柱狀圖

效果圖:

這里只是簡單的對數(shù)據(jù)進行篩選展示,這些數(shù)據(jù)還是可以用來做更多的數(shù)據(jù)分析的,數(shù)據(jù)來源:刀魔數(shù)據(jù)。
github地址:https://github.com/taixiang/py_dota

最后放上lgd的圖片,希望他們明年能在ti9上再干回來

歡迎關(guān)注我的博客:https://blog.manjiexiang.cn/
更多精彩歡迎關(guān)注微信號:春風(fēng)十里不如認識你

有個「佛系碼農(nóng)圈」,歡迎大家加入暢聊,開心就好!


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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/42309.html

相關(guān)文章

  • 2016年,我對爬蟲的總結(jié)

    摘要:都說年末了,該給自己寫寫總結(jié)了。我現(xiàn)在做一些簡單的爬蟲都會用它。并且對數(shù)據(jù)的實時性要求較高,或者爬數(shù)據(jù)的時候封的太厲害了。對于這一類的爬蟲。消息隊列用于分發(fā)消息給某個爬蟲節(jié)點。爬蟲節(jié)點完成具體的爬蟲,格式化爬蟲數(shù)據(jù)。最后,感謝我的,謝謝 都說年末了,該給自己寫寫總結(jié)了。今天我想談一談的是我在公司這一年多里的負責的部分工作---爬蟲。做了這么久的爬蟲,是該寫點什么,留下點什么。在我所負責...

    netmou 評論0 收藏0
  • 大話爬蟲的基本套路

    摘要:有什么作用通過有效的爬蟲手段批量采集數(shù)據(jù),可以降低人工成本,提高有效數(shù)據(jù)量,給予運營銷售的數(shù)據(jù)支撐,加快產(chǎn)品發(fā)展。因為信息是完全公開的,所以是合法的。 showImg(https://segmentfault.com/img/remote/1460000011359885?w=566&h=316);   什么是爬蟲? 網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛,如果把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么蜘蛛就是在...

    Towers 評論0 收藏0
  • 復(fù)仇者聯(lián)盟誰才是絕對 C 位?Python分析9萬條數(shù)據(jù)告訴答案

    摘要:數(shù)據(jù)庫文件已經(jīng)超過了了。復(fù)聯(lián)從開始便是漫威宇宙各路超級英雄的集結(jié),到現(xiàn)在的第部,更是全英雄的匯聚。所以,滅霸出現(xiàn)的次數(shù)居然高于了鋼鐵俠。情感分析,又稱為意見挖掘傾向性分析等。 showImg(https://segmentfault.com/img/remote/1460000019095022); 作者 | 羅昭成責編 | 唐小引 《復(fù)聯(lián) 4》國內(nèi)上映第十天,程序員的江湖里開始流傳這...

    shiweifu 評論0 收藏0
  • Python列表和Dictionary簡介

    摘要:如果沒有,請記住列表中的第一項是項。通過練習(xí),您將更好地計算列表中的項目。例如,要將項添加到我們的水果列表中,我們可以使用名為的方法。通過這樣做,該項目的值也將被刪除。在中,這意味著使用以及名稱和要刪除的項目的名稱。 showImg(https://segmentfault.com/img/remote/1460000019177365?w=852&h=479); 來源 | 愿碼(C...

    dunizb 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<