見出し画像

ダビマスにおける非凡・特化非凡の抽出方法


ダビマスの非凡・才能を探す際の問題

ダビマスは過去作(ダビスタ)と違い、生産馬に非凡や調教師才能を付けることが出来る。この非凡や才能は様々なバフ効果があり、特に公式開催レース(通称公式BC)で勝つためには、どの非凡を選択するか、どの才能を付けるかが非常に重要になってる。

のであるが、現時点(2024/06/09)で非凡の数は200個以上、調教師才能の数はなんと1577個(!?)。数が多いだけでなく、非凡も才能も効果が発揮できる競馬場、天候、馬場条件などが様々で、公式レース条件が出ても、どの非凡・才能が発揮するのか、全部把握できている人は正直いないと思われる。

で、これらの非凡・才能は、公式のダビマス全書にデータベース化されており、そこで条件を絞ることで必要な非凡・才能を抽出することが出来る。
…のであるが、これがとにかく使い辛いと評判が悪い。そして、残念ながらダビマスには非公式のwikiなど攻略サイトが無いので、あるレース条件で発揮する非凡をぱっと見で一覧する方法が無いという問題がある。

そこで、このデータベースをスクレイピングして、公式条件に合致する非凡や才能を抽出し、発揮する非凡を見やすくする方法をここで紹介する。

※なお、調教師才能はとある方が開発中のようなので、ここでは非凡の抽出方法を紹介する。

なお、スクレイピングはサーバーに負荷がかかるので、無茶な使い方をしないように注意してください。また、本コードの利用による責任は負いませんので自己責任でご使用ください。
(運営に怒られたら本記事は消します)

必要なもの・必要な知識

ダビマス全書からデータを抽出するために、以下の準備が必要である。

・Pythonまたはjupyter notebook
・Chromeブラウザ
・各種ライブラリ(pandas、numpy、selenium等)
・chrome driver

非凡・才能を抽出するためにはpythonが実行できる環境が必要である。私はプログラミング初心者に優しいjupyter notebookを使っているが、pythonの知識がない人はこちらがお勧め。本記事で紹介するコードもjupyter上で動作することを確認しているので、jupyterなら多分動くはず。python使える人は、まあ自分で動かせるでしょう。(google colabは使ったことないので、使えるかはわかりません)

Pythonやjupyterの導入方法や、ライブラリのインストール方法は各自調べてください。

コードと使い方

というわけで、特化非凡を抽出(スクレイピング)するコードを。
実行させると、chromeブラウザが自動的に立ち上がり、chrome driverを自動的にインストールしに行く
…はずなのだが、これがうまく動かない場合が多い。ので、chromeのバージョンとchrome driverのバージョンが同じになるように手動でドライバーを更新してください。ドライバーとchromeのバージョンが違うと動かないので注意(n敗)

だいたい月1で動かすと、大抵chromeのバージョンがアップデートされていて動かないことが多いです。

非凡抽出コード

というわけで、以下を実行させると抽出できるのですが、いくつか設定しないといけない箇所があるので、それを下で説明します。

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#chrome driver自動更新用に色々試行錯誤した結果、現時点では不要なものも多いかも

#import chromedriver_binary
from selenium.webdriver.chrome.options import Options # オプションを使うために必要

from time import sleep
import requests
import csv
import pandas as pd
import numpy as np
import warnings
import math

warnings.filterwarnings('ignore') #警告無視

##ヘッドレスモードでブラウザを起動
#options = Options()
#options.add_argument('--headless')


#chrome driver 自動インストール...のはずだがうまく動かない場合が多いので手動で更新してください
#chrome driverの置き場は以下URL(2024/06/09時点)
#https://googlechromelabs.github.io/chrome-for-testing/#stable

driver = webdriver.Chrome()


driver.get('https://dabimas.jp/kouryaku/abilities/')

#自動で実行させたくない場合、以下。chrome driverとchromeのバージョンが一致している必要あり
#driver = webdriver.Chrome('パスを記載/chromedriver.exe')

WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)

#更に絞り込むクリック
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[2]").click();


#表示されるまで時間待機
WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)

#レース選択
element = driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/select")
Select(element).select_by_value("6557031492") # ←レースのvalueの値をここに入れる

# <option value="5854123610">フェブラリーステークス</option>
# <option value="8214958362">高松宮記念</option>
# <option value="0264175318">アルクォズスプリント</option>
# <option value="3614530287">ドバイターフ</option>
# <option value="3452701876">ドバイシーマクラシック</option>
# <option value="8407065213">ドバイゴールデンシャヒーン</option>
# <option value="6587031462">ドバイワールドカップ</option>
# <option value="1804725356">大阪杯</option>
# <option value="3452921386">桜花賞</option>
# <option value="2264185315">皐月賞</option>
# <option value="2214957369">クイーンエリザベス2世カップ</option>
# <option value="1364823356">天皇賞(春)</option>
# <option value="2315498266">NHKマイルカップ</option>
# <option value="5612364288">ヴィクトリアマイル</option>
# <option value="6558631422">オークス</option>
# <option value="6315458266">日本ダービー</option>
# <option value="6315468265">安田記念</option>
# <option value="2865141533">宝塚記念</option>
# <option value="0614539227">帝王賞</option>
# <option value="4217621593">ジャパンダートダービー</option>
# <option value="4218691513">スプリンターズステークス</option>
# <option value="6548831412">凱旋門賞</option>
# <option value="1384821356">秋華賞</option>
# <option value="4962561838">菊花賞</option>
# <option value="6315438268">天皇賞(秋)</option>
# <option value="7467539712">エリザベス女王杯</option>
# <option value="6547731432">マイルチャンピオンシップ</option>
# <option value="7265243177">ジャパンカップ</option>
# <option value="4217693503">チャンピオンズカップ</option>
# <option value="6407265213">阪神ジュベナイルフィリーズ</option>
# <option value="7765243190">香港スプリント</option>
# <option value="6507931452">香港マイル</option>
# <option value="2614539207">香港カップ</option>
# <option value="5912364078">香港ヴァーズ</option>
# <option value="4217675503">朝日杯フューチュリティステークス</option>
# <option value="7865243108">ホープフルステークス</option>
# <option value="6557031492">有馬記念</option>
#<option value="5912364276">東京大賞典</option></select>


#表示されるまで時間待機
WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)


##天候##
#レース条件を選択。条件の行だけコメントアウト(#)を外す。「条件なし」は常時チェックする

#晴れ
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[1]/input").click();

#曇り
#driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[2]/input").click();

#雨
#driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[3]/input").click();

#雪
#driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[4]/input").click();

#条件なし
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[5]/input").click();


##馬場条件##
#レース条件を選択。条件の行だけコメントアウト(#)を外す。「条件なし」は常時チェックする

#良
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[6]/input").click();

#稍重
#driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[7]/input").click();

#重
#driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[8]/input").click();

#不良
#driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[9]/input").click();

#条件なし
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[10]/input").click();


#レース条件
#BC条件のみ
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[12]/input").click();

#レース種別なし
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[14]/input").click();


kyakushitsu = ['逃げ', '先行', '差し', '追込', '自在']

xpath = ["/html/body/div[1]/div[4]/div/aside/div/div/label[5]/input", "/html/body/div[1]/div[4]/div/aside/div/div/label[6]/input", "/html/body/div[1]/div[4]/div/aside/div/div/label[7]/input", "/html/body/div[1]/div[4]/div/aside/div/div/label[8]/input", "/html/body/div[1]/div[4]/div/aside/div/div/label[10]/input"]

df = pd.DataFrame(columns=kyakushitsu, index = range(550))#抽出する脚質の最大データ数。これを超える場合適宜増やすこと


#### 非凡抽出 ######

#非凡な才能
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/label[2]/input").click();

#特化非凡
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/label[3]/input").click();

for n, name in enumerate(kyakushitsu):
    driver.find_element(By.XPATH,xpath[n]).click();
    #表示されるまで時間待機
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)
    
    #抽出
    #非凡の抽出
    uma = driver.find_elements(By.XPATH,"//*[@class='title_panel ability_index']/div/div/p/a")
    
    for i in range(len(uma)):
        uma[i] = (uma[i].text)
    
    uma = list(filter(None, uma))
    uma = sorted(uma)
    df[name] = pd.DataFrame(uma)
    
    driver.find_element(By.XPATH,xpath[n]).click();
    
    #表示されるまで時間待機
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)

df = df.dropna(how='all')
df = df.fillna('')

pd.set_option('display.max_rows', None)
print('非凡')
display(df)

#非凡な才能
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/label[2]/input").click();

#特化非凡
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/label[3]/input").click();


#### 特化非凡抽出 ######

df_tokka = pd.DataFrame(columns=kyakushitsu, index = range(15))

#特化非凡
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/label[3]/input").click();

#特化非凡のみ
driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/label[4]/input").click();

for n, name in enumerate(kyakushitsu):
    driver.find_element(By.XPATH,xpath[n]).click();
    #表示されるまで時間待機
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)
    
    #抽出
    #非凡の抽出
    uma = driver.find_elements(By.XPATH,"//*[@class='title_panel ability_index']/div/div/p/a")
    
    for i in range(len(uma)):
        uma[i] = (uma[i].text)
        
    uma = list(filter(None, uma))
        
    if uma != []:   
        uma = sorted(uma)
        df_tokka[name] = pd.DataFrame(uma)
        
    else:
        df_tokka[name] = np.nan
            
    
    driver.find_element(By.XPATH,xpath[n]).click();
    
    #表示されるまで時間待機
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)

df_tokka = df_tokka.dropna(how='all')
df_tokka = df_tokka.fillna('')

pd.set_option('display.max_rows', None)
print('特化非凡')
display(df_tokka)

各自で設定する場所

抽出したいレース条件をこの下にあるレースに割り当てられているvalueの値に変える。コード上に入っている「6557031492」は有馬記念なので、例えば大阪杯条件にしたい場合、「1804725356」を入れる

#レース選択
element = driver.find_element(By.XPATH,"/html/body/div[1]/div[4]/div/aside/div/div/select")
Select(element).select_by_value("6557031492") # ←レースのvalueの値をここに入れる

次にレース条件の天候を選択する。ここでは「晴れ」「条件なし」の条件で抽出している。曇りにしたい場合は、晴れをコメントアウトして(#を付ける)、曇りに付いている「#」を外す。
なお、「条件なし」は基本チェックしたまま。そうしないと、条件縛りが無い才能が抽出から漏れることになるので注意

##天候##
#レース条件を選択。条件の行だけコメントアウト(#)を外す

#晴れ
driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[1]/input").click();

#曇り
#driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[2]/input").click();

#雨
#driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[3]/input").click();

#雪
#driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[4]/input").click();

#条件なし
driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[5]/input").click();

続いて馬場条件。やり方は天候と同じ。

##馬場条件##
#レース条件を選択。条件の行だけコメントアウト(#)を外す

#良
driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[6]/input").click();

#稍重
#driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[7]/input").click();

#重
#driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[8]/input").click();

#不良
#driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[9]/input").click();

#条件なし
driver.find_element_by_xpath("/html/body/div[1]/div[4]/div/aside/div/div/div[3]/label[10]/input").click();

実行すると、レース条件に合った非凡の一覧と、特化非凡の一覧がそれぞれ表示される。あとはお好きにお使いください。

抽出された非凡一覧
特化非凡は別途抽出・表示される

あとがき

自分自身、プログラミングは初心者なので、webを調べながらコードを組みました。ので、本業のプログラマーからすればかなりイケてないコードかとは思いますが、動けばいいやの精神で使っていました。正直、動かない場合のサポートが出来る程の知識が無いのと、筆者は現時点でダビマスから距離を置いているため、サポートは無し、かつ自己責任の元、お使いください。

皆様の良いダビマスライフの一助になることを願っています。

この記事が気に入ったらサポートをしてみませんか?