Engineering Bear

野球とエンジニアリングを楽しむブログ

[Python] requestsとpandasで野球の打席結果を取得する①

こんにちは。

今シーズンもあっという間に終わってしまいました。
我がヤクルトは前年の雪辱を果たし、見事CS出場を成し遂げました!
若手も少しずつ頭角を現し始め、先日のドラフトも含めて早くも来シーズンが待ち遠しいです…
 
本日は、シーズンが終わって野球のデータも揃ったということで、Pythonを通して野球のデータをワイワイする(雑)話をしたいと思います。
 

今日の目的

PythonでHTTPリクエストを簡単に作成できるライブラリ「requests」と、同じくPythonでデータを取り扱う際に様々な機能を提供してくれるライブラリ「pandas」を使って、野球のデータをpython上で取得、加工するまでを行います。
本エントリーではデータを「pandas」の「DataFrame」*1に落とし込むところまで進めます。

プログラミング環境

「Jupyter Notebook」を使います。pandasを使う際にいい感じで可視化してくれます。

データ提供してくださるサイト様

「データで楽しむプロ野球」様です。(リンクフリーなので引用させて頂きました。)
baseballdata.jp

細かなデータが充実していて、見ていて飽きないサイトです。
選んだ決め手は、選手ごとの全打席結果(今シーズンだけでなく、2011〜2017シーズンまでのものも)が載っているからです。

バージョン情報

Python及びモジュールのバージョンは下記です。仮想環境を作成して、pipでインストールします。

Python: 3.6
pandas: 0.19.2
requests: 2.19.1
jupyter: 1.0.0
notebook: 5.0.0

データを探す手段について

データを得るための手段はいくつかあって

  • 公開されているAPIから取得する(今回はこれ)
  • CSVExcel形式等のファイルをダウンロードする
  • WEBページからスクレイピングする

これらが主に該当するかと思われます。
その中で一つ目の「公開されているAPIから取得する」という方法を今回はとります。
この手段はサイトによって異なるので、ページを巡ってデータファイルがダウンロードできる場所を探したり、
ブラウザの開発者ツール(Chromeなら、WindowsであればF12キー、macであればcommand + option + Iキーで表示出来ます)を用いて
ソースやレスポンス内容を確認する必要があります。

※注 リクエストを送る行為は、過度にやるとデータ提供者の環境に迷惑をかけることになるので、for文の中に入れるなどして短期間に繰り返し行うのは、避けましょう。

実際に取得してみる

では、実際にデータのを「データで楽しむプロ野球」様から取得したいと思います。

まずはインポート

import pandas as pd
import requests
import json

そしてサイトの調べたい選手の全打席ページで、開発者用ツールを開くと、テキストファイルから全打席データを取ってきていることがわかると思います。*2
なので、こんな感じでリクエストを送ります*3

response = requests.get('http://baseballdata.jp/playerB/1000132S.txt')

ざっくり解説すると、「response」という変数に上記URLに対してGETメソッドのHTTPリクエストを送った時の、返却値を代入しています。
GETメソッドも、requestsなら「.get」という見ただけでわかるようなメソッドで簡単に実行出来ます。

また、日本語が混ざっていてかつ、文字コードを指定していないページなので、エンコードします。*4

response.encoding = response.apparent_encoding

レスポンスヘッダに文字コード情報がないので、apparent_encodingを実行することで、文字コード推定のモジュール(chardet)が働いて
正しくエンコードしてくれます。

この時点で、データが取得出来ています。pandas用に加工はされていませんが…
中身は下のコードをJupyter上で実行すると表示されます。(下記画像参照)

response.text

f:id:kumappp:20181108014809p:plain

みたことのある様な単語がチラチラありますが、このままじゃよくわかりませんね…笑
よくみると、一応JSONの形式にはなっています。
あと、HTMLタグが散見されますが、こちらのサイト様の仕様なので、一旦置いときます。

あとは、下記の様にpandasのメソッドでデータを読み込むだけで、上記のデータがpandasのDataFrameに入ってきます。
こちらは、JSON形式のデータを読み込むメソッドです。

df = pd.read_json(response.text)

f:id:kumappp:20181108020657p:plain

これだけでpandasのDataFrameにサイト上のデータを取り込むことが出来ました!
…と言いたいところですが、これでは何のデータか一見ほとんど分かりませんね…
何はともあれ、これでデータの取得処理自体は終わりです。
これから、使いやすいよう、みやすいようデータを加工する必要が出てきます。
pandasのメソッドを駆使しますが、少し長いので次回で…

データを取得する・まとめ

requests及びpandasどちらもシンプルな書き方でデータを取得することが出来ました。
実際に何かしらのデータを取得する時は、対象データがAPIとして公開されていないものも多く、その場合はrequestsの結果として返される(であろう)
HTMLやXML構文からデータをスクレイピングする必要があったりするので、*5
もうちょっと複雑にはなるかと思います。
とはいえ、まずデータを取得する学習の触りには、こういったシンプルなAPIをまず扱ってみるとよいのかな、と思います。*6

これだけだと野球要素が薄いので、次回、データを加工し実際にサイトで出ているような形まで持っていきたいと思います!

では一旦、また。

*1:pandasの強力な武器で、2次元データを整形して表示してくれる

*2:テキスト形式なのはわりと特殊な例だと思います

*3:これはヤクルトの山田選手の全打席ページです、他の選手をみたい方は別途URLをはっつけてください

*4:参考: https://kanji.hatenablog.jp/entry/python-requests-beautifulsoup-encoding

*5:有名なスクレイピングライブラリにBeautifulSoup等がある

*6:データの中身はシンプルとは言い難いですが笑