プロ野球の全選手のデモグラ情報を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にしました。

コンキャットJPG.JPG

データフレームの内容確認

確認用の関数作成

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)

データセットの中身確認.JPG

ひとまず、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()

型変換後.JPG

型変換されているか確認

data_check(demographic_set)

型変換確認.JPG

最後に重複がないか確認

demographic_set[demographic_set.duplicated(subset='選手名', keep=False)].sort_values('選手名')

image.png

同じ名前の人は何人かいるけど、重複はなさそう(中日と日ハムのロドリゲスが一緒かと思ったけどよく見たら違う)。なので、名前とチーム名でユニークにできそう。

これで、デモグラ情報の取得はできた!あとは思い思いに分析していくだけですね!

以上になります!記載内容で間違いなどありましたら、優しく教えていただけると嬉しいです!