もっと怖いかも
オッズ!おら悟空!!
ぎゃははははー
顔とセリフが合ってなくて怖い!!
私が林家パー子みたく笑ったらもっと怖くない?
Webスクレイピングとは
Webサイトからデータを抽出することを「Webスクレイピング」と言います。
これまで競走成績や番組表、レーサー期別成績のファイルをダウンロード・解凍・CSV化してきましたが、これはWebスクレイピングとは言いません。何が違うのでしょうか?
Webスクレイピングとは、今まさに見えているWebページからデータを取得することを言います。あらかじめ用意されたファイルをダウンロードすることとは異なります。
PythonにはWebスクレイピング専用のモジュールが用意されているので、簡単なスクリプトを書くだけでWebページから必要なデータを抽出することが可能です。
ここではボートレースのオッズデータを取得してみましょう。
オッズデータはどこにある?
競走成績などのファイルをダウンロードしたことがあれば、それらと並んでオッズデータがあることに気づいたかもしれません。
公式サイトのトップページから「データを調べる」→「ダウンロード・他」→「オッズ情報・結果(HTML)(またはJAVA)」と進めば、オッズ情報を見ることができます。
しかし、説明を読んでみると「ここでは全国24ボートレース場で本日開催されているレースのオッズと結果情報がご覧になれます」とあります。これでは一定期間のオッズ情報を取得するのに何日もかかってしまいますね。
そこで、公式サイトのレース情報からオッズデータを取得できないか考えてみましょう。
URLの特徴をとらえる
公式サイトのトップページから「レース情報を見る」→「本日のレース」を開き、どのタイトルでも良いのでレース別情報にある「オッズ」と書かれたリンクをクリックします。
下図はあるレースの2連単のオッズです。
この画面を表示させるURL次の通りです。
https://www.boatrace.jp/owpc/pc/race/odds2tf?rno=1&jcd=21&hd=20210206
URLを分解すると次のようになります。
- 固定部分: https://www.boatrace.jp/owpc/pc/race/odds
- 舟券種別: 2tf?
- レース回: rno=1
- レース場: jcd=21
- レース日: hd=20210206
例えば、レース回の部分をrno=2に変更すると、第2レースのオッズが表示される仕組みです。このURLの特徴を利用すれば、一定期間のオッズ情報を自動的に取得できそうです。
URLを指定する
URLの特徴が分かったところで、今度はURLのリストを作ることを考えてみましょう。URLの変動部分を全てのパターンで作ることも可能ですが、これはお勧めしません。なぜでしょうか?
指定した期間にレースがなければ、データがないためエラーとなります。場によっては1ヶ月以上レースが開催されないこともあり、30日*12レース=360回もエラーページを表示させることになります。非効率ですしサーバにも負担をかけることになりますので避けるべきでしょう。
そこで実施されたレースに対してオッズデータを見に行くようにします。つまり、レース結果があるものは必ずオッズデータがありますので(中止の場合を除く)、レース結果からレース場・レース回・レース日を取得し、これらを利用してURLを生成します。
ここまでコラボでGOシリーズをお読みいただいた皆さんであれば、レース場・レース回・レース日と聞いてピンと来るものがあると思います。そうです!レースコードです。
レースコードはこの3種類のデータで作られたコードなので、これを利用しない手はありません。しかもオッズデータをレースコードとセットで持つようにすれば、競走成績や番組表とも紐づけることができて一石三鳥ですね!
オッズデータを取得する流れは次の通りです。
- 競走成績または番組表のCSVファイルを用意
- CSVファイルの最初の列にあるレースコードを取得
- レースコードからレース場・レース回・レース日をデコード
- レース場・レース回・レース日と、指定した舟券種別でURLを生成
- URLからWebページを開き、オッズデータをスクレイピング
- オッズデータにレースコードを加えてCSVファイルに書き込む
次回はスクリプトを記述して、実際にオッズデータを取得しましょう。