NARスクレイピングから編集

又もやお久しぶりです。

先ずはスクレイピングの問題から。
リアルタイムのスクレイピングはWindowsマシンには厳しいですよね。
pandasのpd.read_html(url)[N]
こいつがUTF8のデコードエラーを頻発するわけです。

これはどんな対策を打ってもなしのつぶてでして。
悔しいけど全くと言っていいほど使い物になりません。
ですが、ローカルにHTMLを落とすと問題なくスクレイピングできます。
これはー、、レスポンス速度とデコーディングトランザクションのバランス問題なのか??
果て又、、、と仮説が絶えなくなります。
結局は根本解消にもならずに一向に前に進まないので、諦めて汎用性が無いページのスクレイピングについてとても面倒ではあるが、requestsを使用しようと思っています(´;ω;`)
pandasが楽なのは、urlopenやrequestsのように抽出ポイントを明示的に指定せずとも、ごっそりテーブルのカラムとインデックス要素を持ってこれるのが良い所なのですがね。

5代血統とか、これはHTMLソースからタプルを割り出さないといけなくなるので、暫く5代血統の全62血脈の抽出ポイントを探る旅になりそうです。
と、、なると近日からスクレイピングする予定の気象庁のページも同じ手を打つ必要があるのかなぁ。。。悲しい。。。

さて、、そんなことより掲題の件。
今回、どういった感じでスクレイピング実施しているか?というのをご説明したく思います。
徒然というか何かの足しになれば良いかな?と思って今後のデータ取り扱いや進め方も含めての情報がてらです。

では、、
何の情報を集めているの?という事ですけど、以下の情報が大元のデータ概要となります。
これらは皆さんと同じように抽出している、
https://db.netkeiba.com/race/+race_id
よりスクレイピングしている内容を編集して活用しているのみです。
編集するだけでも機械学習の学習内容となる値が生成することが出来ます!

netkeibaのレース結果から更に編集したカラムデータ:
race_d_id = 一意のPrimary Keyとして生成(BIGINT型)
日付 = レース開催日(DATE型)
発走時間 = 発走時間(TIME型)
開催 = 開催概要:N回開催競馬場X日目(TEXT型)
レース = レース数:1Rなど(INT型)
レース名 = レース名(TEXT型)
クラス = クラス概要:C1やB1、Jpn1やG1、重賞など(TEXT型)
コース種別 = ダートor芝:中央なら障害も(STR型)
距離 = コース距離(INT型)
周回 = 右or左(STR型)
馬場 = 馬場状態(STR型)
天気 = 天候(STR型)
コース = 開催競馬場(STR型)
枠番 = 枠番(INT型)
馬番 = 馬番(INT型)
出走頭数 = 出走頭数(INT型)
馬名 = 馬名(TEXT型)
性別 = 性別(STR型)
馬齢 = 馬齢(INT型)
騎手名 = 騎手名(TEXT型)
斤量 = 斤量(FLOAT型)
走破タイム = 走破タイム:秒変換済み(FLOAT型)
SP値 = 距離/走破タイム×3.6:平均時速(FLOAT型)
MPS値 = メートル/セカンド:1m進む秒数(FLORT型)
上3F = 上り3F(FLOAT型)
上3F差 = 着毎の上り3Fの差分タイム(FLOAT型)
着順 = 着順(INT型)
着差 = 馬身差の着差(TEXT型)
秒着差 = 着毎の走破タイム秒差(FLOAT型)
通過順 = コーナー通過順(TEXT型)
脚質 = 脚質:逃げ、捲り、先行、差し、追込み(STR型)
脚質計算値 = 脚質毎に割り出した数値:通過順から算出(FLOAT型)
単勝 = 単勝オッズ(FLOAT型)
OPR差分 = 着毎のオッズ差分(FLOAT型)
人気 = 人気(INT型)
体重 = 馬体重(INT型)
増減 = 体重増減(INT型)
LAP比較値 = 33ラップの比較値(FLOAT型)
前半タイム = 前半800m~1000mのラップタイム(FLOAT型)
ラップ傾向 = 前傾or後傾(STR型)
ペース = 超スロー~超ハイ(TEXT型)
決め手 = 超持続~超瞬発(TEXT型)
調教師名 = 調教師名(TEXT型)
厩舎所属 = 海外、地方、美浦、栗東(STR型)
馬主名 = 馬主名(TEXT型)
賞金 = 賞金(FLOAT型)
course_id = 開催競馬場ID(INT型)
race_id = race_id(BIGINT型)
horse_id = horse_id(INT型)
jockey_id = jockey_id(STR型)
trainer_id = trainer_id(STR型)
owner_id = owner_id(STR型)

と、まぁここまでは材料があるのでデータ含めて完成しています。
次にこれに追加する予定である、カラム内容です。

追加予定カラム→
風向 = 気象庁HPからデータをスクレイピング:
   日付と発走時間を基に抽出(STR型)
風速 = 同上且つ、最大瞬間風速(FLOAT型)
種牡馬名 = 父名称(TEXT型)
種牡馬母父 = 種牡馬母父名称(TEXT型)
BMS父名 = 母父名称(TEXT型)
BMS母父名 = 母母父名称(TEXT型)

その他→
回収率計算の為に、払戻金のデータもrace_idをindexとしてスクレイピング済み。

現在進行中タスク→
netkeibaより只今、Pedigreeとして誕生年に即したhorse_idを基に
全量のスクレイピング実施中。
(year+10+頭数として総頭数指定で抽出をしています。)
血統面のカラムに反映予定です。
まぁ、冒頭の書いた様に躓いていますけど、、、。
Copilot先生に聞いてもダメでしたw

今後のタスク→
血統や気象庁のスクレイピング施策まで出来たらMySQLにてテーブルへインポート予定。
地方競馬もJRAも上記レース結果のカラムやデータ内容は変わらないので、同一テーブルにインポートします。
SQL文で引き出した上で、netkeiba出走表からhorse_idの馬番順序を制定し、これら数値やキーワードを基に機械学習を行う手立てとします。

取り敢えずご説明は以上です。
内容も豊富な為に、緻密な機械学習ができることを期待しております。
(勿論チューニングなど必要でしょう)
いやぁ、生成AIであるCopilotはコーディングのお役にとてもなりました!!
Copilot先生、やっぱり凄いわなぁ。
何しろ物量にしても幾ら何日使っても無料なんですよ。
Windowsは文字コードのデコード問題とか全く使えないお馬鹿さんですが、この点だけは評価できますね。
VSCにもGitHub経由でCopilotが機能追加されていますけど、我々お金が無いプログラマにとっては、物価高なこの世の中で3か月試用期間とか舐めていやがる、、否、いらっしゃる(´;ω;`)
なので、Windows常駐のCopilot先生を使いまくっております!

何にしても生成AI活用はコーディングするときは、とてもお勧めです。
では、また!!

この記事が気に入ったらサポートをしてみませんか?