LoginSignup
30
28

More than 3 years have passed since last update.

pandasのread_htmlを用いて競馬データをスクレイピングする方法

Last updated at Posted at 2020-07-04

目的

機械学習で競馬予想して、回収率100%を目指す。

今回やること

netkeiba.comから2019年の全レース結果をスクレイピングする。tableタグがついているデータはpandasのread_htmlを使うと、1行でスクレイピングできるので便利。

pd.read_html("https://db.netkeiba.com/race/201902010101")[0]

スクリーンショット 2020-07-04 22.19.07.png

ソースコード

netkeiba.comでは1レースごとにrace_idが付与されているので、race_idのリストを入れたらそれぞれのレース結果をまとめてスクレイピングして辞書型で返してくれる関数を作る。

import pandas as pd
import time
from tqdm.notebook import tqdm

def scrape_race_results(race_id_list, pre_race_results={}):
    race_results = pre_race_results
    for race_id in tqdm(race_id_list):
        if race_id in race_results.keys():
            continue
        try:
            url = "https://db.netkeiba.com/race/" + race_id
            race_results[race_id] = pd.read_html(url)[0]
            time.sleep(1)
        except IndexError:
            continue
        except:
            break
    return race_results

今回は、2019年の全レース結果をスクレイピングしたいので、2019年の全race_idのリストを作る。

race_id_list = []
for place in range(1, 11, 1):
    for kai in range(1, 6, 1):
        for day in range(1, 9, 1):
            for r in range(1, 13, 1):
                race_id = (
                    "2019"
                    + str(place).zfill(2)
                    + str(kai).zfill(2)
                    + str(day).zfill(2)
                    + str(r).zfill(2)
                )
                race_id_list.append(race_id)

スクレイピングできたら、pandasのDataFrame型に変換してpickleファイルで保存する。

results = scrape_race_results(race_id_list)
for key in results:
    results[key].index = [key] * len(results[key])
results = pd.concat([results[key] for key in results], sort=False)
results.to_pickle('results.pickle')

次の記事では、BeautifulSoupを用いてレースの日付や天気などの詳しいデータをスクレイピングしています!
また、動画で詳しい解説をしています!
競馬予想で始めるデータ分析・機械学習
スクリーンショット 2020-07-04 22.03.00.png

30
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
28