競馬情報の自動取得(その①)
こんな依頼をいただきました
下記のサイトから昨年1年間のレース情報を取得したいです。
※可能であれば数年間分
競馬場名、何レース、芝/ダート、距離、馬の名前、騎手、人気、着順
等々を1頭ごとにcsvにしたいなぁと思う次第です。
ではさっそくスクレイピングのスタート
1年間のすべてのレースという事ですが、基本となるのは1レース分のデータをきれいにとってくることです。ここさえ出来るようになれば、あとはグルグル回すだけで出来そう。さっそく適当なレースのページを開いてみます
https://race.sp.netkeiba.com/?pid=race_result&race_id=202105010601
ふむ、まずはこのページを開くようにします。
url="https://race.sp.netkeiba.com/?pid=race_result&race_id=202105010310"
from time import sleep
from selenium import webdriver
import re
driver = webdriver.Firefox()
driver.get(url)
urlのところは後で変更していきますが、まずは適当にレースのurlを決めて表示させます。
ブラウザーはchromeを以前は使っていたのですが、バージョンアップ頻度が高く、バージョンが上がるたびにドライバー取ってこないといけないので、だんだん嫌になってきて最近はFirefoxを使っています。Firefoxで特に不満はないのですが、デフォルトだとログファイルをガンガン吐き出しますので、長く回すときには注意が必要です。ログをはかせたくなかったら次のように記述する必要があります。
driver = webdriver.Firefox(log_path=os.path.devnull)
さて、1着から3着が表示されていて、4着からは「全着順をクリックする」を押す必要があります。
まずは
をクリックしなくちゃいけません。
まずはクリック対象を見つけてきます。
WEB画面を開いた後、「右クリック→検証」をクリック
画面がこんな風に変わりました。真ん中の上にあるマークをクリック
その次に、マウスを「全着順を見る」にもっていくと、右側の画面が次のようになります。
ということで、このボタンはClass Button_01であることがわかりました。なのでここをクリックするには driver.find_element_by_class_nameを使ってあげればよいという事が分かります。
driver.find_element_by_class_name('Button_01').click()
実はここで少しつまづきました。起動したPCの画面から「全着順を見る」がはみ出している場合は、ちょっと下にスクロールしてからじゃないと、クリックできません。なのでいきなりクリックしないで
①画面をスクロール
②全着順を見るをクリック
の順番で作ります
zenbumiru = driver.find_element_by_class_name('Button_01')
driver.execute_script('arguments[0].scrollIntoView(true);', zenbumiru) # 対象となる要素までスクロール
driver.execute_script("arguments[0].click();", zenbumiru)
これで、無事クリックされました。
画面が全部表示されるようになったので、ここからスクレイピングの開始です。