【Excel Power Query】JRAオッズ自動取得!JavaScript「doAction」で動くサイトを攻略するPOST送信徹底解説
概要
「Webサイトからデータを取得したいのに、なぜかうまくいかない…」そんな経験はありませんか?多くのサイトで採用されているJavaScriptの「doAction」という仕組みの裏側を解明し、Power QueryでPOST送信を再現する方法を初心者向けに徹底解説します。
この動画では、JRA(日本中央競馬会)の公式サイトを具体例に、普段のURLアクセス(GETメソッド)では取得できない動的なコンテンツを、Power Queryを使って自動で取得する手順を紹介します。開催地やレースを自由に選択してオッズ情報を手に入れる方法まで、段階を追って一緒に作成していきましょう。この記事と動画を見れば、今まで諦めていたWebサイトからのデータ取得に応用できる知識が手に入ります!

解説動画
まずは、実際の一連の流れをご覧ください。この記事では、動画内の各ステップをスクリーンショット付きで詳しく解説していきます。
操作の説明:JRAオッズ取得までの全ステップ
STEP 1: Power Queryエディタの準備
まずは、Power QueryでWebサイトの情報を取得するための準備をします。
- Excelの[データ]タブを開く
- [データの取得] > [その他のデータソースから] > [空のクエリ] を選択します。
ここに、Excelメニューの「データ > データの取得 > その他のデータソースから > 空のクエリ」を指し示しているスクリーンショットを挿入
![]()
これにより、Power Queryエディタが起動します。次に、エディタの[詳細エディター]を開き、後述するソースコードを貼り付けます。
ここに、Power Queryエディタが起動し、「詳細エディター」ボタンがハイライトされているスクリーンショットを挿入
[動画で確認する→ 00:04:07 取得手順② エディタ起動]
STEP 2: 初回接続と資格情報の設定
ソースコードを貼り付けて実行すると、初回のみ「資格情報」の設定を求められます。これは、外部のWebサイトへアクセスして良いかどうかの許可設定です。
ここでは[匿名]を選択し、[接続]をクリックします。
ここに、「資格情報を編集してください」のダイアログが表示され、「匿名」が選択されているスクリーンショットを挿入
[動画で確認する→ 00:08:28 初回接続の重要ポイント]
【本題】なぜPOST送信が必要なのか?サイトの仕組みを解明
ここからがこの解説の核心部分です。なぜ、単純なURLアクセスではJRAのオッズを取得できないのでしょうか。その謎を解明していきます。
調査①:ページのソースコードから「doAction」を発見
JRAのトップページで「オッズ」ボタンの上で右クリックし、「ページのソースを表示」または「検証」を選択すると、HTMLソースコードを見ることができます。
ここに、JRAサイトの「オッズ」ボタンと、そこから表示されたHTMLソースコードで
onClick="doAction(...)"の部分がハイライトされているスクリーンショットを挿入
すると、オッズボタンのリンク先(href)は#になっており、代わりにonClick="doAction(...)"というJavaScriptが実行される仕組みになっていることが分かります。これが、単純なURLではアクセスできない理由です。
[動画で確認する→ 00:13:11 調査② doActionの発見]
調査②:外部JSファイルでdoActionの正体を突き止める
doActionの具体的な処理内容を探るため、HTMLソースの上部で読み込まれているJavaScriptファイルの中から、common2.jsという共通ファイルに注目します。
ここに、
common2.jsファイルの中身が表示され、function doAction( url , cname )とdocument.getElementById( "commForm01" ).submit();の部分がハイライトされているスクリーンショットを挿入![]()
このファイルの中身を見ると、doAction関数は、引数で渡されたurlとcnameを使って、commForm01という名前のフォームをsubmit()(送信)していることが判明します。
調査③:フォームの送信方式が「POST」であることを確認
最後に、HTMLソースコードの下部にあるcommForm01の定義を確認します。
ここに、HTMLソースコードの下部にある
<form id="commForm01" method="POST" ...>の行がハイライトされているスクリーンショットを挿入
ここにmethod="POST"と明記されていることから、このサイトのページ遷移はPOST送信によって行われていることが確定します。
解決策:Power QueryでPOST送信を再現する
この仕組みをPower Queryで再現するには、Web.Contents関数にHeadersとContentのオプションを追加します。
let
strURL = "[https://www.jra.go.jp/JRADB/accessO.html](https://www.jra.go.jp/JRADB/accessO.html)",
strPARA = Text.ToBinary("cname=pw15oli00/6D"),
strHEAD = [#"Content-Type"="application/x-www-form-urlencoded"],
ソース = Web.Contents(strURL, [Headers = strHEAD, Content = strPARA])
// ...以降の処理...
in
ソース
これで、JRAサイトの仕組みに対応したデータ取得が可能になります。
[動画で確認する→ 00:18:46 Power Queryへの応用]
応用編:動的にオッズ情報を取得する
仕組みが分かれば、あとは応用です。動画では、Excelのセル(名前付き範囲)を使って、開催地やレース番号を動的に変更し、目的のオッズ情報をピンポイントで取得する方法までを解説しています。
[動画で確認する→ 00:35:40 応用編② Excelの名前機能でパラメータを渡す]
このブログで伝えたかったこと
まとめ
この解説で最も伝えたかったのは、単なる操作手順に留まらない、**Webサイトの裏側にある「仕組み」を理解し、それに基づいてPower Queryを構築する「思考のプロセス」**です。一見複雑に見える動的なWebサイトも、HTMLやJavaScriptのソースを丁寧に読み解くことで、データ取得の糸口を見つけることができます。
未解決の課題と対処法
動画の終盤で触れている通り、現状では馬連や馬単など、複数のHTMLテーブルに分割されて表示されるオッズ情報を完全には取得できません。
これは、現在のクエリがページ内の最初のテーブル(Table[0])のみを取得しているためです。
この課題に対処するには、Power Queryの**Table.Combine()関数**が有効です。ページ内の全テーブルをリストとして取得し、この関数で一つに結合することで、完全なオッズ表を作成することが可能になります。この詳細については、また別の機会にご紹介したいと思います。
参考リンク
動画内で使用したソースコード・関連動画
- JRA公式サイト
- Power Queryのソースコード 1.JRAオッズのTOPページを取得する パワークエリ
- Power Queryのソースコード 2 パワークエリ Actionと回を条件に結果を絞り込む
- Power Queryのソースコード 3 パラメーターを切り出す
- Power Queryのソースコード 4.CNAMEと名前を付けたパラメーターのページを読み込み
- Power Queryのソースコード 5.開催別にレースを抜き出す
- Power Queryのソースコード 6.JRAの情報ページからテーブルの0番目を単純に取り込む
- 関連動画: JRAオッズ取得 onClick doAction が なんでPOSTだとわかったんですか 質問をもらったので説明してみた
- 関連動画: LIVE パワークエリでHTMLソースを取得 POSTページの値を取得したい JRAのオッズページを読み込む エクセルPower QueryでWebのソースとTABLEをGet Webクエリーを使用
- 関連動画: LIVE パワークエリでweb上の指定位置の文字列を取得する方法 実例としてJRAレース名と時刻を取得
- 関連動画: Power Query B2の銘柄コードで株式信用残高の表をWebから取得する Excel WebクエリでURLの一部をパラメータで変更する方法 パワークエリでセルの値を参照利用 作成手順








