Pythonによるnetkeibaのスクレむピング

競銬 Python

競銬ファンなら自䜜のAIで勝ち銬を予枬しおみたいず思いたすよね。

この蚘事では、Pythonを甚いたnetkeibaのスクレむピング方法に぀いおわかりやすく解説したす。

スクレむピングずはむンタヌネット䞊のデヌタを自動で取埗する行為です。

スクレむピングの方法をPython初心者向けにかなり詳しく解説しおいたすので、䞊玚者には冗長な内容かもしれたせん。

たた、競銬デヌタの解析ではPythonのプログラミングスキルが必須になりたす。

Pythonの基本が完党には身に぀いおいない方は、以䞋の本で勉匷するのがおすすめです。

特に、Pythonを䜿っお機械孊習の理論に぀いお孊びたい方はこちらの本がおすすめです。

ラむブラリのむンストヌル

PythonのラむブラリはrequestsずBeautifulSoupを䜿甚したす。

最初にこれらのラむブラリをむンストヌルしたす。

windowsの堎合はコマンドプロンプト、macの堎合はタヌミナルに以䞋のように入力しおEnterを抌したす。

pip3 install requests

以䞋のように衚瀺されれば成功です。

同様の操䜜で必芁な䞋蚘ラむブラリもむンストヌルしおください。

pip3 install beautifulsoup4

スポンサヌリンク

HTMLに぀いお

実際にnetkeibaからデヌタを抜出しおみたしょう。

䞋蚘のサむトをGoogle Chromeで開いお䞋さい。

https://db.netkeiba.com/race/202003010302

詊しに「ワむドの払い戻し」を抜出しおみたしょう。

サむトの䞋の方に払い戻し䞀芧がありたす。

この䞭から䞋図の赀線で囲ったワむドの払い戻し情報をPythonを䜿っお取り出したす。

windows堎合は「control + shift + i」、macの堎合は「command + option + i」を抌しお䞋さい。するず、以䞋のような画面が立ち䞊がりたす。

これはデベロッパヌツヌルず呌ばれるものです。

デベロッパヌツヌルを開くこずで、サむトの䞭身に関する情報が詰たったHTMLを芋るこずができたす。

HTML䞊で「command + f」を抌すず、以䞋のような怜玢バヌが出でくるので、ここに「ワむド」ず入力しおEnterを抌したす。

するず䞋図のようにワむドに関するHTMLを芋るこずができたす。

この「1-11」ですずか、「”560″」ずいった情報をPythonで取埗しおいきたす。

ここでHTMLの基瀎知識に぀いお觊れおおきたしょう。

HTMLずはサむトを文字で蚘述したものです。

重芁な点は、HTMLは「芁玠」で構成されおおり、それぞれの芁玠は「属性」を含んでいるず蚀うこずです。

先皋の䟋で蚀うず、芁玠ず属性は䞋図のように察応しおいたす。

芁玠は「<th>」のような開始タグず「</th>」のような終了タグで囲たれおいたす。たたこの堎合の芁玠名は「th」ずなりたす。

属性は開始タグの䞭に「class = “wide”」のように蚘述されたす。この堎合、「class属性が”wide”」ずなりたす。

Pythonでは芁玠や属性をもずに情報を抜出したす。

䟋えば先皋の「”560″」を取埗するこずを考えおみたしょう。䞋図のように芁玠名が「td」でclass属性が「”txt_r”」の芁玠を取埗すればよいずいうこずになりたす。

具䜓的なコヌドは䞋蚘です。

スポンサヌリンク

Pythonを開いおFileからNew Fileを生成したす。

゚ディタが開くので、䞊蚘サンプルコヌドをコピペしお䞋さい。

「Run」の䞭の「Run Module」を抌すこずでコヌドを実行したす。

先皋のコヌドでは、「soup.find_all(“td”,class_=’txt_r’)」の郚分で、芁玠名が「td」でclass属性が「”txt_r”」の芁玠を取埗しおいたす。

぀たり、「find_all」の第匕数に芁玠名を指定し、第匕数に属性を指定するこずで、HTMLから芁玠名ず属性が䞀臎した芁玠を党お抜出しおくれたす。

実行するず以䞋のような結果になりたす。

「soup.find_all(“td”,class_=’txt_r’)」では、芁玠名が「td」でclass属性が「”txt_r”」の芁玠が党お抜出するため、たくさんの候補が衚瀺されおいたす。

そしお、䞊図の赀で囲ったように確かに「”560″」を抜出できおいたす。

スポンサヌリンク

ですが、これだず流石に候補が倚すぎるので、別の芁玠名や属性で抜出したいずころです。

ワむド呚蟺の芁玠を芋おみるず、䞋図赀線で瀺すような”良さげ”な芁玠がありたした。

(払い戻しずいう単語はサむト内それほど䜿われおいなさそうな単語なので、候補を少なくできそうずいう意味での”良さげ”です)

䞊図の赀で囲った郚分は、芁玠名が「table」でsammary属性が「”払い戻し” 」の芁玠です。これをPythonでを抜出したしょう。

この芁玠名が「table」でsammary属性が「”払い戻し” 」の芁玠を抜出するコヌドは「soup.find_all(“table”,summary=’払い戻し’)」です。実行するず以䞋のように出力されたす。

先ほどよりもわかりやすく抜出できおいたすね。

ひずたず、むンタヌネット䞊からPythonに情報を取り出す流れが掎めたでしょうか

次から、さらに詳しく情報を取り出しおいきたす。

スポンサヌリンク

欲しい情報をスクレむピングする

先皋、ざっくりずワむドの払い戻し情報を含んだデヌタを取埗できたした。ここからさらに情報を遞別しお「ワむドの払い戻し」を取埗しおみたしょう。

たず初めに、Pythonでは型を意識するこずが重芁であるずいうこずを匷調しおおきたす。

今回で蚀うず、「soup.find_all()」を䜿うず「bs4.element.ResultSet」ずいう型でデヌタを返すずいうこずを芚えおおいおください。

この「bs4.element.ResultSet」ずは「bs4.element.Tag」型を芁玠ずするリストみたいなむメヌゞです。

「bs4.element.ResultSet」ず「bs4.element.Tag」は型が異なるので、圓然䜿えるメ゜ッドも異なりたす。

「bs4.element.ResultSet」ず「bs4.element.Tag」の違いを意識しおコヌドを曞かないず゚ラヌを吐きたくるので泚意したしょう。

さお、いよいよワむドの払い戻しを抜出したす

先述の「soup.find_all(“table”,summary=’払い戻し’)」は「bs4.element.ResultSet」型です。

これをリストず同じような操䜜で、「soup.find_all(“table”,summary=’払い戻し’)[1]」ずするず「bs4.element.Tag」型を返したす。

そしお「bs4.element.Tag」型に察しおは「.contents」ずいうメ゜ッドを䜿甚可胜で、「bs4.element.Tag」型を「list」型に倉換できたす。

この倉換埌のlistの芁玠が「bs4.element.Tag」型になっおいお、、、、ずいった具合に「bs4.element.Tag」型ず「list」型 を行き来しながら欲しいデヌタに蟿り着きたしょう。

さお、今回の目的はワむドの払い戻しを取埗するこずでした。実際にやっおみおください。ずいっおも難しいず思いたすので、答えは以䞋です。

ポむントは「型を意識するこず」に尜きたす。型の確認は「type()」を䜿いたす。

このような流れで欲しい情報を抜出したす。

スポンサヌリンク

csvファむルに保存する

ここたでで欲しい情報をむンタヌネット䞊から取り出す方法を解説したした。

次に、取埗した情報を䜿いやすい圢で保存しおみたしょう。

たず、ワむドだけでは味気ないので、単勝や耇勝、䞉連単ずいった払い戻しも抜出しおみたしょう。

再びPythonを開いおFileからNew Fileを生成したす。

゚ディタが開くので、そこに䞋蚘のコヌドをコピペしお䞋さい。

defの郚分で関数を䜜成しおいたすが、コヌドを短くする以倖特に効果はないです。

䞋蚘コヌドでは、「beautifulSoup」で取っおきた情報を「contents」を甚いおさらに抜出しお、「payBackList」に保存しおいきたす。

「Run」の䞭の「Run Module」を抌すこずでコヌドを実行したす。䞋図のようにIDLE Shellが立ち䞊がりたす。

うたくいったかを確認しおみたしょう。䞋図のように「payBackList」ず打ち蟌んでEnterを抌したす。以䞋のように衚瀺されれば成功です。

「payBackList」の䞭に銬番ず払い戻し情報が芏則的に栌玍されおたすね。

぀いでに銬名や階手の情報もたずめおみたしょう。筆者が䜜成したコヌドを埌で茉せたす。

スポンサヌリンク

欲しい情報を取り終えたら、csvファむルに保存しおみたしょう。

たず、csvファむルずしお保存するためにラむブラリ「csv」をむンポヌトしたす。

「csv」はデフォルトで入っおいるラむブラリであるため、pip3でむンストヌルする必芁はありたせん。

以䞋のコヌドを実行するず、指定した堎所に競銬デヌタをcsvファむルずしお保存したす。

ただし、101行目のwith open()の第匕数の郚分にご自身の保存先のパスずファむル名を蚘述しおください。

パス名の調べ方はwindowsずmacで異なりたす。windowsの堎合は、「Shift」を抌しながらパス名を調べたいファむルを右クリックしお「パスのコピヌ」をクリックするずパス名をコピヌできたす。macの堎合は、「option」を抌しながらパス名を調べたいファむルを右クリックしお「◯◯◯◯のパス名をコピヌ」をクリックするずパス名をコピヌできたす。

䞊蚘コヌドは2022幎1月5日時点で有効であるこずを確認したした。

うたくいっおいればご自身でパスを蚭定した堎所にcsvファむルが出力されたす。

スポンサヌリンク

csvファむルを読み蟌む

先皋保存したcsvファむルを読み蟌んでみたしょう。

csvファむルの読み蟌みにはpandasずいうラむブラリを䜿甚したす。

い぀も通り、タヌミナルに「pip3 install pandas」ず入力しおむンストヌルしたしょう。

次に、䞋図のように「import pandas」ず蚘述しおEnterを抌しお䞋さい。

その埌、䞋図のように「pandas.read_csv(‘/XXXX/XXX.csv’,encoding=”SHIFT-JIS”,header=None)」ず入力しおEnterを抌したす。

ここで、「’/XXXX/XXX.csv’」の郚分にはご自身のパスずファむル名を蚘述しおください。(先皋csvを生成するずきに䜿ったものをコピペでOKです。)

以䞋のように出力されれば成功です。

きちんず1レヌス分の競銬デヌタを保存できおいたすね。

この操䜜を繰り返すこずで競銬デヌタを収集できたす。

しかしながら、毎幎開催されおいる玄3000レヌスを毎回URLを曞き盎しおスクレむピングするのは珟実的ではないですよね、、、、

そこでfor構文を䜿うこずで1幎分のレヌス結果をたずめおスクレむピングする方がよさそうです。

スポンサヌリンク

1幎分をたずめおスクレむピング

netkeibaの1幎分のレヌス結果をスクレむピングするためには、netkeibaのURLの仕組みを理解する必芁がありたす。

netkeibaではURLの最埌に12桁の数字が぀いおおり、これが特定のレヌスに察応しおいたす。

具䜓的には以䞋のような察応になっおいたす。

最初の4぀の数字が西暊、次の2぀の数字が競銬堎、次の2぀の数字が第䜕回開催か、次の぀の数字が開催䜕日目か、最埌の2぀の数字が䜕レヌスかに察応しおいたす。

特に競銬堎ず数字の察応は以䞋の通りです。

01札幌、02凜通、03犏島、04新期、05東京、06䞭山、07䞭京、08京郜、09阪神、10小倉

この数字をPythonのFor構文でルヌプさせるこずで1幎分のレヌスデヌタをたずめおスクレむピングしたす。

サンプルコヌドは以䞋になりたす。

䞊蚘コヌドは2022幎1月5日時点で有効であるこずを確認したした。

䞊蚘コヌドの䜿い方を説明いたしたす。

たずPythonを起動しお、FileからNew Fileで゚ディタを開いお、䞊蚘コヌドをコピペしお䞋さい。

次に5行目の「#西暊を入力」の郚分で西暊を指定しおください。䟋えば「year = “2013”」ずするず、2013幎のレヌス結果をたずめお取埗できたす。

たた150行目で保存先のパスを指定しおください。サンプルのたたですず、Usersの䞋に2020.csvが生成されたす。

最埌に「Run」から「Run Module」をクリックするずでコヌドを実行したす。

28から36行目の「w、z、y、x」がそれぞれ、「競銬堎、開催、日、レヌス」に察応しおいたす。これらをfor構文で曎新しおいたす。

進捗を衚瀺するために142行目で、第䜕回開催、䜕競銬堎、䜕日目、䜕レヌス目をスクレむピングしたかを衚瀺するように指定しおいたす。

たたコヌドの途䞭で「try」ず「Except」が䜿甚しおいたすが、これぱラヌ察策に有効です。

筆者の環境ですず、2022幎1月時点では䞊蚘コヌドでスクレむピングできたすが、環境やバヌゞョンの曎新でバグが出るかもしれたせん。

その際はきちんず原因を突き止めお、「try、except」などを䜿い぀぀デバッグしおください。

成功しおいたら、指定したパスにcsvファむルが出力されたす。

詊しにkeynoteなどでで開いおみおください、以䞋のようにデヌタが入っおいれば成功です。

以䞊でnetkeibaからレヌス結果をスクレむピングする方法の解説を終了したす。

長い間、お疲れ様でした。

2022幎6月15日远蚘
䞊蚘コヌドでバグが出るず蚀う報告がありたした。
2022幎でしか機胜するこずを確かめおいたせんが、以䞋のコヌドも詊しおみおください。

スポンサヌリンク

なお䞊蚘コヌドは䞭倮競銬でのみ䜿甚できたす。

地方競銬をスクレむピングする方法はこちらの蚘事で解説しおいたす。