LoLは普段はサポートでプレイしているのですが、最近成績が伸び悩んでおり、レーナーへの転向を模索するにあたって、チャンピオンのカウンターをサクッと調べられるプログラムを作成してみました。
参照元は「u.gg」です。
Contents
サンプルコード
使用言語はpython3、スクレイピング用ライブラリは、BeautifulSoupです。
冒頭の方で、関数「LoLCounterScraping(champion,role,rank)」を定義しており、英名のチャンピオン、ロール、ランクを指定することで、以下のデータを取得してきます。
- 一般的なカウンターチャンピオン
- 有利マッチアップ(+勝率)
- 不利マッチアップ(+勝率)
- データ取得時の日時(日本時間)
- パッチ名
普遍的なマッチアップを知ることが目的なので、地域は「Global」固定です。特定地域のメタには左右されないと思われます。
(なので、プロシーンのメタを知るためには不向きだと思われます。あくまで初心者向け、特定レート向けです。)
元のサーバーに負荷を掛けないために、待機時間を5秒取っています。(time.sleep(5))
ご利用は自己責任でお願い致します。
#u.ggから特定のチャンピオンのカウンターを取ってくるサンプルコード
#u.ggのURL規則 "https://u.gg/lol/champions/quinn/counter?rank=bronze&role=top"
#"ランクを指定する場合、"?rank=bronze"のように書く
#"ロールを指定する場合、"?role=top"のように書く
#両方指定する場合、どちらかに"?role=top&rank=bronze"のように書く
from bs4 import BeautifulSoup
from urllib.request import urlopen
import datetime
dt_now = datetime.datetime.now()
import time
#記入例
#champion = "aatrox"
#role = "top"
#rank = "bronze"
def LoLCounterScraping(champion,role,rank):
previous_url = "https://u.gg/lol/champions/"
back_url = "/counter?rank=" + str(rank) + "&role=" + str(role)
url = urlopen(previous_url + str(champion) + back_url)
#HTMLを取得
data = url.read()
html = data.decode('utf-8')
# HTMLを解析
soup = BeautifulSoup(html, 'html.parser')
#待機時間
time.sleep(5)
#-----------------------------------------------------------------
#パッチを取得する
patchInformation = soup.find_all("span", class_="Select-value-label")
p = str(patchInformation[0])
#-----------------------------------------------------------------
print(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))
print("Patch:" + p[33:-7])
print("Rank:" + str(rank))
print("Role:" + str(role))
print("========== " + champion + "'s Counter Champions ==========")
#レーン戦で有利なチャンピオン達を抽出する--------------------------
# 解析したHTMLから任意の部分のみを抽出
matchups = soup.find_all("div", class_="counters-list gold-diff")
#得たHTML情報を、リストで管理するため、まずは文字列型に変更する
s = str(matchups[0])
s_list = s.split("<div class=\"champion-name\">")
N = int(len(s_list))
counterChampions = ""
for i in range(N):
name = list()
if(i != 0):
var = str(s_list[i])
var = var[0:20]
name = var.split("</div>")
counterChampions += name[0] + ","
print(counterChampions)
#-----------------------------------------------------------------
print("========== These champions are STRONG against " + champion + " ==========")
#試合で有利なチャンピオン達を抽出する--------------------------
# 解析したHTMLから任意の部分のみを抽出
bestWinRate = soup.find_all("div", class_="counters-list best-win-rate")
#得たHTML情報を、リストで管理するため、まずは文字列型に変更する
s = str(bestWinRate[0])
s_list = s.split("<div class=\"col-2\"><div class=\"champion-name\">")
t_list = s.split("</div><div class=\"col-3\"><div class=\"win-rate\">")
N = int(len(s_list))
#チャンピオンの文字数に応じて、タブの数を管理する
numOfTabs = ""
for i in range(N):
if(i != 0):
var = str(s_list[i])
championName = var[0:20]
championName = var.split("</div>")
strongChampion = championName[0]
var = str(t_list[i])
winRate = var[0:20]
winRate = var.split("</div>")
strongChampionWinRate = winRate[0]
if(len(strongChampion) >= 11):
numOfTabs = ""
elif(len(strongChampion) <= 3):
numOfTabs = "\t\t"
else:
numOfTabs = "\t"
print(strongChampion + ", " + numOfTabs + strongChampionWinRate)
#-----------------------------------------------------------------
print("========== These champions are WEAK against " + champion + " ==========")
#試合で不利なチャンピオン達を抽出する--------------------------
# 解析したHTMLから任意の部分のみを抽出
worstWinRate= soup.find_all("div", class_="counters-list worst-win-rate")
#得たHTML情報を、リストで管理するため、まずは文字列型に変更する
s = str(worstWinRate[0])
s_list = s.split("<div class=\"col-2\"><div class=\"champion-name\">")
t_list = s.split("</div><div class=\"col-3\"><div class=\"win-rate\">")
N = int(len(s_list))
for i in range(N):
if(i != 0):
var = str(s_list[i])
championName = var[0:20]
championName = var.split("</div>")
weakChampion = championName[0]
var = str(t_list[i])
winRate = var[0:20]
winRate = var.split("</div>")
weakChampionWinRate = winRate[0]
if(len(weakChampion) >= 11):
numOfTabs = ""
elif(len(weakChampion) <= 3):
numOfTabs = "\t\t"
else:
numOfTabs = "\t"
print(weakChampion + ", " + numOfTabs + weakChampionWinRate)
print("******************************************************************")
実行結果
例:ブロンズ帯の、Topにおける「オーン」のマッチアップを調べたい場合(実行環境は、「Anaconda」)
まとめ
以上、個人利用のために苦心して作ったプログラムの紹介でした。余力や要望があったら、日本語化しても良いかもしれません。
筆者は、シーズン12(2022年)からLoLのランクに飛び込んだのですが、まだアイアン抜けられません💦
ひとまず、Worlds2022の開幕を楽しみにしています。DFMファイティン!