1.レーサー期別成績をダウンロードすることにした
これまでのコラボでGO!シリーズでは、番組表、競争成績をダウンロードして展開してエクセルでごにょごにょしてきましたが、ボートレース公式サイトからはまだ公式に公開されているデータがあります。
それがレーサー期別成績!
期単位でのデータで、公開されているのも2002年前期からの20年弱なので1日ごとの番組表や競争成績に比べたら全然データ量が少ないんですが、これも自動でごにょごにょやろうかなと考え、やってみました。
基本的には今までのコラボでGO!で書いていたスクリプトの改編で行けるはず。
2.ダウンロードURLの構造を調べてURLリストを考えてみよう
まずはどのURLを叩いたらいいか見てみました。
レーサーの期別成績がダウンロードできるページはこちら
https://www.boatrace.jp/owpc/pc/extra/data/download.html
競争成績などはさらにページが開いてJavascriptで日毎に記述されていますが、こちらのレーサー期別成績は直接HTMLでダウンロードファイルが記載されています。
一つずつURLを見てい行くと
2021年前期
https://www.boatrace.jp/owpc/pc/extra/data/static_extra/pc_static/download/data/kibetsu/fan2010.lzh
2020年後期
https://www.boatrace.jp/owpc/pc/extra/data/static_extra/pc_static/download/data/kibetsu/fan2004.lzh
つまり
https://www.boatrace.jp/owpc/pc/extra/data/static_extra/pc_static/download/data/kibetsu/fan
までが固定で、
成績が確定した年の下2桁
成績が確定した月(前期なら10、後期なら04)ということがわかります。
21年前期の成績はfan2010.lzhとなっているように、その成績が確定した時期がファイル名になっているので、一番最初の2002年前期なら「fan0110.lzh」と前年10月を示す必要がありそうです。
3.ソースコード
実際にDLしたソースコードはこちら
# リクエスト間隔を指定(秒) ※サーバに負荷をかけないよう3秒以上を推奨
INTERVAL = 3
# ファイルの保存先を指定 ※コラボでGoogleドライブをマウントした状態を想定
SAVE_DIR = "drive/My Drive/teimon_practice/racer_lzh/"
# HTTP通信ライブラリの requests モジュールをインポート
from requests import get
# フォルダ(ディレクトリ)を作成する makedirs モジュールをインポート
from os import makedirs
# 時間を制御する time モジュールをインポート
from time import sleep
# 開始合図
print("作業を開始します")
# ファイルを格納するフォルダを作成
makedirs(SAVE_DIR, exist_ok=True)
# 取得したい年
start_year = 2001
end_year = 2021
# 年リストを作る
year_list = []
# スタート年の前年からエンド年まで1ずつ足仕上げて4桁のリストをつくる
for x in range(start_year-1, end_year +1):
year_list.append(str(x)[2:4] + "10")
year_list.append(str(x)[2:4] + "04")
# URL固定部分
FIXED_URL ="https://www.boatrace.jp/static_extra/pc_static/download/data/kibetsu/fan"
# URL生成とダウンロード
for y in year_list:
variable_url = FIXED_URL + y + ".lzh"
file_name = y + ".lzh"
# ダウンロード
r = get(variable_url)
# 成功した場合
if r.status_code == 200:
f = open(SAVE_DIR + file_name, 'wb')
f.write(r.content)
f.close()
print(variable_url + " をダウンロードしました")
# 失敗した場合
else:
print(variable_url + " のダウンロードに失敗しました")
# 指定した間隔をあける
sleep(INTERVAL)
# 終了合図
print("作業を終了しました")
4.注意したポイントはココ!
今回注意が必要だったポイントはここでした。
# 年リストを作る
year_list = []
# スタート年の前年からエンド年まで1ずつ足仕上げて4桁のリストをつくる
for x in range(start_year-1, end_year +1):
year_list.append(str(x)[2:4] + "10")
year_list.append(str(x)[2:4] + "04")
年リストには「fan●●●●.lzh」のファイル名部分の4桁の数字「0410」「0204」などを順番にリスト化して入れたいのですが、1度さらりと書いて実行したら以下の点で引っ掛かりました。
・成績が確定した年の下2桁をとること
・成績の確定時期が前期と後期で04と10があること
・2002年の成績をとるなら2001年に成績が確定しているのでstart_yearの1年前から始めること
・for文の終わりをend_yearとしてしまうと、end_yearまで、つまりその前の年までで終わる。⇒そのため、for文の終わりはend_year+1としました。
・ダウンロードする際、URLとして文字列をつなげるため「04」などの2桁の数字が数字(int型)になっていると頭の0が消える。⇒そのため、下2桁をとる際に文字列になるようstr型に変換を入れています。
5.ついでにLzhを解凍しとこ
ダウンロードしたレーサー期別成績データはすべて.lzh形式で圧縮されているのでこれは解凍しちゃいましょう。
解凍の手順はコラボでGO!(4)でのソースコードと全く同じです。
まずは.lzhファイルを解凍するためのモジュール「lhafile」をpipコマンドでインストール。
!pip install lhafile
はい、これで実行するだけです。
モジュールがインストール出来たら解凍しまーす。
# ダウンロードしたLZHファイルが保存されている場所を指定
LZH_FILE_DIR = "drive/My Drive/teimon_practice/racer_lzh/"
# 解凍したファイルを保存する場所を指定
TXT_FILE_DIR = "drive/My Drive/teimon_practice/racer_txt/"
# 正規表現をサポートするモジュール re をインポート
import re
# LZH形式のファイルを解凍するパッケージ lhafile をインポート
import lhafile
# オペレーティングシステムの機能を利用するパッケージ os をインポート
import os
# 開始合図
print("作業を開始します")
# ファイルを格納するフォルダを作成
os.makedirs(TXT_FILE_DIR, exist_ok=True)
# LZHファイルのリストを取得
lzh_file_list = os.listdir(LZH_FILE_DIR)
# ファイルの数だけ処理を繰り返す
for lzh_file_name in lzh_file_list:
# 拡張子が lzh のファイルに対してのみ実行
if re.search(".lzh", lzh_file_name):
file = lhafile.Lhafile(LZH_FILE_DIR + lzh_file_name)
# 解凍したファイルの名前を取得
info = file.infolist()
name = info[0].filename
# 解凍したファイルの保存
open(TXT_FILE_DIR + name, "wb").write(file.read(name))
print(TXT_FILE_DIR + lzh_file_name + " を解凍しました")
# 終了合図
print("作業を終了しました")
これは本当に以前書いたソースコードの保存先ディレクトリを変更しただけです。
これでこんな感じでテキストファイルになりました。
これをこの後どう処理するかはまた今度!
コラボでGO!シリーズのおさらいはこちら