TOP
ログイン 新規登録
【競馬予想プログラムソフト#1】低アクセス回数で競馬データをスクレイピングする方法 4 テクノロジー

よくあるスクレイピングのサンプルコードを見ると、4重5重ものfor文を回してレース情報を集めている場合が多かったですが、そのやり方実はアクセス先に迷惑をかけている可能性が非常に高いです
少ないアクセス回数で過不足なくレース情報を集められるソースを公開します。

低アクセス回数で競馬データをスクレイピングできるソースを公開します。

0.全ソースを公開しました!

以下記事で、競馬データのスクレイピングから、データの前処理、機械学習モデルの作成、モデル分析用WEBアプリの4機能を有したソースを全て公開しました!
https://bookers.tech/post/d0aa21b5-1dea-4a61-a0ae-079499f694d9
こちらの記事を購入される場合は、全体ソースを入手して頂く方が、今後も全体ソースのバージョン更新予定なので、ぜひご検討ください。

1.目的

 ネットから少ないアクセス回数必要最低限の情報確実に取得するのがスクレイピングの大事なところです。そのため、無駄なアクセス回数を減らすようにスクレイピングのコードを作成することは、1アクセス1,2秒待つマナーと同じぐらい大事なことです。無駄なアクセスが増えるとアクセス先への迷惑にもなるし、実行時間も長くなるという双方とも不幸になりかねません。
 しかし、現在出回っている競馬データをスクレイピングするコードは無駄なアクセスを1,000回余りも行っているものを教本かのように公開されているのが現状です。(※1)
 そのため、本記事では無駄なアクセスを減らす工夫を取り入れたスクレイピング用のソースを共有します。
注意:普通じゃコピペできないようになっているようです。(工夫すればコピペはできるけど、、) 使用する方は写経覚悟で購入ください。
(※1) こちらのサイトの冒頭を参照↓
【2024年最新版】Pythonで競馬データを効率よくスクレイピングする方法:競馬予想プログラムソフト開発 | ゆっくりデータサイエンスLab (keiba-ds-lab.com)

2.前提事項

2.1 想定する利用者

  • Pythonを使っている方
  • 競馬予想がしたい方
  • スクレイピングして競馬データの収集をしている方
 本ソースはPythonの勉強目的を主としています。そのため、スクレイピングを容認・推奨はしていないことご承知おきください。つまり、本ソースは間違ったスクレイピングをしないためにはどうすればいいか?→アクセス回数を減らす努力をしましょう。ということを伝えるものです。
 すでに他の競馬予想プログラム販売者からスクレイピングコードを購入された方も、少なくとも仕組みを確認して自身のコードに落とし込むようにしましょう。

2.2 ソースコードのコアな部分は共有済

ソースコードの根本的なアイデアとなっている部分は別サイトで公開しています。私が管理運営しているサイトなので、良ければ立ち寄ってください。
サイトURL:【2024年最新版】Pythonで競馬データを効率よくスクレイピングする方法:競馬予想プログラムソフト開発 | ゆっくりデータサイエンスLab (keiba-ds-lab.com)
上記サイト記事を参考に自力でできる場合は、ご自身で作成されることをおすすめします
本記事で共有するソースは、スクレイピングしたHTMLソースをデータベース(sqlite3)へ保存するようにしているので、宗教上の理由で別の形式で保存管理したい方などは、自力作成した方が良いかと思います。予めご了承ください。

2.3 動作環境

動作環境とは、現状動作確認ができている環境ということです。Windowsで開発していますが、おそらくMacやLinuxでも動くはずです。
  • Windows 10 pro
  • メモリ32GB
  • Python3.10.5

2.4 必要なPythonパッケージ

以下に必要なパッケージをリストします。pandasとか近々バージョンが変わりそうな気配なので、バージョンも明示的に指定してpipインストールすることをおすすめします。
※購入された方で、パッケージのバージョン依存によるコマンドエラーが起きた場合は対応出来かねますので、なるべく揃えていただけると問題があった際にフォローしやすいかと思います。。。
  • pandas==2.1.1
  • numpy==1.26.1
  • tqdm==4.66.1
  • Beautifulsoup4==4.12.2
  • requests==2.31.0

3.プログラム仕様

3.1 フォルダ構成

以下プログラム動作時に前提となるフォルダ構成です。事前に記載のあるフォルダは作成していただくようお願いします。
中括弧「<>」でくくられているのがフォルダ名。それ以外はファイル名です
また、<any-dir>任意のフォルダ名です。作業用フォルダなので、お好きな名前にしてください
有料記事部分では、この各種ファイルの中身を上から順番に列挙しています。
ソース内にコメントを残していたりいなかったりしていますが、なるべく1機能1メソッド単位で作成しているので、内容を理解したい方はぜひ読み込んでみることをおすすめします。

3.2 コマンド仕様

3.1で説明したフォルダ構成のうち、コマンドプロンプトで実行するのはcmd_first_scraping.batcmd_scraping.batの2ファイルです。
MacやLinuxの場合、batファイルは実行できないのですがファイルの内容を見ていただければ、MacやLinuxを使用している方なら容易に理解できる内容になっていると思います。(単順に引数指定してmain.pyを実行しているだけなので。)
なので、shellスクリプトは用意していません。(shellスクリプトを実行できる環境がないためでもあります。すみません、、)

cmd_first_scraping.bat

一番最初に実行するものです。2010年から2024年最新のレース情報まで欲しい場合は以下のコマンドを実行してください。
cmd_first_scraping.bat --all --start-year 2010 --end-year 2024
ヘルプが見たい場合は以下を実行。指定できる引数オプションについて知ることができます。
cmd_first_scraping.bat --help
そんなにいらない場合は、--start-year 2015とか好きな開始年度を指定してください。

cmd_scraping.bat

定期的に実行して最新のレース情報を取得したい場合に実行するものです。
以下のコマンドを実行してください。特に引数は不要です。
cmd_first_scraping.bat
ヘルプが見たい場合は、先ほどと同様に「--help」をつけて実行してください。

3.3 実行したらどうなる?

3.2で説明したコマンドを実行すると、3.1で説明したフォルダ構成の<data>フォルダの配下に「keibahtml.db」と「keibadata.db」の二つのデータベースファイルが作成されます。
keibahtml.dbには、スクレイピングしてきたサイトのHTMLソースが管理されます。(1年分を取得するのに約1GBストレージを使用します。ご注意ください。)
keibadata.dbには、HTMLソースを解析して必要なテキスト情報を抜き出した情報が入っています。
DB Browser for SQLiteというフリーソフトを使えば、データベースファイルにどのようなテーブルがあって、どのようなレコードが入っているのかが簡単に確認できます。
DBでデータを管理したいモチベはこのようなフリーソフトで簡単に中身を見れるからです。
pickleファイルで管理したい人もいらっしゃるかと思いますが、pickleファイルの中身を見るにはわざわざファイルをloadする処理を書いて標準出力なりする必要がありなかなか面倒だと思います。あくまでSQLite用ですがデータベースファイルの中身をUIベースで確認できるフリーソフトがあるのは魅力だと思います。
以下は、実際に自分がスクレイピングしたときのkeibadata.dbの中身になっています。こんな感じでデータが取れます。参考までにどうぞ。
テーブル一覧
Select an Image
raceinfo2024の内容:レース情報
Select an Image
racedata2024の内容:出走馬情報
Select an Image
racerefund2024の内容:払戻情報
Select an Image
他にも馬の出生日血統情報などを含んだテーブルも入っています。

4.有料範囲の内容

有料範囲では、3.1で説明したフォルダ構成でファイル名となっている箇所のソースを上から順に列挙しています。
すべてで9コードになります。
コード量は以下表を参照ください。配置先フォルダは上記フォルダ構成にあるフォルダ名に準拠しています。
Add row above
Add row below
Delete row
Add column to left
Add column to right
Delete column
配置先フォルダ
ファイル名
コードのみ行数
概要
<any-dir>/<src>/<core>/<db>
controller.py
89行
DBを操作するための関数が入っています。
<any-dir>/<src>/<core>/<meta>
scrape_url.py
16行
スクレイピング先URLの情報
<any-dir>/<src>/<core>/<meta>
table_info.py
138行
DBのテーブル情報を管理するクラスが入っています。
<any-dir>/<src>/<core>/<util>
data_operator.py
5行
若干ややこしい処理を関数化して使いやすくする関数が入っています。あまり使いどころがないです。
<any-dir>/<src>/<scraping>
data_scraper.py
364行
HTMLソースを取得しDBへ登録するクラスです。
<any-dir>/<src>/<scraping>
process_htmlsrc.py
460行
HTMLソースを解析して、必要なテキスト情報を抜き出し、DBへ登録するクラスです。
<any-dir>/<src>/<scraping>
main.py
81行
code 5とcode 6を実行する関数が入っています。code 6については並列処理化しています。
<any-dir>
cmd_first_scraping.bat
1行
一番最初に実行するコマンドです。使い方は3.2節参照
<any-dir>
cmd_scraping.bat
3行
更新されたレース情報だけを差分で取得するコマンドです。使い方は3.2節参照
クラス定義等はオブジェクト指向フル無視のなんちゃってクラス定義になっています。
個人開発レベルのものなので特に自分は気にしない派ですが、宗教上の理由でどうしても許容できない方は適宜修正ください。

5.留意事項

有料記事を購入検討されている方へ、購入する前にご一読ください。
本記事を購入された際は以下の留意事項に同意したものとします。予めご了承ください。
  1. 本ソースは商品ではなく勉強目的で使用されることを想定して作成しました。バグ取りは十分できていないので、購入者様側でバグ対応をしていただく必要があります。
  2. 本ソースはコピーガードされています。コード行数が1,000行ありますので、根気が必要なのとタイプミスにはお気を付けください。
  3. 本ソースを使用したことによって、購入者様に不利益や違法行為があった場合でも本ソース作成者は一切の責任を負わないことご承知おきください。
  4. 基本的には写経すれば動くプログラムになっていますが、内容を理解したい場合はPythonの入門書レベルの文法を理解していることを前提としています。
 項番1については、プログラム書く以上バグは絶対に直面するものです。挫けずにバグ対応しましょう。必ず良い勉強機会になります。
 エラー内容をコピペして調べると、必ずどこかで同じ目に合っている人がいます。そしてそれを解決してくれる通りすがりのプログラマが答えやヒントを出してくれています。わからなければまずは調べることを徹底してください。頑張りましょう。

6.宣伝

これから今回のような競馬予測ソフトを開発の工程や実際のソース公開をリアルタイムで更新していきます。
YouTubeでソースのエッセンス部分の紹介、運営サイトでソースの重要な処理部分の紹介をしているので、良ければYouTubeや運営サイトも立ち寄っていただけると嬉しいです!
Twitter(自称X)もやっていますので、フォローよろしくお願いします!
また、YouTubeのチャンネル登録していただけると、1000円引きで購入できます

この続き:51774文字

【競馬予想プログラムソフト#1】低アクセス回数で競馬データをスクレイピングする方法
ゆっくりデータサイエンス
2250円

もしくは