python

murata not public netkeiba scraping

import pandas as pd
import time
# プログレスバーの表示
from tqdm import tqdm_notebook as tqdm

# 対象のurlの構造分析
# 'https://db.netkeiba.com/race/202006030301'

# ex.
# 202006030301について
# 2020 → 西暦
# 06 → 開催場 ('札幌', '函館', '福島', '新潟', '東京', '中山', '中京', '京都', '阪神', '小倉')
# 03 → 上記開催場の何回目
# 03 → 上記開催場の上記回の何日目
# 01 → レース番号

race_id_list = []
# 開催上
for place in range(1,11,1):
    # ~回
    for kai in range(1,6,1):
        # ~日
        for day in range(1,9,1):
            # ~R
            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)   


# 途中中断し、再開した時を想定し、読み込み済みの結果を第2引数に
def scrape_race_results(race_id_list,pre_race_results={}):
    # 既に読み込み済の結果を反映
    race_results = pre_race_results
    # tqdmにより、進捗を表示させる
    for race_id in tqdm(race_id_list):
        
        # レースIDが読み込み済のリスト内にある場合は、ここで処理を中断し、for文へ戻す
        if race_id in race_results.keys():
            print(race_id)
            continue
        try:
            url = "https://db.netkeiba.com/race/" + race_id
            race_results[race_id] = pd.read_html(url)[0]
            time.sleep(1)
            
        # 該当のIDにレース情報がなかった場合にも中断しないようにする。
        except IndexError:
            continue
        # スクレイピング自体を中断しても、race_resultsを返してくれるようにする。
        except:
            break
    return race_results


 # テスト中断して実行するときに、左辺と右辺をそれぞれ1ずつずらして実行する(ex. test3 = ~ test2)
 test2 = scrape_race_results(race_id_list,test)

# 取得した各レースの結果データ(今は辞書型でそれぞれ分かれている)をつなげる処理
# つなげた際に識別できるように、IDをレースIDにしておく。

# 全てのレースIDを一つずつ取り出し、
for key in test.keys():
    # 各着版ごとにつけられているインデックスをレースIDに変換。長さは各レースのデータフレームの長さ(馬の数)分だけ置き換える。
    test[key].index = [key]*len(test[key])

# 全てをつなげ、1つのデータフレームにまとめる。行が入れ替わらないようにsort=Falseを設定。
results = pd.concat([test[key] for key in test.keys()], sort=False)

# pickle形式で保存
results.to_pickle('results.pickle')

# csvで保存
results.to_csv("results.csv", encoding='utf_8_sig')
Was this helpful?