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

コンテンツ
エンタメ・趣味
netkeibaからデータを取得するの第二弾です。
前回は指定の日付範囲から日程とレース一覧を取得しましたが、
今回は具体的な出走表と結果と払い戻しを取得します。
netkeibaには通常の結果とデータベースの結果ページが存在しますが、今回は前者をターゲットとします。

対象ページの確認

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

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

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

出走表ページに戻って、欲しい出走表がどのように配置されているか開発者ツールで確認します。
するとテーブルになっているので、こういう時は便利なpandasを使いましょう。
03.png

取得テスト

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

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

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

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

出走表取得コード

def get_race_table(driver, race_id):
    url = f"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") # 天皇賞の秋の出走データを取得

05.png

結果と払戻しを取得

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

06.png

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

def get_race_result(driver, race_id):
    url = f"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) # 実行

結果
07.png

払い戻し
08.png

終わりに

以上で出走表と結果の取得は完了です。
あとは前回作成したレースリスト毎にループして出走表と結果を取得できます。
テーブル上のHTMLエレメントはpandasを使うと簡単に取得できますが、リンク等必要な場合は別途タグ解析する必要があります。
作成したツールでは馬コードも取得しております。次回の馬のプロフィールや過去成績データ取得に必要になります。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す