[Python] サンデーサイレンスのインブリードパターンの取得方法 〜3×4とか4×3とか

サンデーサイレンスのインブリードを、分析する切り口の1つとして、インブリードのパターンがあると思います。

つまり、3×4とか3×3とか、インブリードの位置ごとのデータのことです。

できればTargetで完結したいところですが、ちょっと実現方法が分かりません。
(血統表に3×4などの表記はありますが、それを基準にデータを整理するのはできなさそう)

準備すること

Targetでサンデーサイレンスのインブリード保有馬を特定する

事前に、サンデーサイレンスのインブリード保有馬を特定しておく必要があります。

以下の記事で、Targetを活用したサンデーサイレンスのインブリード保有馬の特定方法を、紹介しました。

404 NOT FOUND | 思考訓練の競馬

もちろん全馬のデータをスクレイピングすれば、上の作業は不要です。

ですが、あくまでサンデーサイレンスのインブリード保有馬のデータだけを、ラクに早く取得することを目指します。

Pythonを使う

netkeibaさんから、データをスクレイピングすることでゴールにたどり着きます。

スクレイピングとは?と思った方は、きっとPythonになじんでいない方だと思います。

僕自身もプログラミング言語には、27才までなじみがなかったです。

ただ、たまたま英語は得意だったこともあり、プログラミング言語だって言語なんだから、覚えされすれば使いこなせるだろう!と思って学び始めました。

とはいえ、英語をビジネス用に学ぶ時なら、ビジネス英語を学びますよね?

それと同様に、血統データをスクレイピングするには、どうしたらいいんだろう?という目的ベースで目的達成に必要な学習を始めました。

決して体系的でもない網羅的でもない学習ですが、少なくともサンデーサイレンスのインブリードについて知りたいけど、どこにも落ちてないデータを自前で準備できるまでになりました。

ということで「Pythonを使う」って時点で、逃げちゃいそうになったあなたも、一歩踏み出してみてください。

サンデーサイレンスのインブリードパターンをスクレイピング

血統登録番号をキーに使う

Pythonの基礎などは、ここで解説できませんので、必要なコードをのせます。

Targetとnetkeibaの間で共通したキーとして「血統登録番号」が有効です。

・netkeibaの各馬の血統表ページ
>>https://db.netkeiba.com/horse/ped/2018100274/

この赤字部分の10桁の数字と馬が、1対1で存在します。

これを基にデータを取っていきます。

・Targetの馬データ検索画面に、サンデーサイレンスのインブリード保有馬を表示

・血統登録No.の列で右クリック>「この列を全て選択する」

・再び右クリック>「選択範囲をファイルに出力」

Pythonでスクレイピングをする

#ライブラリの準備
from urllib import request
from bs4 import BeautifulSoup
import time
import pandas as pd

先ほどTargetで準備した血統登録番号のCSVデータをPythonで読み込みます。

netkeibaの各馬の血統表ページの、5代血統表の下にインブリード(クロス)のパターンが表示されます。

こちらを狙い撃ちます。

#リストを準備
cross_list = []

#時短のため5頭に絞る
test5 = test.head(5)

for num in list(test5["血統登録番号"]):
  #個別の馬の血統ページリンク
    ped_link = 'https://db.netkeiba.com/horse/ped/' + str(num)

    res = request.urlopen(ped_link ,timeout=3)
    soup = BeautifulSoup(res,'html.parser')
    cross = soup.find(class_='blood_cross') #クロス表の取得
    cross_trs = cross.find_all('tr') #クロス表の<tr>を全て取得

    #クロスを1行ずづ読み込んでサンデーを含む行だけ抽出
    for cross_tr in cross_trs:
        if "サンデーサイレンス" in cross_tr.text:
        cross_pattern = cross_tr.get_text().splitlines()[3]
        cross_list.append([num,cross_pattern]) 

    time.sleep(3)

print(pd.DataFrame(cross_list,columns = ['血統登録番号','インブリード位置'])

これで以下のように、血統登録番号とインブリードの位置のセットが取得できます。

今回は頭数を簡略化しましたが、今現在サンデーサイレンスのインブリード保有馬は3,000頭以上いますので、時間はかかります。
くれぐれもsleepをせずに、サーバー負荷をかけ過ぎないようにすることが大事です。
※ netkeibaの仕様では、すべてのインブリードを表記するのではなく、より近い世代のインブリードが表示されます。
つまり、サンデーサイレンスのインブリードを有していても、それがともにスペシャルウィークならば、スペシャルウィークのインブリードとして表示されます。
なので、今回のスクレイピングでは、厳密にはサンデーサイレンスのインブリードの保有馬のすべてをフォローできていません。
ただ、その頭数はごくわずかなので、データ分析の上では大きな問題はありません。
後日、その漏れの拾い方は追記予定です。

まとめ

一連の流れを簡単にまとめます。

  1. Targetでサンデーサイレンスのインブリード保有馬を特定する
  2. 血統登録番号をキーにインブリードパターンを取得する

もちろん、その他に効率的な方法もあると思いますが、まぁ一度データを取ってしまえば、年一回新しい世代のデータを追加するだけなので、問題は少ないかと。

競馬をより深く楽しむ武器を、届かれていたら幸いです。

以上、吉田しげるでした!

コメント

タイトルとURLをコピーしました