見出し画像

プロ野球先発投手データを14行のコードで取得する

野球は投手が8割といわれるほど重要なポジションです。(諸説ありますし、何が重要かは人それぞれです。)

先発投手のデータを取得して分析していこうと思います。
まずはデータを取得するところからになります。(えぇ・・・
だってデータがないと始まらないのですもの。
それでは

14行のコードで取得できます!

14行でプロ野球12球団の今シーズンの先発データを取得できます。

import pandas as pd
import time
if __name__ == '__main__':
   team_lists = ['g','t','yb','s','c','d','h','m','l','e','f','bs']
   df_concat = pd.DataFrame()
   for team in team_lists:
       url = 'https://baseball-data.com/starter/' + team +'.html'
       print(url)
       data = pd.read_html(url)
       df = data[0]
       df = df[:-1]
       df_concat = pd.concat([df_concat,df])
       time.sleep(100)
   df_concat.to_csv('staeter.csv',index=False)

大まかな処理の流れは下記になります。
1.ライブラリのインポート
2.チーム名ごとのページのURL部分のリストの用意
3.データフレームの宣言
4.URLの文字列を作成
5.URL先のデータを取得
6.データを加工し、3.で宣言して作っていおいたデータフレームにデータを追加
7.12球団分、4〜6の処理を繰り返す
8.データを保存

コード解説していくよ!

それぞれの行でどのような処理を行なっているか見ていきます。

ライブラリをまずインポートします。
スクレイピング、データ加工用にpandas、スクレイピング時にアクセス間隔を置くためにtimeをインポートします。

import pandas as pd
import time

これは、おまじないですね。(ぇ
mainメソッドは、pythonファイル(hogehoge.py)をコマンドラインなどからpythonを起動した場合にまず処理されるメソッドです。
全体の処理や流れの処理を書く時などに使ったりできます。
他のpythonファイルからインポートされるときにはmainメソッドは実行されません。
この手の話はまた別の話にしましょうw

if __name__ == '__main__':

次はmainメソッドの中身を見ていきます。
インデントをつけることを忘れないでくださいねw

URLの各チームの先発投手のデータが掲載されているページを分ける要素となる部分をリストで持っておきます。

team_lists = ['g','t','yb','s','c','d','h','m','l','e','f','bs']

読み込んで加工したデータを格納していくためのデータフレームを作成しておきます。

df_concat = pd.DataFrame()

アクセスするURLの文字列を作っていきます。
teamのリストに各チームのページを表す名前が含まれています。
teamリスト内の文字列を入れ替えていくことで各チームのページにアクセスできます。
printで確認のためのurl表示して今表示しています。
pd.read_htmlでアクセスするURL内のテーブルデータをリストで取得します。

url = 'https://baseball-data.com/starter/' + team +'.html'
print(url)
data = pd.read_html(url)

このデータの構造は、末尾もカラムデータを含んでいます。
また、データはリスト形式のため、データフレーム型として代入し直す必要があります。

日付	先発投手	先発捕手	投手責任	QS	HQS	投球回	失点	自責点	投球数	被安打	与四死球	奪三振	対戦相手	試合結果
0	3月26日(金)	山本 由伸	頓宮 裕真	●	◎	◎	7.0	4	1	100	6	1	4	西武	● 3-4
1	3月27日(土)	宮城 大弥	伏見 寅威	○	◎	◎	7.0	2	1	123	5	2	8	西武	○ 3-2
2	3月28日(日)	山岡 泰輔	頓宮 裕真	●	×	×	6.0	4	4	92	5	2	7	西武	● 1-5
3	3月30日(火)	田嶋 大樹	頓宮 裕真	●	◎	×	6.0	2	2	114	6	2	6	ソフトバンク	● 1-3
4	3月31日(水)	増井 浩俊	頓宮 裕真	○	×	×	5.0	0	0	76	2	3	4	ソフトバンク	○ 7-2
・・・・
・・・・
・・・・
34	5月5日(水)	山本 由伸	頓宮 裕真	●	×	×	6.1	5	4	120	10	2	6	西武	● 2-6
35	5月7日(金)	山岡 泰輔	伏見 寅威	●	×	×	5.0	5	5	100	8	2	5	ロッテ	● 5-7
36	5月8日(土)	田嶋 大樹	頓宮 裕真	○	◎	×	6.0	2	1	91	4	0	6	ロッテ	○ 5-2
37	5月9日(日)	増井 浩俊	伏見 寅威	●	×	×	3.2	5	4	78	8	3	2	ロッテ	● 4-7
38	日付	先発投手	先発捕手	投手責任	QS	HQS	投球回	失点	自責点	投球数	被安打	与四死球	奪三振	対戦相手	試合結果

そのため、データフレーム形式として代入させて、末尾の行を削ります。

df = data[0]
df = df[:-1]

最初に用意したフレームワークにデータを追加していきます。
縦方向に追加していく処理としてpd.concatでチームのデータを取得したら、データフレームに追加していく処理をチーム分繰り返してます。
繰り返しする際は、アクセスの時間間隔を取るためにsleep関数で明示的に処理をしない時間を作ります。

df_concat = pd.concat([df_concat,df])
time.sleep(100)

最後にcsv出力します。
indexの値はあってもなくても良いのですが、ここではindexは不要としてindex=Falseを指定しています。

   df_concat.to_csv('staeter.csv',index=False)

以上、14行でプロ野球の先発の成績データのスクレイピングが完了します。

スクレイピングの本ならこの本がいいですね

スクレイピングする機会が多いので、スクレイピングに関する良い書籍も紹介していきます。
野球データの取得する際は基本的にread_htmlメソッドしか使っていませんが、実際はbeautifulsoupやscrapyなどを使用して、HTMLタグの把握して取得していく処理をします。
そんなことしてたら。コード量も多いですし、一つの処理でも長くてよくわからなくなるので今のところ記事にはしていません。(ぇ
よりスクレイピングについて学びたい方におすすめの書籍になります。
スクレイピングの基礎から応用まで書かれていますし、コードも多くかつスクレイピングする上での注意点やシステム化する場合への言及もあるので、一通りこれ一冊があればある程度のことはできます。
また、スクレイピングの仕方もライブラリを使用しないパターンから使用するパターンも説明しているので、とても参考になります。

今回のコードとデータはこちらです。(有料)

今回の記事で使用したプログラムと取得したデータを以下よりダウンロードできます。(※有料です)

ここから先は

0字 / 2ファイル
この記事のみ ¥ 200
期間限定 PayPay支払いすると抽選でお得に!

この記事が参加している募集

#野球が好き

11,276件

よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。