当記事では、Pythonを使った馬券の自動購入プログラムの作り方についてわかりやすく解説します。
具体的には、seleniumとscheduleを使用して、指定した時間に自動でJRAのネット投票サイトにログインして馬券を購入するプログラムを作成します。
記事の最後には、コードの例として「2021年12月26日の中山9〜11レースで単勝オッズが10〜20倍の馬を1点100円で開始5分前に自動購入するコード」を載せています。
初心者向けにかなり詳しく説明しているので、上級者の方は読み飛ばしながら進めて下さい。
また、競馬データの解析ではPythonのプログラミングスキルが必須になります。
Pythonの基本が完全には身についていない方は、以下の本で勉強するのがおすすめです。
1, 必要なもの
必要なものは以下の通りです。
・JRAネット投票のアカウント
・Python
・Pythonのライブラリ(seleniumとschedule)
・chromedriver
まず、JRAネット投票のアカウントは既にお持ちの方が多いかと思います。
もしアカウントをお持ちでない方は、こちらのサイトから加入手続きを行って下さい。加入者番号と暗証番号、P-ARS番号が必要になります。
次に、Pythonをインストールしていない方はインストールして下さい。
Pythonのインストールの方法は、windowsを使用している方はこちらの記事、macを使用している方はこちらの記事をご参考ください。
Pythonをインストールできた方は、今回使用する「selenium」と「schedule」をインストールしましょう。
「selenium」はブラウザをPythonで操作するためのライブラリで、「schedule」は指定した時間に何かしらの処理を行うライブラリです。
この「selenium」と「schedule」を組み合わせてやることで、指定した時間にブラウザを操作して馬券を購入することができます。
早速「selenium」と「schedule」をインストールしてみましょう。
「selenium」と「schedule」をインストールする方法は、「pip install selenium」または「pip install schedule」とコマンドプロンプトまたはターミナルに入力してEnterを押すだけです。
うまくインストールできない場合は、代わりに「pip3 install selenium」または「pip3 install schedule」と入力してEnterを押してみて下さい。
windowsを使用している方はこちらの記事やこの記事が参考になるかと思います。また、コマンドプロンプトの開き方はこちらの記事をご参考ください。
筆者はmacを使っているため、macを使用した場合の「selenium」と「schedule」をインストール方法について詳しく解説いたします。
まず「Finder」を開いてから、下図のように「アプリケーション」→「ユーティリティ」→「ターミナル」とクリックして、ターミナルを起動して下さい。
ターミナルを起動したら、「pip install selenium」と入力してEnterを押して下さい。うまくいかない場合は「pip3 install selenium」と入力してEnterを押して下さい。
同様の操作で、「pip install schedule」または「pip3 install schedule」と入力してEnterを押して下さい。
以上で「selenium」と「schedule」をインストールできます。
最後に「chromedriver」なるものをインストールしましょう。「chromedriver」とは「selenium」を使用してGoogle chromeを操作するときに必要になるものです。
「chromedriver」をインストールする前に、当記事ではGoogle chromeをブラウザとして使用しますので、お持ちでない方はこちらの記事などを参考にしてインストールして下さい。
「chromedriver」をインストールするためにこちらの公式サイトにアクセスして下さい。
下図のような画面が表示されますので、ブラウザーが「Chromium/Chrome」となっている行の「ダウンロード」をクリックして下さい。
すると下図のようにたくさんファイルが出てきます。それぞれのファイル名はGoogle Chrome のバージョンに対応しています。
上図のファイルの中からご自身のGoogle Chromeのバージョンに合ったファイルを選択してダウンロードして下さい。
まず、ご自身のGoogle Chromeのバージョンを確認しましょう。Google Chromeを立ち上げて、左上の「Chrome」から「Google Cheromeについて」をクリックして下さい。
すると下図のような画面が出てきます。下図の場合、バージョンは「96.0.4664.110」です。
さて、Google Chromeのバージョンが確認できたところで、先程のchromedriverのダウンロードページに戻りましょう。
上図で確認したGoogle Chromeのバージョンと同じ番号のファイルをクリックして下さい。
同じ番号が存在しなかった場合は、ご自身のGoogle Chromeのバージョンよりも大きいかつ近いものをクリックして下さい。
筆者のGoogle chromeのバージョンは「96.0.4664.110」でしたが、chromedriverのサイトに筆者のGoogle chromeのバージョンと全く同じ番号がなかったため、「96.0.4664.110」より大きくかつ近い番号である「96.0.4664.18」をクリックしました。
ファイルをクリックすると以下のような画面が出てきます。
windowsをご使用の方は「chromedriver win32.zip」、macをご使用の方は「chromedriver mac64.zip」をクリックして下さい。自動でダウンロードが開始されます。
ダウンロードしたzipファイルを開いて下さい。「chromedriver.exe」というファイルが出てきます。これが今回欲しかったchromedriverの本体です。
長かったですが、以上で必要なものが全て揃いました。
2, seleniumでアクセス
次に、seleniumを使用してJRAネット投票のログイン画面にアクセスしてみましょう。
Pythonを開いて下記コードを実行して下さい。
コピペ用は以下です。なお、7行目の「executable_path=」の後ろの部分を、先程ダウンロードしたchromedriverのパス名に書き換えて下さい。
詳細な手順を解説いたします。
まずは、Pythonを開きましょう。筆者のmac環境ですと、「アプリケーション」→「Python 3.9」→「IDLE」とクリックすることでPythonを開くことができます。
次に、左上タブの「File」→「New File」からエディタを立ち上げて下さい。
エディタとは実際にコードを入力する画面のことです。
立ち上がったエディタに先程のコードをコピペして、上タブの「Run」→「Run Module」をクリックすることでコードを実行して下さい。
なお、コードをコピペする際は、7行目の「executable_path=」の後ろの部分を、先程ダウンロードしたchromedriverのパス名に書き換えて下さい。
パス名の調べ方はwindowsとmacで異なります。windowsの場合は、「Shift」を押しながらchromedriverを右クリックして「パスのコピー」をクリックするとパス名をコピーできます。macの場合は、「option」を押しながらchromedriverを右クリックして「◯◯◯◯のパス名をコピー」をクリックするとパス名をコピーできます。
パス名を書き換えた後にコードを実行すると、筆者の場合「”chromedriver”は開発元を検証できないため開けません。」というエラーが出てきてしまいました。
そこで、筆者はこの記事を参考にして対処しました。
具体的な方法としては、「システム環境設定」→「セキュリティとプライバシー」→「一般」→「このまま許可」をクリックすることでエラーを消すことができました。
Google chromeが自動で立ち上がって、以下の画面が出てきたら成功です。
ただし上記サイトは土日しかログインできないようで、平日は以下の画面が表示されます。
なお、この自動で立ち上がったブラウザを消す際には左上の✖️ボタンではなく、IDLE Shellに「driver.quit()」と入力してEnterを押して消して下さい。
左上の✖️ボタンで消すと、バックグラウンドでGoogle chromeが常に起動した状態になってしまいます。
✖️ボタンで消してしまったGoogle chromeがある程度溜まってきたら、PCを再起動することをお勧めします。
3, seleniumでログイン
続いて、seleniumを使用して実際にログインしてみましょう。
ログインするためにseleniumで行う操作は以下の通りです。
1, 加入者番号を入力
2, 暗証番号を入力
3, P-ARS番号を入力
4, ログインをクリック
まず加入者番号を入力してみます。
先程のJRAネット投票のログイン画面にアクセスするコードの最後の行に「driver.find_element(By.ID,”userid”).send_keys(“ご自身の加入者番号を入力して下さい”)」と入力して、「Run」→「Run Module」をクリックしてコードを実行して下さい。
Google chromeが立ち上がって、下図のように加入者番号の入力ボックスに「ご自身の加入者番」と入力されます。
「driver.find_element(By.ID,”userid”).send_keys(“ご自身の加入者番号を入力して下さい”)」の説明をいたします。
前半の「driver.find_element(By.ID,”userid”)」の部分で、HTMLの中からid属性がuseridの要素を指定しています。後半の「.send_keys(“ご自身の加入者番号を入力して下さい”)」の部分で前半で指定した要素に文字列「“ご自身の加入者番号を入力して下さい”」を渡しています。
「HTMLの中からid属性がuseridの要素を指定とは??、意味わからん!!」
と言う疑問をお持ちかと思います。
そこで、HTMLの基礎知識について触れておきましょう。
ちなみにこちらの記事でもHTMLについて解説しています。
実際にHTMLを見ていただくと理解しやすいかと思います。
HTMLを見る方法は、Google chromeでサイトを開いて「command + option + i」と押すことです。
実際にJRAネット投票のログイン画面で「command + option + i」と押してみて下さい。
以下のような画面が立ち上がります。
上図赤線で囲った部分はデベロッパーツールと呼ばれるものです。デベロッパーツールを開くことで、上図青線で囲ったHTMLを見ることができます。
HTMLとはサイトを文字で記述したものです。
重要な点は、HTMLは「要素」で構成されており、それぞれの要素は「属性」を含んでいるということです。
具体的に「要素」と「属性」をみていきましょう。
今開いたHTML上で「command + f」を押すと、以下のような検索バーが出でくるので、ここに「加入者番号」と入力してEnterを押して下さい。
すると下図のようにHTML上から「加入者番号」という文字を検索してくれます。
上図で「要素」と「属性」の対応は下図の通りです。
要素は、<dt>のような開始タグと</dt>のような終了タグで囲まれています。この場合の要素名は「dt」となります。
属性は、開始タグの中に「type = “tel”」のように記述されます。この場合「type属性は”tel”」となります。
先程Pythonで加入者番号を入力するために「driver.find_element(By.ID,”userid”).send_keys(“ご自身の加入者番号を入力して下さい”)」と記述しました。
HTMLについて学んだ今再びこのコードを見直してみると、このコードは「HTMLの中からid属性が”userid”の要素(=上図のinput要素)を探して、そいつに”ご自身の加入者番号を入力して下さい”という文字列を渡す」という処理をしていると理解できます。
ちなみにサイト画面と要素の対応は、HTML上でマウスカーソルを乗っけることで確認できます。
例えば、上図のHTML上で「input要素」の部分にマウスカーソルを乗っけてみて下さい。左側の加入者番号を入力するボックスの色が変わります。このことから、上図の「input要素」が加入者番号を入力するボックスに対応していることがわかります。
同様の考え方で、「2, 暗証番号を入力」、「3, P-ARS番号を入力」も行うことができます。
「4, ログインをクリック」に関しても、HTMLからログインボタンに対応する要素を見つけてクリックするという処理を行えば良いです。「.click()」でクリックする処理を行えます。
先程と同様にデベロッパーツールの検索バーに「ログイン」と入力して、ログインボタンに対応する要素を探しましょう。
ログインボタンに対応する要素は、要素名が「li」で「class属性」が「’btnGreen’」であることがわかりました。
そこで、「driver.find_element(By.CLASS_NAME, ‘btnGreen’).click()」と記述することで、ログインボタンを押す処理が行えます。
以上をまとめたコードは以下の通りです。
16行目で「time.sleep(4)」という処理を行っています。これはブラウザの読み込み時間を考慮して4秒間待機させる処理です。
7行目の「#」を消すとブラウザを立ち上げずに処理を行うことができます。ブラウザを立ち上げずに処理を行うことで、待機時間をもう少し短くできます。
下図のようにログインできたら成功です。ただし平日はログインできません、、、、
4, scheduleの使い方
続いて時間を指定して処理を行ってみましょう。
Pythonで時間を指定して処理を行うライブラリが「schedule」です。
「schedule」は使い方が少し特殊ですので、まず短いコードで使い方を確認してみましょう。
以下のコードは、「14時56分に”テストスタート”とプリントし、14時57分に”テスト終了”とプリントする」コードです。
コピペ用は以下です。
上記コードを実行すると、指定した時間に以下のように実行されます。
先程も述べましたが、「schedule」を使用することで指定した時間に関数を実行することができます。
逆に言うと、処理を関数の形でまとめる必要があります。
上記コードでは8〜9行目で「start」という関数で処理をまとめています。「start」関数は引数を出力する関数です。(「print」と同じですね、、、)
10行目の「schedule.every().day.at(startTime).do(start,a=”テストスタート”)」によって、開始時間「startTime」になったら、関数「start」を引数「”テストスタート”」に指定して命令しています。(ちなみに「startTime」に「9時5分」を指定したい場合は、「startTime = “09:05″」のように記述して下さい)
ここで10行目では関数をまだ実行していない点が重要です。
関数の実行は19行目の「schedule.run_pending()」で行っています。
「schedule.run_pending()」は実行しなければならない関数が存在する場合、その関数を実行するコードです。
18〜20行目は、定期的に「schedule.run_pending()」を実行するコードです。「isWorking」がTrueである限り、10秒ごとに実行しなければならない関数が存在するかチェックして、適宜関数を実行します。
「isWorking」をFalseに切り替えない限り、処理が無限ループに入ってしまうため、12〜16行目で終了時間「endTime」になったら「isWorking」をFalseに切り替えて、「”テスト終了”」と出力しています。
以上が「schedule」の使い方になります。
5, 指定した時間に馬券を購入
ここまでで、「selenium」と「schedule」の使い方を学びました。
このブラウザを操作する「selenium」と、時間を指定して処理を行う「schedule」を組み合わせて使用することで、「指定した時間にブラウザを操作して馬券を購入する」ことができます。
試しに、「2021年12月26日の中山9〜11レースで単勝オッズが10〜20倍の馬を1点100円で開始5分前に自動購入するコード」を作ってみました。(ちなみにこの日の中山11レースは有馬記念です)
コードは以下の通りです。
コピペ用は以下の通りです。
上記コードを使用する際に、ご自身で変更していただく箇所をまとめておきます。
・11行目:当記事の最初の方で調べたchromedriverのパス名を入力して下さい。
・19〜21行目:ご自身の加入者番号、暗証番号、P-ARS番号を入力して下さい。
・27行目:JRAのサイトにログインする時間を入力して下さい。
・55行目:「if」の条件の中に、購入する馬の条件を入力して下さい。上記コードではオッズが10〜20倍かどうかを調べて、該当する場合は購入する馬番のリスト「buyList」に馬番を追加しています。
・92行目:オッズを調べて購入を開始する時間をリスト型で入力して下さい。
・93行目:92行目のリスト順番に対応するように、競馬場の名前をリスト型で入力して下さい。競馬場の名前は”札幌”,”函館”,”福島”,”新潟”,”東京”,”中山”,”中京”,”京都”,”阪神”,”小倉”の中から選んで入力して下さい。
・94行目:92および93行目のリスト順番に対応するように、何レースを購入するかをリスト型で入力して下さい。上図のコードのように入力すると、「13時55分に中山9レース」、「14時30分に中山10レース」、「15時20分に中山11レース」で購入する処理になります。
・102行目:自動購入を終了する時間を入力して下さい。
上記コードでは、馬券を購入した際に購入した馬名などの情報を表示するようにしています。
実際に上記コードを実行すると、以下のように購入した馬券の情報が表示されていました。
実際に馬券が購入されているかを確認してみました。
上図の中山10レースについて自分のアカウントを確認してみると、確かに12番と14番がそれぞれ100円分購入されていました。
実際にこのレース結果を確認してみると、確かに単勝オッズが10〜20倍の馬は12番と14番しかいませんでした。
また、中山11レース(有馬記念)は15時20分の時点で単勝オッズが10〜20倍の馬がいなかっため馬券は購入されませんでした。
以上の結果から「13時55分に中山9レース」、「14時30分に中山10レース」、「15時20分に中山11レース」で単勝オッズが10〜20倍の馬を1点100円で購入できていることが確認できました。
長かったですが、以上でPythonを使った馬券購入プログラムの作り方の解説を終了します。
お疲れ様でした。
他にもこの記事ではインターネット上から無料で競馬データを取得する方法について解説していますので、ぜひご一読ください。
また、Pythonを使った機械学習を学びたい方は、以下の本で勉強するのがおすすめです。何事もまず基本ができていないと始まりませんよね。