ボートレースデータを取得する その1

コンピューター

ボートレース公式サイトからデータを取得する

ボートレース公式では、各種データの公開が行われています。

https://boatrace.jp/

今回は、エクセルVBAを使い、指定した年月に該当する番組表、競走成績を取得します。検証等に時間がかかるので、分割して記事にしてあります。

2021年6月20日の時点では、ボートレース公式サイトのSSL化は行われていません。各種データも実質非標準となりつつあるlha形式を使用しています。コードを作成するにあたり、運営の方針変更等で構成の変更がある事も想定しておく事が必要です。

その1 公式サイトからダウンロードする

データーの保管場所

番組表:http:www1.mbrace.or.jp/od2/B/{YYYYMM}/b{YYMMDD}.lzh
競走成績: http://www1.mbrace.or.jp/odds2/K/{YYYYMM}/k{YYMMDD}.lzh

アドレスでは大文字、小文字を判別し、黄マーカー部分は大文字なので注意して下さい。

ダウンロードVBA

宣言部分
Option Explicit

「明示的な宣言を強制する」宣言です。言語仕様にもよりますが、VBAでは必須レベルだと思います。

Win32API
'指定したmsだけ処理を中断する
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'Windowsのイベントキューに待機中のイベントがあるかどうかを確認する
Private Declare PtrSafe Function GetInputState Lib "user32" () As Long
'ファイルをダウンロードする
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
   (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

32bitベースのWindows機能を使うための宣言

32bit用APIですが、一部の宣言を変更する事で64bitで使用する事が可能です。(上記は変更済み)ここで言われる32bit/64bitとはエクセルであり、CPUでもWindowsでもない事に注意して下さい。
Win32API_PtrSafe 64 ビット サポートの場合
Win32API へのリンクは、32 ビットと 64 ビットの両方の互換性のある Declare ステートメント、Type 宣言、および 32 ビット バージョンと 64 ビット バージョンの両方のグローバル定数宣言を含む 1 つのファイルのダウンロードに役立ちますMicrosoft Office
使用している Office のバージョンを確認する方法
現在実行している Office のバージョンを確認します。
仮)年月、種類指定
Sub test()
    downloadDataFile 2021, 6, "B"
End Sub

仮)最終的にはGUIにて年月、種類を指定します。

ファイルダウンロード
Private Function downloadDataFile(intYear As Integer, intMonth As Integer, strType As String) As Long
Dim dtmEom As Date
Dim intEom As Date
Dim strBookPath As String
Dim strOutPath As String
Dim strUrl As String
Dim strFile As String
Dim strUrlFile As String
Dim strArcFile As String
Dim strTxtFile As String
Dim lngDlRes As Long
Dim lngArcRes As Long
Dim i As Integer

    dtmEom = DateSerial(intYear, intMonth + 1, 0) '月末日取得
    
     '出力先フォルダ設定 存在しない場合、作成する
    strBookPath = ThisWorkbook.Path
    If Right(strBookPath, 1) <> "\" Then strBookPath = strBookPath & "\"
    strOutPath = strBookPath & Format(dtmEom, "yyyymm") & "\"
    If Dir(strOutPath, vbNormal + vbDirectory) = "" Then MkDir strOutPath
         
    '取得データを判断し、URL,パスを設定する(アドレス内の区分は大文字)
    Select Case UCase(strType)
        Case "B": '番組データ
            strUrl = "http://www1.mbrace.or.jp/od2/B/" & Format(dtmEom, "yyyymm") & "/"
        Case "K": '競走成績データ
            strUrl = "http://www1.mbrace.or.jp/odds2/K/" & Format(dtmEom, "yyyymm") & "/"
    End Select
    
    For i = 1 To intEom
        'ファイル名設定
        strFile = LCase(strType) & Format(dtmEom, "yymm") & Format(i, "00")
        strUrlFile = strUrl & strFile & ".lzh"
        strArcFile = strOutPath & strFile & ".lzh"
        strTxtFile = strOutPath & strFile & ".txt"
        
        'ファイルのダウンロード ファイルの無い日もあるのでエラーでもスルー
        '出力先フォルダが無いとlngRes=0でもダウンロードされなかった(事前に作る事)
        'ダウンロードファイルは上書きされます
        lngDlRes = URLDownloadToFile(0, strUrlFile, strArcFile, 0, 0)
        
        If lngDlRes = 0 Then

      'ダウンロード後の処理は後日

        End If
        
        Sleep 2000
        If GetInputState() Then DoEvents
    Next i
End Function

マクロ有効ブック保存フォルダをベースに、対象年月にフォルダを作成し、指定されたデータのダウンロードを取得します。

モジュール内の「sleep 2000」(2秒停止)は、サイトに負荷をかけない為の配慮です。

「If GetInputState() Then DoEvents」は、「DoEvents」のみでも構わないですが、イベントキューに待機中のイベントがある場合のみ「DoEvents」を実施する様にしています。

最後に

今回は、公式サイトからダウンロードする方法について記事にしました。今後は、ダウンロードした圧縮ファイルを解凍する方法、取得した帳票イメージファイルをデータ化する方法を記事にして行きます。

 

コメント

タイトルとURLをコピーしました