ディープラーニングなどの機械学習をするにしても、まず、データを集める必要があります。JRA-VANでもお試し期間の1ヶ月のみであれば無料でデータを入手できますが、データ分析を継続して行うには、どうしても自前でデータ収集する必要があります。このページでは競馬予想AIを作る上での大元となるデータを無料で収集する方法(netkeibaからのスクレイピング方法)や取得したデータをcsv 形式で保存する方法について記述しています。
ここではスクレイピングにRを使う方法を紹介します。
Rとは?
Rはデータ分析などに使われることが多い無料のソフトです。caretやkerasなどのパッケージを導入することで、比較的簡単に機械学習やディープラーニングを行なったりすることもできます。
Rでnetkeibaをスクレイピング
無料で利用できるデータ解析ツールRを使って、無料でアクセスできるnetkeibaから競馬データのスクレイピングを行ってみました。
JRA-VANデータラボの会員になれば、公式データをcsv形式でダウンロードすることができるのですが、いかんせん有料。利用料金は月額2,090円(2022年1月現在)。1年使ったら25,080円。データを入手するだけでこれだけ吹っ飛ぶ。JRA銀行からの引き落とし手数料が25,000円なんて高過ぎますからね。ぜひトライしてみてください。
スクレイピングのための準備
netkeibaからスクレイピングするにあたり、どのようなデータを取り出すのか、そのデータにどうやってアクセスするのかを整理します。
取り出すデータ
まず、取り出すデータについて。
下の図は2021年のダービーのレース結果です。
ここに示すようにいくつかの表が示されているのですが、このページから以下の3種類のデータを取り出すことにします。
①レースの条件
②レース結果(各馬の着順、タイム等)
③払い戻し情報
まず、このページへのアクセス方法について。このページのURLは以下のようになっています。
URL:
https://db.netkeiba.com/race/202105021211/
この「202105021211」の部分(この部分をrace_idと呼ぶことにします)が2021年2回東京12日目11R(すなわちダービー)のレースを表しています。このページにアクセスして、データを取得するためには、入手したい過去のレースについて、race_idを入手してから、データを入手するというのが今回やりたいことになります。
(参考)
過去のデータをスクレイピングしてみてわかったことですが、race_id = 「202105021211」は、「2021 05 02 12 11」に分解されて、それぞれ、以下のような意味になっているようです。今回のスクレイピングではこの情報は使いませんが、とりあえず、参考までにどういう意味なのか載せておきます。
2021:年
05:競馬場コード(05は東京)
02:回
12:日目
11:レース
競馬場コード
01:札幌 02:函館 03:福島 04:新潟
05:東京 06:中山 07:中京 08:京都
09:阪神 10:小倉
race_idを調べる
前項の参考の部分にrace_idの意味は載せましたが、毎年開催回数が同じではない等の理由から、race_idを自動的に作成することはできません。従って、過去のレースについてのrace_idを調べる必要があります。
netkeibaには、以下のように競馬開催日のレース一覧をまとめたページがあります。2021年の日本ダービーが開催された日(5月30日)であれば、URLは以下のようになっています。赤字の部分が開催日になっています。
URL:
https://race.netkeiba.com/top/race_list.html?kaisai_date=20210530
このページの各レース名にはリンクが設けられており、レース名をクリックすると先ほどのようなレース結果にページが移動します。つまり、競馬が開催された日を調べて、その日付に対応したレース一覧のページにアクセスすれば、レース名部分のリンク先のURLにrace_idが埋め込まれているので、これを抽出するコードを書けばrace_idを取得することができるということです。
日本ダービーのレース結果URL:
https://race.netkeiba.com/race/result.html?race_id=202105021211&rf=race_list
(赤字部分がrace_id)
(参考)
タイプ①
開催レース一覧URL:
https://db.netkeiba.com/?pid=race_kaisai&syusai=10&date=20210530
レース結果URL:
https://db.netkeiba.com/race/202105021211/
タイプ②:
開催レース一覧URL:
https://race.netkeiba.com/top/race_list.html?kaisai_date=20210530
レース結果URL:
https://race.netkeiba.com/race/result.html?race_id=202105021211&rf=race_list
race_idを入手するページ、レース結果を入手するページを、タイプ①またはタイプ②で統一する方が自然なのかもしれませんが、今回のスクレイピングでは、タイプ①、タイプ②が混在する形のスクレイピングになっています。
race_idの入手 = タイプ②の開催日ページ
レース結果の入手 = タイプ①のレース結果ページ
このやり方になっていることに必然性はありません。netkeibaを調べながらコードを書いていたところ、こういう形でスクレイピングを実現できたというだけです。
開催日を調べる
では、開催日はどうやって入手するか?
基本的には土日のみとはいえ、年始の金杯のように日付が機会的にはわからない場合もありますので、開催日もきちんと調べる必要があります、netkeibaには開催一覧のカレンダーのページがあります。開催一覧のページのURLは以下のようになっており、、「year=」「month=」の部分を書き換えれば、対応する年、月のページにアクセスできます。
URL:
https://race.netkeiba.com/top/calendar.html?year=2021&month=5
このカレンダー部分から、リンク先情報を全て抽出して、文字列処理を行えば、開催日の情報(2021年5月の場合であれば、20210501, 20210502, 20210508, 20210509, 20210515, 20210516, 20210522, 20210523, 20210529, 20210530)を入手することができます。
スクレイピングのためのソースコード
スクレイピングを始める前に
Rでスクレイピングをするならrvestパッケージを使うのが簡単です。また、スクレイピングをするためにはHTML/CSSの理解も必要。とりあえず、これだけ知っていればスクレイピングは始められます。
スクレイピングの手順とソースコード
これで、netkeibaからスクレイピングするための手順が決まりました。手順としては以下のようになります。
step1: 入手したい日付(年、月)のカレンダーのページから開催日を調べる
step2: 開催日のページからrace_idを調べる
step3: race_idに対応したページからデータを抽出する
step2ではRSeleniumを使ってスクレイピングを行っています。RSeleniumを使うための設定については、こちらを参照ください。
スクレイピング実行結果
5年分のデータ取得に7時間くらいかかりました。夜、実行しておくと朝には欲しいデータが入手できているという感じです。2回実行して計10年分、34,540レース、延べ491964頭分のレースデータを入手できました。
レース情報
レース結果
払い戻し情報
(参考)処理時間の短縮について
step2の部分でSeleniumを利用しているのですが、ここが処理を遅くしています。netkeibaには、同じような内容が記載されてるページがいくつかあり、今回利用したページとは違うページを利用すれば、Seleniumを使わずにスクレイピングができそうです。こちらを参照ください。
csv形式での保存
データの使い方によっては、csvファイルの形式で保存したい場合もあるかと思います。入手したデータはdata.frame形式になっていますので、write.csv()関数などを使えば、簡単にcsv形式で保存することができます。
# df : データほ保持しているdata.frame型の変数名
# filename : 保存したいファイル名
# row.names = FALSEのオプションは行番号をつけないようにするため
write.csv(df, filename, row.names = FALSE)
まとめ
netkeibaからスクレイピングするための手順は以下の通り。
- 入手したい日付(年、月)のカレンダーのページから開催日を調べる
- 開催日のページからrace_idを調べる
- race_idに対応したページからデータを抽出する
まずはstep1から
そして、netkeibaの走破タイムだけでなく、スピード指数もスクレイピングしたい場合はこちら
スピード指数を作る過程を公開中
データを入手したら、競馬予想AIを作ってみたくなりますよね?
スクレイピングをしてデータを入手できるようになれば、あまり公表されていないような分析も自分で行うこともできるようになります。