レーサーデータもPythonでDL!コラボでGO!おかわり

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!シリーズのおさらいはこちら


お世話になっているPython入門書
タイトルとURLをコピーしました