読者です 読者をやめる 読者になる 読者になる

Goldstine研究所

mosuke5's tech blog

ブログ移転しました。5秒後にリダイレクトします。

【錦織圭も分析】ATP TennisのデータスクレイパーGem作った

背景

このブログは基本的に技術ブログとしてやっているので、
テニスの話題ははじめてだが、テニスがすごく好きだ。 特に、プロの試合の観戦はとても好きだ。

2005年からずーっと見てて、欠かさずすべての試合結果はチェックしている。

数年前から、テニス選手をある指標から分析したいなと思っていた。 例えば、

  • ランキングは高くないけど、爆発するとトップ選手に勝つ力を持っているかどうか
  • 自分より格下の選手に負けることが少ないかどうか
  • 小さい大会ではあまり勝てないけど、大舞台で勝てる選手かどうか

これから伸びそうな選手かどうかなどをデータ的にみたかった。
ATPの公式サイトにもいくつか統計情報が載っているが、自分が大事と思う指標で分析したいと思っていた。

まずは、データを取得しなければいけないので、それでスクレイピングのライブラリを作るにいたった。

AtpScraper

AtpScraperは男子のプロテニスの公式サイトである、ATPのサイトから情報をスクレイピングしてくれるRubyライブラリだ。

github.com

現時点では、ぼくが今欲している機能しか実装していないが、下記ができる。

  • シングルスのランキングの取得
  • プレイヤーの対戦レコードの取得

一例だが、どんなふうに利用できるかのせる。

シングルスのランキング取得

デフォルトだとトップ100のランキングを取得する。

pry(main)> AtpScraper::Get.singles_ranking
=> [{:ranking=>"1",
  :player_name=>"Novak Djokovic",
  :player_url_name=>"novak-djokovic",
  :player_id=>"d643",
  :points=>"16580"},
 {:ranking=>"2",
  :player_name=>"Andy Murray",
  :player_url_name=>"andy-murray",
  :player_id=>"mc10",
  :points=>"8765"},
 {:ranking=>"3",
  :player_name=>"Roger Federer",
  :player_url_name=>"roger-federer",
  :player_id=>"f324",
  :points=>"8295"},

(略)

下記のようにすれば、50位から60位のランキングを取得できる。
(※引数の指定の仕方がアレなのは突っ込まないこと)

pry(main)> AtpScraper::Get.singles_ranking("50-60")
=> [{:ranking=>"50",
  :player_name=>"Lukas Rosol",
  :player_url_name=>"lukas-rosol",
  :player_id=>"r685",
  :points=>"897"},
 {:ranking=>"51",
  :player_name=>"Federico Delbonis",
  :player_url_name=>"federico-delbonis",
  :player_id=>"d874",
  :points=>"895"},

(略)

錦織圭の対戦レコード取得

錦織圭の2016年の対戦レコードを見たいと思えば下記のように取得できる。
(第一引数のn552は選手のIDのようなもので、これは上のランキングの取得時に手に入るのでそこで確認しなければいけない)

pry(main)> AtpScraper::Get.player_activity("n552", 2016)
=> [{:year=>"2016",
  :player_name=>"Kei Nishikori",
  :player_rank=>"6",
  :opponent_name=>"Sam Querrey",
  :opponent_rank=>"43",
  :round=>"Round of 16",
  :score=>"46 36",
  :win_loss=>"L",
  :tournament_name=>"Abierto Mexicano Telcel",
  :tournament_category=>"500",
  :tournament_location=>"Acapulco, Mexico",
  :tournament_start_date=>"2016.02.22",
  :tournament_end_date=>"2016.02.27",
  :tournament_surface=>"Hard",
  :tournament_surface_inout=>"Outdoor"},
 {:year=>"2016",
  :player_name=>"Kei Nishikori",
  :player_rank=>"6",
  :opponent_name=>"Thiemo de Bakker",
  :opponent_rank=>"105",
  :round=>"Round of 32",
  :score=>"60 63",
  :win_loss=>"W",
  :tournament_name=>"Abierto Mexicano Telcel",
  :tournament_category=>"500",
  :tournament_location=>"Acapulco, Mexico",
  :tournament_start_date=>"2016.02.22",
  :tournament_end_date=>"2016.02.27",
  :tournament_surface=>"Hard",
  :tournament_surface_inout=>"Outdoor"},

(略)

もし、過去のすべての錦織圭の対戦レコードを取得したければ下記で取得できる。

pry(main)> AtpScraper::Get.player_activity("n552", "all")

対戦レコードは1対戦ごとのレコードになっている。
トーナメントごとにまとめたりはしていない。

これから

データ取得ライブラリを作ったので、これからこれを使った分析をしていこうと思っている。
分析結果が見れるサービスを作るかもしれないし作らないかもしれない。

また、データ取得について要望があれば受け付けるし、プルリクをしてくれてもOKです。

GitHub - mosuke5/atp_scraper: atp_scraper is a tool scraping tennis data from atpworldtour.com.