![見出し画像](https://assets.st-note.com/production/uploads/images/21242117/rectangle_large_type_2_de36b941c43568205673dddc91b77093.png?width=800)
スクレイピングしやすいサイトを見つけたら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 23歳 2年 178cm 83kg O型 右左 熊本
1 0 中井 大介 内野手 1989/11/27 30歳 12年 183cm 88kg B型 右右 三重
2 1 桑原 将志 外野手 1993/07/21 26歳 8年 174cm 78kg B型 右右 大阪
3 2 ロペス 内野手 1983/11/24 36歳 7年 183cm 103kg 不明 右右 ベネズエラ
4 3 梶谷 隆幸 外野手 1988/08/28 31歳 13年 180cm 85kg A型 右左 島根
.. ... ... ... ... ... ... ... ... .. .. ...
68 97 ソリス 投手 1988/08/10 31歳 1年 196cm 114kg 不明 左右 アメリカ
69 99 ソト 内野手 1989/02/28 30歳 2年 185cm 97kg 不明 右右 プエルトリコ
70 100 宮城 滝太 投手 2000/07/15 19歳 1年 181cm 73kg A型 右右 沖縄
71 106 水野 滉也 投手 1994/06/01 25歳 3年 175cm 80kg O型 右右 北海道
72 107 コルデロ 投手 1997/12/18 22歳 1年 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 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万円
簡単に消えたでしょう?
この処理を他の列にもやっていきます。
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)
簡単にスクレイピングできたでしょう。
これらの処理は、別のチームでも同じですので次の章では関数にしてまとめて処理をします。
よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。