<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Python獲取暗黑破壞神3戰網前1000命位玩家的英雄技能統計

        來源:懂視網 責編:小采 時間:2020-11-27 14:29:05
        文檔

        Python獲取暗黑破壞神3戰網前1000命位玩家的英雄技能統計

        Python獲取暗黑破壞神3戰網前1000命位玩家的英雄技能統計:說實在的個人對游戲并沒有多大的興趣,但唯獨對暴雪的Diablo系列很有感情,去年年初開始玩Diablo3,斷斷續續,感覺最麻煩的是選擇技能,每次版本更新可能都有更優的build,這對于我這樣的業余玩家來說可不是件好事,好在宏偉秘境后有了天梯,借鑒排名在前的高
        推薦度:
        導讀Python獲取暗黑破壞神3戰網前1000命位玩家的英雄技能統計:說實在的個人對游戲并沒有多大的興趣,但唯獨對暴雪的Diablo系列很有感情,去年年初開始玩Diablo3,斷斷續續,感覺最麻煩的是選擇技能,每次版本更新可能都有更優的build,這對于我這樣的業余玩家來說可不是件好事,好在宏偉秘境后有了天梯,借鑒排名在前的高
        說實在的個人對游戲并沒有多大的興趣,但唯獨對暴雪的Diablo系列很有感情,去年年初開始玩Diablo3,斷斷續續,感覺最麻煩的是選擇技能,每次版本更新可能都有更優的build,這對于我這樣的業余玩家來說可不是件好事,好在宏偉秘境后有了天梯,借鑒排名在前的高級玩家們build總沒錯,于是花了點時間寫了這個腳本。

        腳本只是統計了主動技能、被動技能和傳奇寶石的使用情況,理論上統計其它如裝備等信息也是一樣簡單可行的,但Diablo裝備的生成機制使得統計這個沒有多大意義,相同的裝備屬性可能各有優劣,難以比較,而且某些裝備坑爹的掉率也不是你想要就能有的。

        題外話,不得不說Python太適合寫這類功能相對簡單的腳本了,一個字:快。

        # -*- coding: utf-8 -*-
        """
        Diablo3 排名前1000玩家英雄使用技能統計
        
        python diablo.py help
        python diablo.py [barbarian|crusader|demon-hunter|monk'|witch-doctor|wizard]
        
        默認使用的是亞服的數據,如果需要美服或歐服,更改`_rank_page`和`_api`變量地址即可
        
        Copyright (c) 2015 JinnLynn 
        Released under the terms of the MIT license.
        """
        from __future__ import unicode_literals, print_function, absolute_import
        import os
        import sys
        import urllib2
        import json
        import re
        
        __version__ = '1.0.0'
        __author__ = 'JinnLynn '
        __license__ = 'The MIT License'
        __copyright__ = 'Copyright 2015 JinnLynn'
        
        # 排名頁面
        _rank_page = 'http://tw.battle.net/d3/zh/rankings/'
        # api
        _api = 'http://tw.battle.net/api/d3/'
        _api_profile = os.path.join(_api, 'profile')
        _api_data = os.path.join(_api, 'data')
        
        _hero_classes = {
         'barbarian': '野蠻人', 'crusader': '聖教軍', 'demon-hunter': '狩魔獵人',
         'monk': '武僧', 'witch-doctor': '巫醫', 'wizard': '秘術師'}
        
        _retry = 5
        
        _hero_class = ''
        _active_skills = {}
        _passive_skills = {}
        _unique_gems = {}
        
        
        def _clear_output(msg=''):
         sys.stdout.write('
        {:30}'.format(' '))
         sys.stdout.write('
        {}'.format(msg))
         sys.stdout.flush()
        
        
        def _process(stated, total):
         msg = '英雄數據分析中... {}/{}'.format(stated, total)
         _clear_output(msg)
        
        
        def _get(url, is_json=True):
         # print('GET: ', url)
         retry = 5 if _retry < 1 else _retry
         while retry > 0:
         try:
         req = urllib2.urlopen(url.encode('utf8'), timeout=10)
         return json.load(req) if is_json else req.read()
         except KeyboardInterrupt, e:
         raise e
         except Exception, e:
         retry -= 1
         # print('retry', retry, e)
         # raise e
        
        
        def _api_url(*args, **kwargs):
         slash = kwargs.get('slash', False)
         args = [unicode(arg) for arg in args]
         url = os.path.join(*args).rstrip('/')
         return url + '/' if slash else url
        
        
        def get_era():
         req = urllib2.urlopen(_rank_page)
         return req.geturl().split('/')[-2]
        
        
        def get_rank_page_url(era):
         url_part = 'rift-'
         if _hero_class == 'demon-hunter':
         url_part += 'dh'
         elif _hero_class == 'witch-doctor':
         url_part += 'wd'
         else:
         url_part += _hero_class
         return os.path.join(_rank_page, 'era', era, url_part)
        
        
        def fetch_rank_list():
         tags = []
         try:
         _clear_output('獲取當前游戲紀元...')
         era = get_era()
         _clear_output('獲取當前排名前1000的玩家...')
         url = get_rank_page_url(era)
         html = _get(url, is_json=False)
         # re parse
         lst = re.findall(
         r"a href="(.*)" title=.*class="icon-profile link-first">",
         html.decode('utf8'),
         re.UNICODE)
         # BeautifulSoup parse
         # import bs4
         # soup = bs4.BeautifulSoup(html)
         # lst = soup.select('#ladders-table tbody tr .battletag a')['href']
         for item in lst:
         try:
         tags.append(item.split('/')[-2])
         except:
         pass
         except Exception, e:
         print('fetch rank list fail. {}'.format(_rank_page))
         raise e
         return tags
        
        
        def get_hero(player_tag):
         url = _api_url(_api_profile, player_tag, slash=True)
         data = _get(url)
         hero_selected = None
         for hero in data.get('heroes', []):
         if hero['class'] != _hero_class:
         continue
         last_updated = hero_selected['last-updated']
         # 最近使用的英雄
         if hero_selected is None or last_updated < hero['last-updated']:
         hero_selected = hero
         if not hero_selected:
         raise Exception('{} hero missing.'.format(player_tag))
         url = _api_url(_api_profile, player_tag, 'hero', hero_selected['id'])
         return _get(url)
        
        
        # 主動技能符文
        def stat_active_skill_rune(skill_slug, rune):
         global _active_skills
         if not rune:
         return
         slug = rune.get('slug')
         if slug in _active_skills[skill_slug]['rune']:
         _active_skills[skill_slug]['rune'][slug]['count'] += 1
         else:
         _active_skills[skill_slug]['rune'][slug] = {
         'count': 1,
         'name': rune.get('name')
         }
        
        
        # 主動技能
        def stat_active_skill(active):
         global _active_skills
         slug = active.get('skill', {}).get('slug')
         # d3 API 返回的數據中可能存在空的數據
         if not slug:
         return
         if slug in _active_skills:
         _active_skills[slug]['count'] += 1
         else:
         _active_skills[slug] = {
         'count': 1,
         'name': active.get('skill').get('name'),
         'rune': {}
         }
         stat_active_skill_rune(slug, active.get('rune'))
        
        
        # 被動技能
        def stat_passive_skill(passive):
         global _passive_skills
         slug = passive.get('skill', {}).get('slug')
         # d3 API 返回的數據中可能存在空的數據
         if not slug:
         return
         if slug in _passive_skills:
         _passive_skills[slug]['count'] += 1
         else:
         _passive_skills[slug] = {
         'count': 1,
         'name': passive.get('skill').get('name')
         }
        
        
        def stat_unique_gem(items):
         global _unique_gems
        
         def get_gem(tooltip):
         if not tooltip:
         return None, None
         url = _api_url(_api_data, tooltip)
         data = _get(url)
         gems = data.get('gems')
         if not gems:
         return None, None
         gem = gems[0].get('item', {})
         return gem.get('id'), gem.get('name')
        
         if not items:
         return
        
         lst = [items.get(s, {}) for s in ['leftFinger', 'rightFinger', 'neck']]
         for tooltip in [d.get('tooltipParams', None) for d in lst]:
         id_, name = get_gem(tooltip)
         if not id_:
         continue
         if id_ in _unique_gems:
         _unique_gems[id_]['count'] += 1
         else:
         _unique_gems[id_] = {
         'count': 1,
         'name': name
         }
        
        
        def stat(hero):
         global _active_skills, _passive_skills
        
         map(stat_active_skill, hero.get('skills', {}).get('active', []))
         map(stat_passive_skill, hero.get('skills', {}).get('passive', []))
        
         items = hero.get('items', {})
         stat_unique_gem(items)
        
        
        def output(hero_stated, hero_stat_failed):
         def sort(data, count=10):
         d = sorted(data.items(), key=lambda d: d[1]['count'], reverse=True)
         return d if count <= 0 else d[0:count]
        
         _clear_output()
        
         # print('======')
         # print(hero_stated, hero_stat_failed)
         # print('======')
         # pprint(_active_skills)
         # print('======')
         # pprint(_passive_skills)
         # print('======')
         # pprint(_unique_gems)
         # pprint(_active_skills.items())
         # print('======')
        
         print('
        === RESULT ===
        ')
         print('統計英雄數
        ')
         print(' 成功: {} 失敗: {}
        '.format(hero_stated, hero_stat_failed))
        
         print('主動技能使用排名: ')
         for _, d in sort(_active_skills):
         runes = []
         for _, r in sort(d.get('rune', {})):
         runes.append('{name}[{count}]'.format(**r))
         d.update({'rune_rank': ', '.join(runes)})
         print(' {name}[{count}]: {rune_rank}'.format(**d))
         print()
        
         print('被動技能使用排名: ')
         for _, d in sort(_passive_skills):
         print(' {name}[{count}]'.format(**d))
         print()
        
         print('傳奇寶石使用排名: ')
         for _, d in sort(_unique_gems):
         print(' {name}[{count}]'.format(**d))
         print()
        
        
        def prepare():
         global _hero_class
        
         def print_hc():
         print('僅支持以下英雄類型, 默認 demon-hunter:
        ')
         for c, n in _hero_classes.items():
         print(c, ':', n)
        
         if len(sys.argv) == 1:
         _hero_class = 'demon-hunter'
         elif len(sys.argv) > 2:
         sys.exit('參數錯誤')
         else:
         arg = sys.argv[1]
         if arg == 'help':
         print_hc()
         print('
        Tips: 運行中可隨時Ctrl+C終止以獲得已統計的數據結果')
         sys.exit()
         elif arg not in _hero_classes:
         print_hc()
         sys.exit()
         else:
         _hero_class = arg
        
        
        def main():
         prepare()
         print('待分析的英雄類型:', _hero_classes[_hero_class])
        
         hero_stated = 0
         hero_stat_failed = 0
         try:
         tags = fetch_rank_list()
         if not tags:
         raise Exception('parse battle.net rank page fail.')
         except Exception, e:
         print('error,', e)
         sys.exit()
        
         total = len(tags)
        
         for tag in tags:
         try:
         hero = get_hero(tag)
         if not hero:
         raise Exception('no hero data')
         stat(hero)
         hero_stated += 1
         _process(hero_stated, total)
         except KeyboardInterrupt:
         break
         except Exception, e:
         # print('Fail: ', tag, e, hero)
         hero_stat_failed += 1
        
         output(hero_stated, hero_stat_failed)
        
        
        if __name__ == '__main__':
         main()
        

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Python獲取暗黑破壞神3戰網前1000命位玩家的英雄技能統計

        Python獲取暗黑破壞神3戰網前1000命位玩家的英雄技能統計:說實在的個人對游戲并沒有多大的興趣,但唯獨對暴雪的Diablo系列很有感情,去年年初開始玩Diablo3,斷斷續續,感覺最麻煩的是選擇技能,每次版本更新可能都有更優的build,這對于我這樣的業余玩家來說可不是件好事,好在宏偉秘境后有了天梯,借鑒排名在前的高
        推薦度:
        標簽: 游戲 統計 戰網
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产a不卡片精品免费观看| 日本免费xxxx| 免费国产真实迷j在线观看| 亚洲国产精品无码观看久久| 免费无码黄十八禁网站在线观看| 亚洲理论片在线观看| 精品国产无限资源免费观看| 亚洲欧洲日产国产最新| 日本免费网站视频www区| 亚洲中文字幕无码爆乳app| 日韩免费高清视频| 久久久久久亚洲av无码蜜芽| 国产免费人视频在线观看免费| 日韩国产欧美亚洲v片| 亚洲成A∨人片天堂网无码| 中文字幕a∨在线乱码免费看 | 在线免费观看a级片| 日韩色日韩视频亚洲网站| 免费大黄网站在线看| 一级毛片免费观看不收费| 亚洲AV永久青草无码精品| 91高清免费国产自产| 亚洲国产精品美女久久久久| 国产一级淫片免费播放| 国产福利在线观看永久免费| 亚洲ⅴ国产v天堂a无码二区| 国产成人精品久久免费动漫| 亚洲AV无码专区在线观看成人| 亚洲黄黄黄网站在线观看| 无码免费一区二区三区免费播放| 亚洲制服在线观看| 伊在人亚洲香蕉精品区麻豆| 成全高清在线观看免费| 亚洲一区二区三区无码国产| 亚洲国产天堂久久久久久| 免费无码一区二区三区| 亚洲色www永久网站| 国产亚洲av人片在线观看| 永久免费AV无码国产网站 | 中文字幕在线免费视频| 亚洲男人的天堂在线|