見出し画像

【Python】地方競馬のオッズをスクレイピング

以前 Google Apps Script を使って書いた記事の Python 版です。

netkeiba から地方競馬のオッズを、今回は Python を使って取得しようと思います。

1. Requests パッケージを使った方法

コード

race_id = "202254110511"
url = f"https://nar.netkeiba.com/odds/index.html?type=b1&race_id={race_id}"
import requests
from bs4 import BeautifulSoup

response = requests.get(url)
soup = BeautifulSoup(response.content)
odds_tan_block = soup.find('div', attrs={'id': 'odds_tan_block'})
trs = odds_tan_block.find_all('tr')

for n, tr in enumerate(trs):
    if n == 0:
        continue
    horse_name = tr.find("td", attrs={"class": "Horse_Name"}).text
    odds = float(tr.find("td", attrs={"class": "Odds"}).text)
    print(n, horse_name, odds)

実行結果

Requests で取得した単勝オッズ

2. pandas パッケージを使った方法

シンプルなページのスクレイピングなら pandas パッケージの read_html 関数を使うのが楽です。

コードと実行結果

race_id = "202254110511"
url = f"https://nar.netkeiba.com/odds/index.html?type=b1&race_id={race_id}"
import pandas as pd

tansho_odds_df, fukusho_odds_df = pd.read_html(url)

tansho_odds_df
pandas で取得した単勝オッズ

複勝オッズも取得できています。

fukusho_odds_df
pandas で取得した複勝オッズ

複勝オッズの場合、最低オッズと最高オッズが一繋がりの文字列になっているので、数値として扱うためには分解する必要があります。

コード

fukusho_odds_df['最低オッズ'] = fukusho_odds_df['オッズ'].map(lambda x: float(x.split('-')[0]))
fukusho_odds_df['最高オッズ'] = fukusho_odds_df['オッズ'].map(lambda x: float(x.split('-')[1]))
fukusho_odds_df.drop('オッズ', axis=1, inplace=True)
fukusho_odds_df

実行結果

この記事が気に入ったらサポートをしてみませんか?