すっかり間があいてしまったPython投稿。

今回は趣味である競馬関連のプログラムを組んでみようと思います。AI予想とか最終的にしたいですが、まずは、指定した種牡馬産駒の出走レースをリスト化するのを組んでみようかと思います。

参考はこちらのサイト。

https://agusblog.net/keiba-ai-scraping/

まずは、いつものように必要なライブラリ(beautifulsoup4, requests)をインストール。間があいてしまったせいか、pip のアップデートを求められましたが、無事完了。

で、ここまできて上記は結果のスクレイピングをされていることに気づきました。私は出馬表をスクレイピングしたいので、上記を参考にいろいろ頑張ってみようかと思います。

で、頑張りまして。

「BeautifulSoup」を使ってスクレイピングして気になる種牡馬の産駒をnetkeiba.comのサイトからゲットするpythonスクリプトができあがりました。リファクトしてないけど、こんな感じ。

import requests
from bs4 import BeautifulSoup
import time
import csv

def check_race( url_, race_ ):

    # ターゲット種牡馬
    target_stallion = [
        "パイロ",
        "ホッコータルマエ",
        "マクフィ"
    ]
    n_target_stallion = len(target_stallion)

    #リクエストを投げすぎるとエラーになることがあるため
    #失敗したら10秒待機してリトライする
    try:
        r=requests.get(url_)
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")
        print("Retrying in 10 seconds...")
        time.sleep(10)  # 10秒待機
        r=requests.get(url)
    #バグ対策でdecode
    soup = BeautifulSoup(r.content.decode("euc-jp", "ignore"), "html.parser")

    #種牡馬を取得
    soup_horse01 = soup.find_all("div", class_="Horse01" )
    #出馬頭数、馬名を取得
    soup_horse02 = soup.find_all("div", class_="Horse02" )
    horse_num=len(soup_horse02)
    horse_num=int(horse_num)
    #urlにデータがあるか判定
    if horse_num < 1:
        yBreakCounter+=1
        print('continue: ' + url)
        #continue
        sys.exit(0)

    for horse in range(horse_num):
        #父馬チェック
        str_stallion_ = soup_horse01[horse].text
        str_stallion_ = str_stallion_.replace("\n", "")
        str_stallion = str_stallion_.replace(" ", "")
        
        isApplicable = False
        for ii in range(n_target_stallion):
            if( str_stallion == target_stallion[ii] ):
                isApplicable = True

        #該当馬表示
        if( isApplicable == True ):
            #レース情報
            soup_racedata01 = soup.find_all("div", class_="RaceData01" )
            soup_racedata02 = soup.find_all("div", class_="RaceData02" )
            str_racedata01_ = soup_racedata01[0].text 
            str_racedata01 = str_racedata01_.replace("\n", "")
            list_racedata01 = str_racedata01.split()
            str_racedata02_ = soup_racedata02[0].text 
            str_racedata02 = str_racedata02_.replace("\n", "")
            list_racedata02 = str_racedata02.split()
            #馬名改行削除
            str_before = soup_horse02[horse].text
            str_before = str_before.replace("\n", "")
            str_after = str_before.replace(" ", "")
            print("#", list_racedata02[0], " ", str(race_), "R ", list_racedata01[2])
            print("\t", horse+1, str_after, "(",str_stallion,")")

#   ↓↓↓↓    デバッグ表示(出走頭数、チェック種牡馬数)    ↓↓↓↓
#    print('N :', horse_num)
#    print('T :', n_target_stallion)


base_url = 'https://race.netkeiba.com/race/shutuba_past.html?race_id='

print("Baee-RaceId : YYYY 場名ID 開催回 開催日")
print("01 札幌 /02 函館 /03 福島 /04 新潟 /05 東京 /06 中山 /07 中京 /08 京都 /09 阪神 /10 小倉")
base_raceid = input('input Base-RaceId: ')

# レース数のループ
race = 1;
while race <= 12:
    if( race < 10 ):
        url = base_url + base_raceid + '0' + str(race)    
    else:
        url = base_url + base_raceid + str(race)    
#   ↓↓↓↓    URL表示     ↓↓↓↓
#    print('Base-RaceId: ' + base_raceid + ' URL: ' + url )
    check_race( url, race )
    race = race + 1;

print('-- end -- ')

Follow me!

おすすめの記事