見出し画像

ExcelとSeleniumで競馬の自動投票は難しくない(第5回)

前回は、取得したい情報によってお勧めする取得先を紹介しましたが、今回からipatでの投票に関して、VBAのコードを紹介しながら解説していきます。

自動投票するに当たって、出馬表を取得する部分を先に説明すべきではないかというご意見もあるかと思いますが、競馬新聞を利用するなど予想方法によっては必ずしも出走表をデータで取得する必要がない方もいますので、
 ・出走日
 
出走時刻
 
競走場
 
開催回、開催日
 
レース番号
 
馬名
 
枠番、馬場
といった自動投票に必要な情報をWebサイトや手入力によって既に準備できていることを前提に進めます。
もちろん、上記の情報を取得する方法についても説明してほしいという方もいらっしゃると思いますので、いずれ記事にする予定です。。
なお、要望があれば優先的に対応しますので、Xでダイレクトメッセージを送ってください。


オッズの取得までの流れ

自動投票の目的は、レース直前のオッズを確認して、馬券の購入可否を判断することですので、単勝オッズの取得方法について解説します。
サンプル画像ではブラウザに「Floorp」を使っていますが、実際に自動投票する際には、「Chrome」を使いますのでご留意ください。

第3回で紹介したコードで、ipatにログインすることができましたので、以下の画像のような状態になっているはずです。

オッズを取得する操作としては、ここで「情報メニュー」をクリックすることになります。

「情報メニュー」をクリックすると、以下の画像のとおり、タブが追加されて情報メニューが表示されます。

ここでの操作としては、競走場をクリックすることになります。

競走場をクリックすると、以下の画像のとおりレース情報選択画面が表示されます。

ここでの操作としては、対象となるレースの「オッズ」をクリックすることになります。

「オッズを」クリックすると、以下の画像のとおり単勝・複勝(馬番順)が表示されます。

ここでの操作としては、オッズを取得することになります。

オッズを取得した後、ExcelワークシートのセルA1に貼り付けると、以下の画像のようになります(上のブラウザに表示されているレースとオッズを取得したレースが異なっていてすみません)。

これで単勝・複勝オッズをExcelに取り込むことができました

ここまでの操作をVBAにて記述する必要があるのですが、お気づきのとおり、D列には単勝オッズが表示されているものと、複勝オッズが表示されているものが混在しています。

そこで、まずはこの場合の対象方法を先に説明しておきます。
対処方法としては、数式バーに表示されている式をセルF2に入力し、オートフィルでF19までコピペします

コピペすると以下のようになります。

19行目までコピペする理由は、ご承知のとおり出走頭数が最大18頭であるためです。

また、入力した式を補足しますと、IF関数にて空白を出力する場合がありますが、これは「0」を出力しないための措置となります。

「0」を出力したくない理由ですが、「0」を出力したうえでオッズを昇順で順位付けした場合、「0」が最も小さいオッズであるとして第一位となってしまいます。そのため、いわゆる「何番人気」という順位付けができなくなるため、空白を出力してRANK関数で集計しないようにしています。

私の場合、馬の人気順によって投票する馬を変更しているためRANK関数で順位付けしてますが、「オッズ断層」で投票する馬を決定する場合にも有効だと思います。

サンプルコード

上記のオッズ取得の流れをコードにすると以下のとおりです。
第3回で紹介したコードも一部変更して盛り込んでいます。
細かくコメントを入れていますので、転用する際は内容を理解したうえで、必要な修正を加えてご利用ください。

'モジュール内で共有する変数・定数を冒頭に記述しました。
Dim DRIVER As New Selenium.WebDriver 'webDriver用の変数
Const WAITTIME as Integer = 2000 '待機時間用の変数(ミリ秒で指定)

'複数のレースに対して自動投票するため、 実際には「Main」に記述した内容をループさせることになります。
Sub Main()

    '第3回で紹介したipatのサイトにログインするプロシージャを呼び出します。
    Call JRA_ipat_Login

    'プロシージャ「Get_Odds」を呼び出します。
    Call Get_Odds

End Sub


'オッズを取得するプロシージャ
Sub Get_Odds()
      
     With DRIVER
  
        '「情報メニュー」をクリックします。
        .FindElementByCss(".ico_info.ui-link").Click

        '---------------------注意事項---------------------------------------------------------------------------------------------
        '「情報メニュー」のclass名は「ico_info ui-link」です。class名にスペースが含まれると、「FindElementByClass」で要素を取得できません。
        'そのため、CSSセレクター(クラス名の冒頭とスペース部分に「.」を入れること)を利用することで、情報メニューをclickできるようになります。
        '---------------------注意事項ここまで--------------------------------------------------------------------------------------

        .Wait WAITTIME
        
        'ウインドウを「情報メニュー」に切り替えます。
        .SwitchToWindowByTitle ("情報メニュー")
        .Wait WAITTIME

        'レース場をクリックします。
        '"4回東京7日"の部分は投票するレースや投票する日によって変わってきますので、実際には、この部分は変数化する必要があります。        
        .FindElementByPartialLinkText("4回東京7日").Click
        .Wait WAITTIME
          
        '天候、馬場状況を取得して、セルA20に貼り付けます。天候や馬場状況によって投票内容を変更したい場合に利用します。
     Cells(20, 1).Value = .FindElementByClass("tenkobaba").Text
            
        'オッズを取得したいレースをクリックします。「●」は変数化して、レース番号(112)が 入るようにします。 
        .FindElementByXPath("/html/body/div[9]/table/tbody/tr[●]/td[2]/a").Click
        .Wait WAITTIME

        'ウインドウを「単勝・複勝オッズ(馬番順)」に切り替えます。        
        SwitchToWindowByTitle ("単勝・複勝オッズ(馬番順)")
        .Wait WAITTIME

        '単勝・複勝オッズのデータを取得して、セルA1に貼り付け  
        .FindElementByClass("ozTanfukuTable").FindElementByTag("table").AsTable.ToExcel Cells(1, 1)
        .Wait WAITTIME
            
        'ブラウザを終了します。
        .Quit
            
    End With
    Set DRIVER = Nothing
End Sub


Sub JRA_ipat_Login()    
    Dim JRA_ID As String   `加入者番号用の変数
    Dim JRA_PASS As String  `暗証番号用の変数
    Dim JRA_P_ARS As String `P-ARS番号用の変数


  'ワークシート「parameter」のセル「C3」に入力されている値を加入者番号として変数に代入
    JRA_ID = Worksheets("parameter").Range("C3").Value

  'ワークシート「parameter」のセル「C4」に入力されている値を暗証番号として変数に代入
    JRA_PASS = Worksheets("parameter").Range("C4").Value

  'ワークシート「parameter」のセル「C5」に入力されている値をP-ARS番号として変数に代入
    JRA_P_ARS = Worksheets("parameter").Range("C5").Value

    With DRIVER
     'Chromeを起動する
         .Start "chrome"

     'ipatのサイトにアクセスする
         .Get "https://www.ipat.jra.go.jp/sp/"
         
     '2秒待機する
         .Wait WAITTIME
         
     '加入者番号を入力する
         .FindElementById("userid").SendKeys JRA_ID

     '暗証番号を入力
         .FindElementById("password").SendKeys JRA_PASS

     'P-ARS番号を入力する
         .FindElementById("pars").SendKeys JRA_P_ARS
         
     'ログインボタンをクリックする
         .FindElementByXPath("/html/body/div[2]/div/div[1]/div[2]/ul/li/a").Click
         
     '2秒待機する
         .Wait WAITTIME       

     End With
     
End Sub

補足ですが、上記のコードは私が実際に使用しているものではありません。
あくまで、自動投票を行うための基本的なWeb操作をコード化したものであることをご理解ください。

私の場合、複数のレースに対して自動投票を行っていますので、出走時間などのレース情報を配列に格納し、定刻になるとオッズを取得し、投票可否を判定させています。
したがって、各自の予想スタイル、投票スタイルによってプログラムの構成は大きく変わってきます。

自動投票の近況報告

11月2日の京都8Rが中止となったため、自動投票プログラムが想定外の挙動を起こし、エラーとなっていました。
そのため、東京11Rの京王杯2歳Sのパンジャタワー(単勝2,100円)を買うことができませんでした。

一応、11月2日は回収率300%超え!

購入できていれば、昨日は大きなプラスだったんですけどね。
まあ、穴馬も躊躇なく買える点が自動投票の強みだということをお伝えできるよい機会となりました。

今回のエラーによって、私の自動投票プログラムはまだまだ改善の余地があることが分かりましたし、有馬記念のようなビッグレースでは投票の締め切りが早かったと記憶していますので、今後もこれらの対応に追われそうです。

最後に、次回は投票部分のプログラムについて紹介する予定です。

この記事が気に入ったらサポートをしてみませんか?