プログラミングのド初心者なのですが、pythonで競馬の単勝オッズを取得し前走時のそれと比べるプログラムを作りたいです。
実現したいこと
pythonでスクレイピングを行い、土日(一週分)の中央競馬の全レースにでる全馬の当日の単勝オッズを取得し、全馬の前走時のそれと比べるプログラムを作りたい。
前提
私はプログラミングのド初心者なのですが、pythonでスクレイピングを行い、土日(一週分)の中央競馬の全レースにでる全馬の当日の単勝オッズを取得し、全馬の前走時のそれと比べるプログラムを作りたいと考えており、現在ネット上から見つけた似たプログラムを改変することで、目標のプログラムを作ろうと思考錯誤しております。
具体的には、下記のURLのような、当日の馬券購入が可能になってからレースが始まるまでのページ、
例えば https://race.netkeiba.com/odds/index.html?type=b1&race_id=202401010411&rf=shutuba_submenu
から各馬の単勝オッズを取得し、また、各馬の前走時の単勝オッズも取得し、Excelファイルにそれぞれの単勝オッズ情報を出力して、今回と前回の単勝オッズのセルをエクセル上の機能で一定の差がある時はチェックするようなものを作りたいと考えております。
また、前走時のオッズは下記のURLから取得すると下記の②のコードが使えそうなのでいいかなと思っています https://db.netkeiba.com/horse/2020100148
(私がぱっと思いつく中でプログラミング作業が少なくなりそうな方法が上記なだけで別のもっと簡単な方法があればそちらの方法についての回答も歓迎です)
まず下記に私が改変元に使えるのではないかと思っているコードを載せます。
コードをそのまま載せてしまうと文字数が足りなくなってしまうので下記リンク先を参照していただけると助かります。
【改変元に使用しようとしているコード①】
コードのリンク先:https://note.com/mare_ism/n/nb784abf920c4
【Python】地方競馬のオッズをスクレイピング 頻馬主義 より
【改変元に使用しようとしているコード②】
コードのリンク先:https://agusblog.net/keiba-ai-scraping/
【競馬AI①】ほぼコピペだけ!Pythonでnetkeibaからデータを抽出する方法 より
コード①をベースにコード②の一部を組み合わせることで私が作りたいと考えているプログラムが作れるのではないかと考え、プログラミング知識がほぼ全くないなりにとりあえず雑に組み合わせてみたものが該当のソースコードです。
いきなり全部作るのは厳しいと思いましたので、土日一週間分の全レースの全馬の単勝オッズを取得しエクセルファイルに出力することのみを目指してみました。(ただし開催日の全レースのオッズ情報を取得するループの部分についてはわからなかったので、放置してあります)
ここまで長くなってしまいましたが、私がお願い、質問したいことは以下の通りです。
大変長い文章で、かつ、質問、お願いが多くなってしまいすみません。
どうか回答よろしくお願いします。
【お願いしたいこと】
・該当のソースコードの形を直して、土日一週間分の全レースの全馬の単勝オッズを取得しエクセルファイルに出力できるようにしてほしいです。そして、その時にどこをどのように直したのか、なぜ直さなくてはいけなかったのかをド初心者にもわかるようにできるだけ丁寧に教えて欲しいです。
・土日の全レースの単勝オッズを取得する際に、②のコード、サイトを参考にしてほしいのですが、②からレースIDをループさせる部分を取得し、該当のソースコードに組み込む際には、②のどこからどこまでを切り取ってどのように変形して組み込まなくてはいけないのかを教えて欲しいです。
・私がやりたいことをできるようになるためにオススメの学習方法や教材、学習サイト等があれば教えて欲しいです。
【質問したいこと】
・過去走オッズを取得する時のページ(②のコードで扱っているページ)でどのようにオッズを取得しているかの仕組みがわからないので教えて欲しいです。
Ctrl+Uでページのコードを見て、文字列を検索しても、オッズの数値、”オッズ”、”単勝”、pop = ' 'の ' 'の部分、”人気”といった文字列が検索に引っ掛からず、スクレイピングの方法がわかりません。
想像では該当サイトの表の1列目2列目というような要素の1,2というような順番の数が0から数え始めて、cols〔〕の中の数値と一致していたので、表の列を指定してオッズやタイムなどの数値を取得しているんだろうなというような気はしています。colsをどう使うのか全然わかりません。
・私はVisual Studio Codeで作業をしているのですが、下にコードのスクリーンショットを載せるので、各文字色の意味を教えて欲しいです。
発生している問題・エラーメッセージ
エラーメッセージ ValueError: could not convert string to float: '---.-'
該当のソースコード
race_id = "202401010411" url = f"https://race.netkeiba.com/odds/index.html?type=b1&race_id={race_id}&rf=shutuba_submenu" #↑このレースIDの法則は⓶の引用先を見ると書いてあるので、 #なんとかこのプログラムに当日の開催があるすべての競馬場の全てのレースの全馬の単勝オッズを取得するようにする #コードを追加したいと思っています。ループの方式も⓶の引用先が参考になるのかなと思いました。 import requests from bs4 import BeautifulSoup response = requests.get(url) soup = BeautifulSoup(response.content) odds_tan_block = soup.find('div', attrs={'id': 'odds_tan_block'}) trs = odds_tan_block.find_all('tr') for n, tr in enumerate(trs): if n == 0: continue horse_name = tr.find("td", attrs={"class": "Horse_Name"}).text odds = float(tr.find("td", attrs={"class": "Odds"}).text) print(n, horse_name, odds) #↓これ勘で入れてみるCSV出力の引数3を解決するため race_data_all= [n, horse_name, odds] #↓(CSV出力したいからわからんけど入れてみた。ほぼ①からのコピペ) with open('リアルタイムオッズ'+'.csv', 'w', newline='',encoding="SHIFT-JIS") as f: csv.writer(f).writerows(race_data_all) print("終了") #typeerror:writer.writerows() は引数を 1 つだけ取ります (3 つ指定)←一応解決済み #csv.error: 反復可能が期待されますが、int ではありません←これはまだ解決していない ソースコード
試したこと
① に②を組み込もうとしただけではなく②に①を組み込もうといろいろ調べてやってみましたが厳しかったです。行き詰って困っています。
補足情報(FW/ツールのバージョンなど)
私のプログラミング力は②のサイトの通りに環境を整えて、②のサイトの通りコードをVSCにコピペしてエクセルファイルにスクレイピングした情報を出力できる程度のレベルです。コードの文法の知識はまだ全然ありません。