プロ野球の全選手のデモグラ情報をpythonでスクレイピングして取得する
プロ野球選手のデモグラ情報をループ処理して全チーム分の選手の情報を取得します。
この記事に書いてあることができればこちらの記事にあるデータは取得できるかも。ただし集計方法は今回の記事に書いてないので、悪しからず。
こちらのサイトから情報を取得したいと思いますが、1ページに1チーム分しかないのでループ処理で取得したいと思います。
必要なライブラリのインポート
import pandas as pd from time import sleep
ループ処理でスクレイピング
html_list = ['g', 'yb', 't', 'c', 'd', 's', 'l', 'h', 'e', 'm', 'f', 'bs'] team_list = ['巨人', 'DeNA', '阪神', '広島', '中日', 'ヤクルト', '西武', 'ソフトバンク', '楽天', 'ロッテ', '日本ハム', 'オリックス'] demographic_list = [] for html, team in zip(html_list, team_list): print(team) lst_h = pd.read_html(f"https://baseball-data.com//19/player/{html}/", flavor = "bs4") lst_h[0]['チーム'] = team demographic_list.append(lst_h[0]) sleep(3)
元のサイトにはチーム名がわかるカラムがなかったので追加しました。もし同じ名前の選手がいた場合、どのチームの選手かを判断できなくなってしまうことを防ぐためです。もし同じチームに同じ名前の選手がいたら、、、、そのときにまた考えます。
デモグラのデータセットを作成
demographic_set = pd.concat(demographic_list, ignore_index = True)
demographic_set.head()
demographic_listのそれぞれのdataframeをconcatして1つのdataframeにしました。
データフレームの内容確認
確認用の関数作成
def data_check(data_set): df = pd.concat([ data_set.count().rename('データ件数'), data_set.dtypes.rename('データ型'), data_set.nunique().rename('ユニーク数'), data_set.isnull().sum().rename('null件数'), (data_set.isnull().sum() * 100 / data_set.shape[0]).rename('欠損の割合 (%)').round(2)], axis=1) display(df)
関数実行
data_check(demographic_set)
ひとまず、nullはなさそう。 No.以外のカラムすべてobjectになっているのがわかります。このままでは分析に使えないので、型を変えていきます。
demographic_set['体重'] = demographic_set['体重'].str.strip('kg').astype(int) demographic_set['身長'] = demographic_set['身長'].str.strip('cm').astype(int) demographic_set['年齢'] = demographic_set['年齢'].str.strip('歳').astype(int) demographic_set['生年月日'] = pd.to_datetime(demographic_set['生年月日']) demographic_set['年数'] = demographic_set['年数'].str.strip('年数').astype(int) demographic_set['年俸(推定):万円'] = demographic_set['年俸(推定)'].str.strip('万円').str.replace(',','').astype(int) demographic_set['選手名'] = demographic_set['選手名'].str.replace(' ', '') demographic_set.head()
型変換されているか確認
data_check(demographic_set)
最後に重複がないか確認
- pandas.DataFrame.duplicated
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.duplicated.html
demographic_set[demographic_set.duplicated(subset='選手名', keep=False)].sort_values('選手名')
同じ名前の人は何人かいるけど、重複はなさそう(中日と日ハムのロドリゲスが一緒かと思ったけどよく見たら違う)。なので、名前とチーム名でユニークにできそう。
これで、デモグラ情報の取得はできた!あとは思い思いに分析していくだけですね!
以上になります!記載内容で間違いなどありましたら、優しく教えていただけると嬉しいです!