質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2179閲覧

プログラミングのド初心者なのですが、pythonで競馬の単勝オッズを取得し前走時のそれと比べるプログラムを作りたいです。

kazusa

総合スコア0

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2024/08/06 09:56

プログラミングのド初心者なのですが、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にコピペしてエクセルファイルにスクレイピングした情報を出力できる程度のレベルです。コードの文法の知識はまだ全然ありません。

loving👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2024/08/06 10:47

> 【お願いしたいこと】 ここに書いてあるのは、基本的にプログラムの作成依頼なので、このサイトで扱うような内容ではなさそうですね。競馬好きの親切な人がいたらやってくれるかもしれません。 こういう情報が必要であれば、プログラム作成依頼を受けているサイトで依頼してみるといいと思います。
meg_

2024/08/06 11:06

スクレイピングをするにはhtmlの知識があると良いですが、とりあえず動くものを作りたいならブラウザの開発者ツールを使いこなすと良いかと思います。 VSCodeについては https://qiita.com/sayo99/items/7e0b4d873928227ae4de が参考になるかもしれません。
guest

回答1

0

【質問したいこと】
・過去走オッズを取得する時のページ(②のコードで扱っているページ)でどのようにオッズを取得しているかの仕組みがわからないので教えて欲しいです。

コード2ののページに説明されているレース情報のURLを開くと中にちゃんと必要なデータはすべて含まれているので、内容の確認方法が間違えているのだと思います。

コードのスクリーンショットを載せるので、各文字色の意味を教えて欲しい

pythonの文法を知っていれば、聞くまでもないようなことだと思います。


コードの文法の知識はまだ全然ありません。

遠まわりになるように思うかもしれませんが、目的を達成するためには、まずは、pythonや開発環境・Webスクレイピングについての基本的な知識と技術を得てから取り組むべきと思います。
大工道具を何も触ったことも無いのに人の住めるような家を建てたいという人はいないと思いますよね? プログラムも同様です。

・初心者向けの python習得のための書籍を購入して一通りやる。
このとき、必ず自分の環境(WindowsとかMacとか) と同じものを選ぶこと。また、できるだけ発行年数の新しいものを選んでください。
・ Beautiful Soupを使ったWebスクレイピングについて書いてある書籍を1つやり通す。

書籍と書きましたが、代りにWebから得ようとするのはお勧めしません。特に個人が書いている記事やYoutube動画などでは体系的な知識が見につかないので、うまくいかないでしょう。

投稿2024/08/06 11:02

TakaiY

総合スコア13584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問