netkeibaのサイトから競馬データを取得するためのステップは以下の通り。
- 入手したい日付(年、月)のカレンダーのページから開催日を調べる
- 開催日のページからrace_idを調べる
- race_idに対応したページからデータを抽出する
このページはステップ1に対応したコードです。全体像はこちら。
競馬 過去データcsvをnetkeibaから無料で入手する方法
JRA-VANを無料で使えるのはお試し期間のみ。競馬のデータ分析を継続して行うには、どうしても過去の競馬レース結果データを自前で収集する必要があります。netkeibaからのスクレイピング方法やデータをcsv 形式で保存する方法について記述しています。
スクレイピングを始める前に
Rでスクレイピングをするならrvestパッケージを使うのが簡単です。また、スクレイピングをするためにはHTML/CSSの理解も必要。とりあえず、これだけ知っていればスクレイピングは始められます。
Rでスクレイピングするならrvest 表もリンクもテキストも
Rでスクレイピングをするならrvestパッケージを使うのがベスト。表データ、リンク先URL、テキストなどのデータを簡単に入手できます。netkeibaのレース結果を題材にrvestパッケージの使い方をまとめています。
スクレイピングに必要な最低限のHTML/CSSの知識
スクレイピングでデータを収集するためには、HTMLで書かれたWebページの文書構造を理解し、どこに目的のデータが記載されているかをコンピュータに教えてやる必要があります。このページではスクレイピングに最低限必要なHTML/CSSの知識をまとめています。
step1: カレンダーのページから開催日を調べる
開催日を調べる関数
get_race_dates(year, month)
【引数】
year : 開催日を調べたい年
month : 開催日を調べたい月
【戻り値】
開催日(yyyymmdd形式の文字列)のベクトル
library(rvest)
library(stringr)
library(tidyverse)
#----------------------------
# 開催日を調べる関数
#----------------------------
get_race_dates <- function(year, month){
# 処理するyear,monthの出力
cat(paste0("year = ", year, " month =", month))
# 指定したyear, monthに対応するページのurl
url <- paste0("https://race.netkeiba.com/top/calendar.html?year=",
as.character(year),
"&month=",
as.character(month))
# スクレイピング
race_dates <- read_html(url, encoding="EUC-JP")%>%
html_element(css="#Netkeiba_RaceTop > div.Wrap.fc > div.Contents > div.Main_Column > div.Race_Calendar_Inner > div > div.Race_Calendar_Main > table ") %>%
html_nodes("a") %>%
html_attr("href") %>%
str_split("=") %>%
sapply("[[",2)
# スクレイピングは1秒待つ
cat(" Sleep")
Sys.sleep(1)
cat(" Done\n")
return(race_dates)
}
get_race_dates()の使用例
以下のコードでは、2012年1月から2021年12月までで競馬が開催された日付を取得しています。
#--------------------------------------
# スクレイピングを繰り返して、必要なデータを取得
#--------------------------------------
# 取得したい年、月のdata.frameを作成
year_month <- expand_grid(year = 2012:2021, month = 1:12)
# 取得したい年、月のページをスクレイピングして結果をres(list型)に保存
res <- list()
for(i in 1: nrow(year_month)) {
year<-year_month$year[i]
month<-year_month$month[i]
res[[i]] <- get_race_dates(year, month) # 競馬開催日を取得
}
# resはlist型なので、それをバラして、ひとつのcharacterベクトルにする
race_dates <- unlist(res)
# データの保存
rds_filename <- "race_dates.2012to2121.rds" # file名
saveRDS(race_dates, file = rds_filename) # 保存
step2に進む場合はこちら
競馬レース結果データベースを自作する方法:step2
指定した開催日に行われた競馬のrace_idをスクレイピングするためのコードです。