pandas의 read_html을 사용하여 경마 데이터를 스크래핑하는 방법

목적



기계 학습으로 경마 예상하고 회수율 100%를 목표로 한다.

이번에 할 일



netkeiba.com에서 2019년 전체 레이스 결과를 스크래핑. table 태그가 붙어 있는 데이터는 pandas의 read_html을 사용하면, 1행으로 스크래핑 할 수 있으므로 편리.
pd.read_html("https://db.netkeiba.com/race/201902010101")[0]



소스 코드



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을 사용하여 레이스 날짜 및 날씨와 같은 자세한 데이터를 스크래핑합니다!
또, 동영상으로 상세한 해설을 하고 있습니다!
경마 예상으로 시작하는 데이터 분석 · 기계 학습

좋은 웹페이지 즐겨찾기