netkeibaから出走表と結果を取得する方法【第2回】pythonスクレイピング

python

netkeibaからデータを取得するの第二弾です。

前回は指定の日付範囲から日程とレース一覧を取得しましたが、
今回は具体的な出走表と結果と払い戻しを取得します。

netkeibaには通常の結果とデータベースの結果ページが存在しますが、今回は前者をターゲットとします。

対象ページの確認

まずは出走表のページを見ると、

レースIDが書いてます。そして結果ページも同様です。

レースIDは前回のレース一覧で取得済みです。(RIDという列名で保存してます)

出走表ページに戻って、欲しい出走表がどのように配置されているか開発者ツールで確認します。

するとテーブルになっているので、こういう時は便利なpandasを使いましょう。

取得テスト

前回同様にget_driver関数でドライバを取得し、出走表のURLを入力してdriver.get(url)します。
そして以下のようにpandasのテーブルタグを読みこんでデータフレームリストで返す関数を使用します

data = pd.read_html(driver.page_source)
len(data) # テーブルが何個読み取られたか
# 5

お目当てのデータは最初のリストに格納されていました。

pandasを使用すると簡単に取得できますが、馬名に貼られているリンクは別途取得する必要があります。
今回は省略しますが、作成したツールの方では取得しています。

ココナラでツール作成販売もしています

出走表取得コード

def get_race_table(driver, race_id):
    url = f"https://race.netkeiba.com/race/shutuba.html?race_id={race_id}" # 禁止文字列のため、プロトコルやドメインは略
    driver.get(url)
    sleep(2)
    data = pd.read_html(driver.page_source)
    race_table = data[0]
    return race_table
    
  df = get_race_table(driver, "202305040911") # 天皇賞の秋の出走データを取得

結果と払戻しを取得

続いて結果ページも見てみると、まずURLのshutubaがresultにかわっただけで、結果テーブルと払い戻しはテーブル構造のため、1回のpd.read_html(driver.page_source)でまとめて取得できます。(ついでにラップタイム等も取得できます)

先程の関数を一部いじって少し加工して

def get_race_result(driver, race_id):
    url = f"https://race.netkeiba.com/race/result.html?race_id={race_id}" # 禁止文字列のため、プロトコルやドメインは略
    driver.get(url)
    sleep(2)
    data = pd.read_html(driver.page_source)
    result_table = data[0] # 結果
    payment1 = data[1] # 払い戻し1
    payment2 = data[2] # 払い戻し2
    return result_table, pd.concat([payment1, payment2])
    
race_id = "202305040911"
result_table, payment = get_race_result(driver, race_id) # 実行

結果

払い戻し

終わりに

以上で出走表と結果の取得は完了です。

あとは前回作成したレースリスト毎にループして出走表と結果を取得できます。

テーブル上のHTMLエレメントはpandasを使うと簡単に取得できますが、リンク等必要な場合は別途タグ解析する必要があります。

作成したツールでは馬コードも取得しております。次回の馬のプロフィールや過去成績データ取得に必要になります。

第2回 競馬の出走表と結果取得ツールを提供します 出走表と結果を自動スクレイピングで取得しよう
タイトルとURLをコピーしました