PR

【生成AI×競馬】出馬表をGemini+MCPで取得!【プロンプト公開】

この記事は約27分で読めます。
スポンサーリンク
how-to-scraping-useing-mcp.md

【生成AI×競馬】出馬表をGemini+MCPで取得!【プロンプト公開】

スポンサーリンク

1. 本記事の目的

Gemini CLIを使って、競馬の出馬表をスクレイピングする方法の解説になります。
通常のGemini CLIでは指定したサイトの情報をスクレイピングすることは非常に難しいタスクですが、「Chrome devtools MCP」を使用することで実現できます。

解説動画も出しています
競馬予想AI #31 MCPで出馬表を取得し馬券予測で回収率173%!【ゼロから作る競馬予想モデル・機械学習入門 part31】

この記事で紹介するプロンプトは『ゼロから作る競馬予想モデル・機械学習入門』で作成しているWEBアプリにインポートするためのCSVファイルを生成するものです

よろしければ、チャンネル登録・ゼロから作る競馬予想モデル・機械学習入門シリーズ・ソース取得よろしくお願いいたします

スポンサーリンク

2. Chrome DevTools MCPとは?

この節はAIによる生成です


AIエージェントに「目」を与える革新

2025年にGoogleが発表した「Chrome DevTools MCP」は、AIコーディングアシスタントの能力を飛躍的に拡張する革新的なプロトコルです。従来のAIは、コード生成こそ得意でも、生成したコードがブラウザ上でどう動作するかを直接確認する手段を持ちませんでした。
MCPはこの制約を打破し、AIがChromeブラウザと直接対話できるようにすることで、開発者のデバッグ・検証・自動化のワークフローを根本から変革します。

MCP(Model Context Protocol)とは

LLM(大規模言語モデル)と外部ツールを接続するためのオープンスタンダードであり、Chrome DevTools MCPはその実装の一つです。これにより、CopilotやGemini CLIなどのAIエージェントが、Chrome上でリアルタイムにコード変更を検証したり、ネットワークエラーやコンソールエラーを診断したり、ユーザー行動をシミュレートしたりすることが可能になります。さらに、パフォーマンス監査やスタイリングの問題の特定も自動化できるため、開発者は推測ではなく証拠に基づいた修正が行えるようになります。

Chrome DevTools MCPは、既存のChromeブラウザをそのまま利用し、ログイン状態やセッション情報を保持したままAIが操作できる点も大きな利点です。これにより、従来の自動化ツールにありがちな「新しいブラウザを立ち上げることでセッションが切れる」といった問題も回避されます。


ここまでAIによる生成です。

導入方法

以下の記事で、Gemini CLIにChrome devtools MCPを導入する方法を解説しています。
Gemini CLI+Chrome devtools MCPのセットアップ

スポンサーリンク

3. 仕組み

以下では、geminiからMCP経由でnetkeiba様の出馬表情報を取得するまでの流れの図解になります。

処理流れ

C4Container Person(customer, User, "ユーザ", $tags="v1.0") System_Ext(browser, "Chrome", "出馬表サイト") Boundary(c1, "Gemini CLI", "ターミナル"){ System(gemini, "gemini-2.5-pro", "回答生成,MCP操作", $tags="v1.0") System(MCP server, "Chrome devtools mcp", "ブラウザ操作", $tags="v1.0") } Rel(customer, gemini, "指示", "出馬表取得") UpdateRelStyle(customer, gemini, $offsetY="-85", $offsetX="0") BiRel(MCP server, gemini, "やり取り", "情報受渡") UpdateRelStyle(MCP server, gemini, $offsetY="5", $offsetX="-30") Rel(MCP server, browser, "操作", "出馬表アクセス") UpdateRelStyle(MCP server, browser, $offsetY="-110", $offsetX="0") UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="1")

大した図ではないですが、流れとしてはユーザがGeminiに指示を送ると、要求に従ってブラウザ操作が必要だと判断した際にMCP経由でChromeを操作してサイトの情報をMCPから受け取るといったイメージです。

MCPが必要な理由

この構成の画期的なところはGeminiがサイトの情報をHTMLソースレベルまで覗き見ることができることです。
従来のAgentのみの構成だと、サイトへのアクセスや特定要素の取得方法をプログラムコードとして提案するところまでしかできず、生成したそのコードの確かさ、つまり、取得した要素が要求通りに取得できているかを確認するすべがありませんでした。

そこで今回のChrome devtools MCPをGeminiと連携させることで、GeminiはMCP経由でブラウザを操作しブラウザのHTMLソースを受け取ることで、GeminiのAgentは指示された必要な情報を取得し、指示通りの要素が取れているかの検証までできるというのが今回のMCPの画期的なところです。
これを、生成AIに目を与えると表現しているようです。

スポンサーリンク

4. 実際に出馬表を取得する

プロンプトの構成

出馬表情報を取得してCSVファイルに保存するためには、以下のような順序建てが必要になります。

  1. 出馬表サイトにアクセス
  2. 抽出項目の列挙
  3. 保存形式
  4. 次の行動/終了条件

1. 出馬表サイトにアクセス

ここはURLを指定して対応。当日のレースURLの取得までAIに任せるのは冗長。
こちらでURLを指定する程度ならとりわけ苦労はないと思います。

2. 抽出項目の列挙

CSVファイルとして保存する各項目がサイトのどこにいるのかを指定する。
例えば、レース名を取得したい場合プロンプトでは以下のように指定しています。

2. raceName: * レースに固有の名称(G1名など)があればその名称(例: 「オクトーバーS」)。 * 固有の名称がなければ、raceDetail(例: 「2歳未勝利」)を入れる。

3. 保存形式

取得した情報をどのような場所に、どのように保存するかを指定します。
今回でいうと、以下のようにoutputフォルダ配下にraceinfo_{place}.csvで保存のように指定しています

出力形式: 1行目にヘッダー(raceId,place,raceName,...)、2行目以降に抽出した全レースのデータを1行1レースごとにカンマ区切りで出力し、内容をutf-8でraceinfo_{place}.csvとして、outputフォルダに保存する

4. 次の行動/終了条件

抽出項目の取得が完了したら、次にどうするかとどうなれば処理を終わりにするかを指定します。
簡単ではありますが、今回は以下のように指示しています。

- 抽出が完了したら次の2Rも同様に、12Rレースまで取得お願いします

上記のような流れでプロンプトを組んでいます。

共有するプロンプト

『ゼロから作る競馬予想モデル・機械学習入門』のWEBアプリにインポートするために2種類のCSVを用意する必要があります。
そのため、以下の2種類のプロンプトを用意しました。

  1. get_race_info.md
    レース情報を取得してCSVにするプロンプトです。
  2. get_race_data.md
    出馬表情報を取得してCSVにするプロンプトです。

ここから実際のプロンプトです

以下ではGemini CLIを使って実際にnetkeiba様にアクセスして出馬表情報を取得してCSVファイルに保存するまでの指示を出すmarkdownです。

🚫 Danger:
以降のプロンプト例集の著作権は作者に帰属します。
営利目的での利用(商用利用)は禁止します。
非営利目的での利用・改変・再配布は許可しますが、出典の明記と原文の複製・転載の禁止を条件とします。

レース条件を取得するプロンプト

📄 ファイルパス: prompt/get_race_info.md

必ずChrome devtools MCPを活用して以下のサイトにまずはアクセス URL: https://race.netkeiba.com/race/shutuba.html?race_id={raceId} - 上記のnetkeibaの出馬表ページのURLから、下記の仕様に従ってレース情報を抽出し、CSV形式で出力してください。 - 抽出が完了したら次の2Rも同様に、12Rレースまで取得お願いします - 必要があれば真っ先にMCPサーバのツールを利用すること - リクエスト数とトークン数は最小限にすること - 1レース分の情報を取得したら0.2秒処理を待機 - 1レース目の抽出が完了したら、実行した処理のうち有効なものだけに絞って最適なパイプライン化し、その処理フローを繰り返すこと - ループ検出は不要 - 少なくとも12回は同じ処理をするのでそれ以上(15回ほど)をする場合があるときに知らせる - CSVへの書き込みは最後に行うこと - CSVの内容の検証は不要 - **禁止事項: 本賞金の項目は不要、絶対にCSVに含めるな** 抽出項目と仕様: 1. raceId: URLのrace_idパラメータの値。 2. raceName: * レースに固有の名称(G1名など)があればその名称(例: 「オクトーバーS」)。 * 固有の名称がなければ、raceDetail(例: 「2歳未勝利」)を入れる。 3. raceDate: レース日付。YYYY-MM-DD形式。 4. startTime: 発走時刻(例: 15:30)。 5. weather: 天候(例: 曇)。 6. raceGrade: gradeの項目と同じ 7. remarks: レースの付加的な条件。「(国際)(特指) ハンデ」や「牝[指] 馬齢」など。 8. direction: 回り方向。「右」または「左」。 9. inoutside: ページ内に「外回り」の記載があれば「外」と出力。なければ空欄。 10. distance: 距離を数字のみで抽出(例: 2000)。 11. field: 走路の種類。「芝」または「ダ」。 12. condition: 馬場状態(例: 良)。 13. week: 開催⽇の週(1⽉1⽇の週を1としてカウント; 開催日の月日が1月1日から何週目か?を表す項目) 14. month: 開催月 15. day: 開催日 16. place_detail: 開催場所詳細。1回東京2日など。 17. place: 開催地(例: 東京)。 18. raceNo: レース番号 19. raceDetail: レースの区分、クラス、年齢(例: 「サラ系3歳以上 オープン L 18頭」のとき「3歳以上オープン」のみが該当する)。 20. isGrade: 重賞(G1,2,3)なら1、それ以外は0 21. stakes: オープン(重賞含む)レース名称。安田記念など 22. grade: レースグレード(G1, G2, G3, L) 出力形式: 1行目にヘッダー(raceId,place,raceName,...)、2行目以降に抽出した全レースのデータを1行1レースごとにカンマ区切りで出力し、内容をutf-8でraceinfo_{place}.csvとして、outputフォルダに保存する --- © 2025 keiba-ds-lab.com. All rights reserved. ---

上記のmarkdownファイルを以下のフォルダ配下に設置している
prompt/

実際に使用する場合は、2行目のURLを指定する箇所の{raceId}に、取得したいレースのraceIdを入力してください

URL: https://race.netkeiba.com/race/shutuba.html?race_id={raceId}

Gemini CLIで指定する場合は、以下の画像のように「@prompt/get_race_info.md」と入力するとよい。
alt text

生成AIに取得を任せるので、必ず同じ結果になるとは断言できないことを承知していただいて、うまく実行できると以下のようなCSVファイルがoutputフォルダ配下に作成されます。

📄 ファイルパス: output/raceinfo_{place}.csv

raceId,raceName,raceDate,startTime,weather,raceGrade,remarks,direction,inoutside,distance,field,condition,week,month,day,place_detail,place,raceNo,raceDetail,isGrade,stakes,grade raceid001,2歳未勝利,2123-10-31,09:45,晴,2歳未勝利,別定,左,外,1100,芝,良,44,10,31,4回品川1日目,品川,1,2歳未勝利,0,, raceid002,2歳未勝利,2123-10-31,10:15,雪,2歳未勝利,馬齢,左,,8000,ダ,良,44,10,31,4回品川1日目,品川,2,2歳未勝利,0,,

出走馬一覧を取得するプロンプト

📄 ファイルパス: prompt/get_race_data.md

必ずChrome devtools MCPを活用して以下のサイトにまずはアクセス URL: https://race.netkeiba.com/race/shutuba.html?race_id={raceId} - 上記のnetkeibaの出馬表ページのURLから、下記の仕様に従って競走馬情報を1馬1行ごとに以下の情報を抽出し、CSV形式で出力してください。 - リクエスト数とトークン数は最小限にすること - 1レース分の情報を取得したら0.2秒処理を待機 - 1レース目の抽出が完了したら、実行した処理のうち有効なものだけに絞って最適なパイプライン化し、その処理フローを繰り返すこと - ループ検出は不要 - 少なくとも12回は同じ処理をするのでそれ以上(15回ほど)をする場合があるときに知らせる - 全競走馬の抽出項目の抽出が完了したら次の2Rも同様にアクセスし抽出、12Rレースの競走馬情報まで同様に取得お願いします - 次のレースは、URL末尾の下二桁を+1したURL。つまり、末尾の下二桁が01なら次は02に変えたURLへアクセスすること - CSVへの書き込みは最後に行うこと 抽出項目と仕様: 1. raceId: URLのrace_idパラメータの値。 2. horseNumber: 馬番の項目 3. horseBoxNum: 枠の項目 4. horseName: 馬名の項目 5. horseId: 馬名項目のリンクURLの末尾の数字。(https://…/horse/2023102364でいう「2023102364」の箇所) 6. horseSex: 馬の性別(性齢項目の1文字目) 7. horseAge: 馬の年齢(性齢項目の2文字目以降) 8. horseOdds: オッズの項目 9. horseFavorite: 人気の項目 10. horseWeight: 「馬体重<br><small>(増減)</small>」項目の馬体重の部分。484(-3)のとき484の箇所 11. horseGl: 「馬体重<br><small>(増減)</small>」の増減の部分。484(-3)のとき-3の箇所 12. jockeyName: 騎手の項目 13. teacherName: 厩舎の項目 14. jockeyId: 騎手項目のリンクURLの末尾の数字。(https://…/jockey/result/recent/01154/でいう「01154」の箇所) 15. teacherId: 厩舎項目のリンクURLの末尾の数字。(jockeyIdと同様の取得方法と同じ; https://…/trainer/result/recent/01151/でいう「01151」の箇所) 16. jockeyWeight: 斤量の項目 17. place: 開催地(例: 東京; 地名のこと)。 出力形式: 1行目にヘッダー(raceId,place,horseNumber,...)、2行目以降に抽出した競走馬データを1行1競走馬ごとにカンマ区切りで出力し、内容をracedata_{place}.csvとして、outputフォルダに保存する --- © 2025 keiba-ds-lab.com. All rights reserved. ---

プロンプト場所や保存場所、呼び出し方はget_race_info.mdと同じです。

こちらも同様、生成AIに取得を任せるので、必ず同じ結果になるとは断言できないことを承知していただいて、うまく実行できると以下のようなCSVファイルがoutputフォルダ配下に作成されます。

📄 ファイルパス: output/racedata_{place}.csv

raceId,place,horseNumber,horseBoxNum,horseName,horseId,horseSex,horseAge,horseOdds,horseFavorite,horseWeight,horseGl,jockeyName,teacherName,jockeyId,teacherId,jockeyWeight raceId1,品川,1,1,うま1,horseId1,牝,2,12.2,5,418,+24,騎手A,調教B,J001,T001,51.0 raceId1,品川,2,2,うま2,horseId2,牝,2,35.3,11,444,+44,騎手B,調教A,J002,T002,52.0
スポンサーリンク

5. CSVをWEBアプリへインポート

作成されたraceinfo_{place}.csvracedata_{place}.csv『ゼロから作る競馬予想モデル・機械学習入門』のWEBアプリへインポートすることで、取得した出馬表をWEB画面で確認できるようになります
今後の開発としてこのWEB画面から各レースの推奨馬券を提案する機能を追加予定です

以下のgif通りに操作するとインポートできます
alt text

CSVインポート機能の詳細はこちらの記事をご覧ください。
CSVインポート機能 詳細

スポンサーリンク

6. 重要: 注意点

注意点は2点あります

1点目:免責事項

このプロンプト自体はスクレイピング操作そのものになります。
ご使用の際は自己責任でお願いいたします。
また、本プロンプトを使用したことで使用者に不利益が生じた場合でも、keiba-ds-lab.com側は一切の責任を負いません。
予めご了承ください。

2点目:無料枠の限界

Gemini CLIは無料枠も用意してくれており、Googleアカウントで認証すれば個人でも無料で利用できます。
ただし、APIコール数に制限があるため1日で使える回数に限りがあるのと公開されている利用制限はざっくりとしたもので、いきなりAPI制限を食らうこともよくあります
今回共有したプロンプトは、MCP連携やHTMLソースを操作するためAgentの使用回数がかなり膨らみます
必要以上に処理がかかる場合はすぐに処理を打ち止めにしてメモリクリア後に再実行するなりして使用数を節約しましょう。

スポンサーリンク

7. MCPのみで出馬表を取得する方法

実は、MCPのみを動かして出馬表を取得する方法があります。
MCPは単なるプロトコルなので、呼び出すのは生成AIでもプログラムからでも問題ありません。
つまり、プログラムを作れば生成AIの利用登録なく出馬表を自動取得することも十分可能です。

その方法を解説した動画を出しています。
良ければお立ち寄りください。

また、実際に動かしたい場合は『ゼロから作る競馬予想モデル・機械学習入門』を入手ください。

コメント

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