League of Legends ゲーム ブログ

League of Legendsのカウンター取得アプリを作成してみた

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ファイティン!

-League of Legends, ゲーム, ブログ
-,