見出し画像

スクレイピングしやすいサイトを見つけたら10行でプロ野球選手のプロフィールデータを取れた件

プロ野球選手の成績データ、年俸データをスクレイピングする記事をいくつか出してデータ分析に必要なデータを収集するを記事を投稿してきました。
データ分析をするためにデータが必要なことは当たり前ですが、データを収集するためにいろんなサイトなどからデータないかなと探したりします。
特にプロ野球のデータはまとまったデータセットがどこかにあるわけではないので、いろんなサイトをめぐって探すこともあります。


そして、データを探索していたら見つけてしまいました・・・

もっとスクレイピングしやすいサイトが!!
どれくらいスクレイピングしやすいかというと、10行の関数でプロ野球選手のプロフィールデータをスクレイピングできます。
10行の関数で2020年のプロ野球選手のプロフィールデータを取る方法を解説します。


サイトによってスクレイピングでやらなければいけない処理が微妙に違うところも比較できれば面白いかもしれません。

今回スクレイピングするサイト

プロ野球Freakというサイトで、プロ野球のニュースサイトになります。
このサイトに成績や選手プロフィールのデータが表の形で撮りやすそうな形をしています。
各チームのページにスクレイピングをして2020年のプロ野球選手のプロフィールデータを取得し、加工してcsvファイルの形にしていきます。

例えばカープのプロフィールデータは以下のページのようになっています。

スクレイピングするときの注意点

スクレイピングをするときは、スクレイピングするサイトに迷惑をかけないように以下のことに気を付けましょう。
・robots.txtがサイト内に置いてあるか確認して、中身を見ましょう。
 場合によっては、スクレイピングを許さないサイトかもしれません。
 その時はあきらめるしかありません。
 詳しくは以下のサイトなどを参考に確認をするといいでしょう。

・不用意にアクセスを頻発するコードを書かない
・サイト内の複数ページにわたってスクレイピングをかけるときは1位秒以上間隔をあけましょう

ちなみに、今回スクレイピングするサイトはrobots.txtは置いてありません。
置いてない時は、上記の不用意に頻発しない。
アクセス間隔を最低でも1秒以上あけることを心がけましょう。

スクレイピングをしていきます

実際にデータが取れそうかを確認しながらスクレイピングをしていく形でコードを説明していきます。
いきなり関数を紹介してもいいのですが、スクレイピングを実行していく過程を今回は見せていこうと思います。

まずは、ライブラリをインポートしましょう。

import pandas as pd
import time

データを取得します。
ここでは試しに

data = pd.read_html('https://baseball-data.com/19/player/yb/')

実行結果:
[    No.    選手名   守備        生年月日   年齢   年数     身長     体重 血液型  投打      出身地  \
0     0  宮本 秀明  外野手  1996/07/24  232年  178cm   83kg  O型  右左       熊本   
1     0  中井 大介  内野手  1989/11/27  3012年  183cm   88kg  B型  右右       三重   
2     1  桑原 将志  外野手  1993/07/21  268年  174cm   78kg  B型  右右       大阪   
3     2    ロペス  内野手  1983/11/24  367年  183cm  103kg  不明  右右    ベネズエラ   
4     3  梶谷 隆幸  外野手  1988/08/28  3113年  180cm   85kg  A型  右左       島根   
..  ...    ...  ...         ...  ...  ...    ...    ...  ..  ..      ...   
68   97    ソリス   投手  1988/08/10  311年  196cm  114kg  不明  左右     アメリカ   
69   99     ソト  内野手  1989/02/28  302年  185cm   97kg  不明  右右   プエルトリコ   
70  100  宮城 滝太   投手  2000/07/15  191年  181cm   73kg  A型  右右       沖縄   
71  106  水野 滉也   投手  1994/06/01  253年  175cm   80kg  O型  右右      北海道   
72  107   コルデロ   投手  1997/12/18  221年  189cm   88kg  不明  左左  ドミニカ共和国   

      年俸(推定)  
0      850万円  
1    1,200万円  
2    8,400万円  
3   23,000万円  
4    9,600万円  
..       ...  
68   3,300万円  
69   9,500万円  
70     340万円  
71     950万円  
72     240万円  

しっかり、テーブルになっていて取りやすそうですね。
DataFrame型にしましょう。

data = data[0]

DataFrame型にできましたので、データを確認してみましょう。

data.head()

実行結果:
	No.	選手名	守備	生年月日	年齢	年数	身長	体重	血液型	投打	出身地	年俸(推定)
0	0	宮本 秀明	外野手	1996/07/24	23歳	2年	178cm	83kg	O型	右左	熊本	850万円
1	0	中井 大介	内野手	1989/11/27	30歳	12年	183cm	88kg	B型	右右	三重	1,200万円
2	1	桑原 将志	外野手	1993/07/21	26歳	8年	174cm	78kg	B型	右右	大阪	8,400万円
3	2	ロペス	内野手	1983/11/24	36歳	7年	183cm	103kg	不明	右右	ベネズエラ	23,000万円
4	3	梶谷 隆幸	外野手	1988/08/28	31歳	13年	180cm	85kg	A型	右左	島根	9,600万円

最高の形じゃないか!!
きれいになっています。
何もする必要がございませんw
せっかくですので、年齢や年俸など数値として扱いたいところは変換しておきましょう。
型を確認します。

data.dtypes

実行結果:
No.        int64
選手名       object
守備        object
生年月日      object
年齢        object
年数        object
身長        object
体重        object
血液型       object
投打        object
出身地       object
年俸(推定)    object
dtype: object

基本的にオブジェクト型ですので、文字列型にして「年」等を削ります。
replaceで消して確認します。

data['年齢'] = data['年齢'].str.replace('歳','')
data.head()
実行結果:
	No.	選手名	守備	生年月日	年齢	年数	身長	体重	血液型	投打	出身地	年俸(推定)
0	0	宮本 秀明	外野手	1996/07/24	23	2178cm	83kg	O型	右左	熊本	850万円
1	0	中井 大介	内野手	1989/11/27	30	12183cm	88kg	B型	右右	三重	1,200万円
2	1	桑原 将志	外野手	1993/07/21	26	8174cm	78kg	B型	右右	大阪	8,400万円
3	2	ロペス	内野手	1983/11/24	36	7183cm	103kg	不明	右右	ベネズエラ	23,000万円
4	3	梶谷 隆幸	外野手	1988/08/28	31	13180cm	85kg	A型	右左	島根	9,600万円

簡単に消えたでしょう?
この処理を他の列にもやっていきます。

data['年俸(推定)'] = data['年俸(推定)'].str.replace('万円','')
data['年俸(推定)'] = data['年俸(推定)'].str.replace(',','')
data['身長'] = data['身長'].str.replace('cm','')
data['年数'] = data['年数'].str.replace('年','')
data['体重'] = data['体重'].str.replace('kg','')
data.head()

実行結果:
	No.	選手名	守備	生年月日	年齢	年数	身長	体重	血液型	投打	出身地	年俸(推定)
0	0	宮本 秀明	外野手	1996/07/24	23	2	178	83	O型	右左	熊本	850
1	0	中井 大介	内野手	1989/11/27	30	12	183	88	B型	右右	三重	1200
2	1	桑原 将志	外野手	1993/07/21	26	8	174	78	B型	右右	大阪	8400
3	2	ロペス	内野手	1983/11/24	36	7	183	103	不明	右右	ベネズエラ	23000
4	3	梶谷 隆幸	外野手	1988/08/28	31	13	180	85	A型	右左	島根	9600

いい感じですね。
保存して完成です。
indexはいらないので、indexの引数をFalseにしておくと良いでしょう。

data.to_csv('output.csv',index=False)

簡単にスクレイピングできたでしょう。
これらの処理は、別のチームでも同じですので次の章では関数にしてまとめて処理をします。

ここから先は

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

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