我想在暗黑2战网战网中获得增加技能的符,如何...

Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计_暗黑破坏神2战网_词汇网
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
责任编辑:词汇网 发表时间: 11:11:39
这篇文章主要介绍了Python获取暗黑3战网前1000命位玩家的英雄技能统计的方法,借助urllib2模块以类似爬虫的机制来实现,需要的朋友可以参考下 说实在的个人对游戏并没有多大的兴趣,但唯独对暴雪的Diablo系列很有感情,去年年初开始玩Diablo3,断断续续,感觉最麻烦的是选择技能,每次版本更新可能都有更优的build,这对于我这样的业余玩家来说可不是件好事,好在宏伟秘境后有了天梯,借鉴排名在前的高级玩家们build总没错,于是花了点时间写了这个脚本。脚本只是统计了主动技能、被动技能和传奇宝石的使用情况,理论上统计其它如装备等信息也是一样简单可行的,但Diablo装备的生成机制使得统计这个没有多大意义,相同的装备属性可能各有优劣,难以比较,而且某些装备坑爹的掉率也不是你想要就能有的。题外话,不得不说Python太适合写这类功能相对简单的脚本了,一个字:快。# -*- coding: utf-8 -*-"""Diablo3 排名前1000玩家英雄使用技能统计python diablo.py helppython 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_importimport osimport sysimport urllib2import jsonimport 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("\r{:30}".format(" "))
sys.stdout.write("\r{}".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
req = urllib2.urlopen(url.encode("utf8"), timeout=10)
return json.load(req) if is_json else req.read()
except KeyboardInterrupt, e:
except Exception, e:
retry -= 1
# print("retry", retry, e)
# raise edef _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 urldef 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"
url_part += _hero_class
return os.path.join(_rank_page, "era", era, url_part)def fetch_rank_list():
_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:
tags.append(item.split("/")[-2])
except Exception, e:
print("fetch rank list fail. {}".format(_rank_page))
return tagsdef 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:
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:
slug = rune.get("slug")
if slug in _active_skills[skill_slug]["rune"]:
_active_skills[skill_slug]["rune"][slug]["count"] += 1
_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:
if slug in _active_skills:
_active_skills[slug]["count"] += 1
_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:
if slug in _passive_skills:
_passive_skills[slug]["count"] += 1
_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:
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_:
if id_ in _unique_gems:
_unique_gems[id_]["count"] += 1
_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
sys.exit("参数错误")
arg = sys.argv[1]
if arg == "help":
print_hc()
print("\nTips: 运行中可随时Ctrl+C终止以获得已统计的数据结果")
sys.exit()
elif arg not in _hero_classes:
print_hc()
sys.exit()
_hero_class = argdef main():
print("待分析的英雄类型:", _hero_classes[_hero_class])
hero_stated = 0
hero_stat_failed = 0
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:
hero = get_hero(tag)
if not hero:
raise Exception("no hero data")
stat(hero)
hero_stated += 1
_process(hero_stated, total)
except KeyboardInterrupt:
except Exception, e:
# print("Fail: ", tag, e, hero)
hero_stat_failed += 1
output(hero_stated, hero_stat_failed)if __name__ == "__main__":
上一集:没有了 下一集:
相关文章:&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索|  
|  
|  
|  
|  
只需一步,快速开始
查看: 1330|回复: 6
为什么我在游戏中显示名字是战网昵称???
主题帖子积分
超级玩家, 积分 963, 距离下一级还需 37 积分
超级玩家, 积分 963, 距离下一级还需 37 积分
求解释。。。。
主题帖子积分
游戏狂人, 积分 1771, 距离下一级还需 229 积分
游戏狂人, 积分 1771, 距离下一级还需 229 积分
设计是这样的,也是正常的,不然加好友要怎么加法,每次上线名字不一样哪知道是你
主题帖子积分
超级玩家, 积分 963, 距离下一级还需 37 积分
超级玩家, 积分 963, 距离下一级还需 37 积分
flycome 发表于
设计是这样的,也是正常的,不然加好友要怎么加法,每次上线名字不一样哪知道是你 ...
我i记得以前显示的是自己取的名字
主题帖子积分
黯然销魂曲一首~
游戏狂人, 积分 1238, 距离下一级还需 762 积分
游戏狂人, 积分 1238, 距离下一级还需 762 积分
我一兄弟的号奇怪的,和我显示正常,和另一个兄弟两人都相互显示真名……
主题帖子积分
游戏达人, 积分 3450, 距离下一级还需 50 积分
游戏达人, 积分 3450, 距离下一级还需 50 积分
本来就是这样滴哦,这就是d3和别的纯网游滴区别之一哦!!!
主题帖子积分
游戏狂人, 积分 1944, 距离下一级还需 56 积分
游戏狂人, 积分 1944, 距离下一级还需 56 积分
本来就是这样的。
主题帖子积分
游戏狂人, 积分 1355, 距离下一级还需 645 积分
游戏狂人, 积分 1355, 距离下一级还需 645 积分
这样挺好啊,方便你找人
3DM死忠专属勋章
Powered by暗黑1.09战网_暗黑1.13战网_暗黑2战网_暗黑破坏神2战网_CNBN暗黑2战网_暗黑战网中国粉丝站
热烈庆贺CNBN暗黑2战网玩家突破10万人!加油!
暗黑2战网QQ群: 暗黑3FANS站超级群
↑暗黑论坛↓
暗黑2 | 补丁
↑《暗黑破坏神》游戏·历史版本回顾 ↑
喜欢本站,请谢谢!暗黑2战网2015赛季火爆运营中!
所有内容由
整理制作, Copyright & 2009 版权所有

参考资料

 

随机推荐