Pythonでオートレースの予想AIを作るシリーズを始めたのですが、まずはAIに勉強させるためのデータを集めなくてはいけません。
そこで、ネットスタジアムから過去レース結果を取得していくのですが、過去レース結果のリンク先アドレスの一覧を取得する必要があります。
今回はとりあえず2020年に開催されたレース結果のリンク先をPythonで取得していきたいと思います。
この記事では「セレニウム」と「クロームドライバ」を使ってブラウザをコントロールし、自動でデータを取得する方法を解説しています。
こちらの動画でも紹介していますので、ぜひ参照してみてください。
ネットスタジアムの過去レース結果検索の使い方
ネットスタジアムの「過去レース結果検索」では期間指定することで過去に開催されたレース結果の一覧が表示されますが、1度に100件までしか表示できません。
その為、1か月から2ヵ月ごとに区切って表示させる必要があります。
これを手動でやっていると、過去のレース結果を全部取得しようとした場合、2006年からのデータがあるので15年分あります。
それを1か月ずつ指定していくのはメチャメチャ大変です。
そこで、ブラウザを制御して期間を入力する操作を自動で行いたいと思います。
Pythonでは「セレニウム」と「クロームドライバ」を使用することで、これが実現できます。
セレニウム(Selenium)のインストール
セレニウムはWebブラウザを使ってWebアプリケーションをテストするツールです。
マウスやキーボードを使ってWebブラウザを操作する代わりに、セレニウムがWebブラウザを自動で操作してくれるようになります。
インストールはJupyter環境で「pip コマンド」を入力するだけでOK。
pip install selenium
Jupyterの使い方などはこちらでも解説しています。
-
-
【簡単解説】PythonのインストールからJupyterでの動作確認方法
「Pythonを始めてみたい」 と考えている方の為に、 Pythonの紹介と共に、 開発環境の構築から動作確認までを体験できるように まとめてみました。 動画でも解説してますので、 参考にしてみてくだ ...
続きを見る
クロームドライバのダウンロード
セレニウムを使ってブラウザを制御するには、使用しているブラウザ合ったドライバをダウンロードする必要があります。
ここではクロームブラウザを使用する場合について解説しています。
クロームドライバはブラウザのバージョン毎に用意されているので、まずはブラウザのバージョンを確認します。
ブラウザ右上の「Google Chromeの設定」を開きます。
(点が縦に3つ並んでいるアイコンですね)
そこから「ヘルプ」→「Google Chrome について」を選択します。
左側の2桁を確認してください。私の場合は「89」ですね。
クロームドライバのダウンロードページを開いて、先ほど確認したバージョンのファイルをダウンロードします。
※ダウンロードしたら、解凍してCドライブの直下へ移動してください。
セレニウムの動作確認
セレニウムのインストールとクロームドライバのダウンロードが完了したら、さっそく動作確認してみましょう。
Jupyterで下記のコードを実行すると、新しくブラウザが開き、「過去レース結果検索」のページが開きます。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.select import Select
import time
from tqdm.notebook import tqdm
driver = webdriver.Chrome(executable_path="C:\chromedriver.exe")
driver.get('https://autorace.jp/netstadium/SearchRace')
セレニウムを使ってセレクトボックスを操作する方法
過去レース結果検索の期間入力はセレクトボックスで選択する形式になっています。
入力したいセレクトボックスの要素を、表示されている画面上から見つける必要があります。
要素を見つけるにはまず、右クリックメニューから「検証」を選択します。
すると、右側にhtmlのソースコードが表示されるので、そこから目的の要素を見つけ出します。
このあたりの操作は動画の方が分かりやすいかと思います。
開始年のセレクトボックスには「id」が付与されているので、これを使って操作していきます。
その他のセレクトボックスの「id」も調べてみると次のようになっています。
開始年:search_race_date_from_year
開始月:search_race_date_from_month
開始日:search_race_date_from_day
終了年:search_race_date_to_year
終了月:search_race_date_to_month
終了日:search_race_date_to_day
jupyterで下記を追記して実行すると、先ほどと同じように新しいブラウザが開き、自動で開始年が「2020」年に選択されます。
from_year = driver.find_element_by_id('search_race_date_from_year')
select = Select(from_year)
select.select_by_index(14)
最後の行の「14」はインデックスで、「0」が「2006」年に対応しているので、14番目を指定すると「2020」年が選択されることになります。
同じようにその他のセレクトボックスについても記述していくと、任意の期間を自動で指定することができるようになります。
セレニウムを使ってボタンをクリックする方法
期間が入力できたら最後に「検索」ボタンをクリックする必要があります。
この検索ボタンの要素もセレクトボックスと同じように探し出します。
「input」という要素に「Sumit」という名前が割り当てられているので、これを使って操作していきます。
jupyterで下記の内容を追記することで、新しいブラウザが開く→期間を入力する→検索ボタンを押す という操作が自動で実行されます。
buttons = driver.find_element_by_name('Submit')
buttons.click()
hrefリンクを取得する方法
例えば、期間を2020年1月1日~2020年1月31日に指定して検索ボタンを押すと下記の画面が開きます。
赤枠部分がレース結果を表示するリンクになっています。
このリンクを順番に取得していければ完成です。
今までと同じようにリンクの要素を探してみます。
下図が「2020年01月02日」部分の要素になります。
これの見方としては、「tr」というタグの中に「th」と「td」のタグが含まれていて、その「td」タグの中に「a」タグが含まれています。「a」タグの「href」要素を取り出してあげればOKです。
まず、「tr」タグが「td_yellow」というクラス名になっているので、このキーワードで抽出していきます。
会場毎に黄色と白色に分かれていて、白の方は「td_white_center」というクラス名になっていました。
jupyterで下記の内容を追記して実行してみましょう。
まず、「td_yellow」をキーワードに「tr」を取得します。
次に、「tr」の中に含まれている「td」タグを「for文」で1つずつ取り出し、その中から「a」タグ要素を抽出します。
最後に「a」タグの中の「href属性」を取り出して、最初に定義した「href_list」に取り込んでいくという流れになっています。
白枠の方も「td_white_center」をキーワードすれば同様にhrefリンクを抽出することができます。
href_list = []
elements = driver.find_elements_by_class_name('td_yellow')
for td in elements:
aTag = td.find_element_by_tag_name('a')
href_list.append(str(aTag.get_attribute('href')))
elements = driver.find_elements_by_class_name('td_white_center')
for td in elements:
aTag = td.find_element_by_tag_name('a')
href_list.append(str(aTag.get_attribute('href')))
あとは取得したい期間をfor文で繰り返せば、最大15年分の過去レース結果のhrefリンクが自動で取得できるようになります。
動画では2020年分のデータを取得する方法を紹介しています。
まとめ
過去レース結果のリンクの一覧を取得することができたので、次回以降ではこのリンクリストを利用して実際に過去データを取得していく方法を紹介していきたいと思います。