見出し画像

山雅サポのpython勉強日記_#2 (webスクレイピング, エクセル操作)

1. はじめに

本記事は、山雅サポによるpythonの勉強の備忘録になります。

*前回の記事はこちら

・・・ひとまず3日坊主は回避(苦笑

2. 今回の結論

各チームの分析用の素材として、2021シーズンの全57チーム/各選手のPlayingStyleを取得するコードを作ってみた(以下の画像参照)。

スクリーンショット 2022-01-19 22.07.43

実際のファイルはこちら。

では、詳細を説明していきます。

3. 今回実現したいこと

ほぼ初めましてとなる、J3各チームの分析をしたい
→ 去年大躍進を見せた宮崎さんとか、お隣さんとか。どんな選手がいるのか全然知らないので。

4. どうやってpythonで実現するのか

 4-1. 各チームの分析って・・・どうやるの?

チームを作るの要素の1つは"選手"である。そのためまずは、どんな特徴をもった選手がいるのか知ることが必要だと考えた。

各選手の特徴はどうやって調べるのか。今回は、Football LAB様の "PlayingStyle"を使うことにした(下図参照)。この数値だけが全てではないが、選手の特徴を簡単に掴める素晴らしい仕組みである。Football LAB様、いつも本当にお世話になっております。

※引用元:https://www.football-lab.jp/

DF_大野_2021

結論:
J3各チームの分析として、各所属チームの全選手のPlayingStyleを取得&比較してみる

 4-2. どうやってpythonで実現する?

上記内容は、Football LAB様の各選手のページを開き、PlayingStyle値をExcelファイルに書き込んでいけば良いだけ。しかし、それを何百回もやるのは非常に面倒。退屈。

そんな退屈なことはpythonにやらせよう。

ポイントは2点。

#1. 自動で、各チーム・各選手のPlayingStyleの値を取得すること
#2. 自動で、#1の値をExcelファイルにまとめること

#1は、BeautifulSoupライブラリを使用して Football LAB様のWEBページを解析することで実現する。

#2は、openpyxlライブラリを使用して実現する。

5. 実現結果

 5-1. 作成したコード

コードはこちら

これを実行すると、"Football LAB様のページから、J1,J2,J3全チーム(*1)/各選手(*2)のPlayingStayleをエクセルファイルに出力される

*1...どうせならと思い、J3以外の選手も出力してみた。
*2...2021シーズンに出場した選手のみ。

以下、本コードの流れを解説

1. 全チームのURLを取得する

FootballLAB様のTOPページのフッター部分、具体的には↓の画像の部分のHTMLを解析して、全チームのURLを取得(例. 山雅は 「https://www.football-lab.jp/mats/」)

スクリーンショット 2022-01-19 21.45.07

コードは以下の部分

#全てのチームのURLを取得する
team_urls = []
team_names = []
soup = BeautifulSoup(requests.get(MAIN_PAGE_URL).content, 'lxml')
for link in soup.select('a'):
 if link.get("title"):               #条件 > タグ:'a' && "title"属性を持つ
   team_url = MAIN_PAGE_URL + link.get("href")
   team_name = link.get("title")
   #print("[DEBUG] team_url = %s,   team_name = %s" % (team_url, team_name) )
   team_urls.append(team_url)
   team_names.append(team_name)

2. 各チームごとに、エクセルに新規シート作成する

新規シートの追加はこちら(後々エクセルファイルが読みやすいように、ここでヘッダーも追加)

  #対象チーム用のsheetを作成する
 sheet = book.create_sheet(title = team_names[j])
 sheet.append(["選手名","決定力","OTシュート","Hシュート","Lシュート","SPシュート","パスRP","敵陣空中戦","ドリブルCH","クロスCH","パスCH","ビルドアップ","自陣空中戦","守備","ボール奪取","カバーエリア"])

3. 各チームごとに、各選手のPlayingStyle取得を行う

PlayingStayleを取得するためには、まずその選手のURLが必要。そのために、以下の画像部分のHTMLからURLを取得する

スクリーンショット 2022-01-19 21.52.14

コードとしてはこの部分

 soup = BeautifulSoup(requests.get(team_url).content, 'lxml')
 #対象チームの"2021シーズンに出場機会のあった"全選手のURLを取得する
 i = 0
 player_urls.clear()
 for link in soup.select('a'):
   if link.get("href"):
     if link.get("href").startswith("/player"):    #条件 > タグ:'a' && 'href'属性を持つ && 'href'の属性値の先頭文字が "/player"      
       i += 1
       if i > 15:  #上記抽出方法だと"ゴールランキング"からも情報が取れてしまうので、暫定対策
         player_url = MAIN_PAGE_URL + link.get("href")
         player_urls.append(player_url)

​そして、いよいよPlayingStyle。以下の画像部分のHTMLから値を取得する

スクリーンショット 2022-01-19 21.54.36

コードは以下の部分。

# 対象Playerの"PlayingStayle"を取得する
def get_playing_stayle(player_url):

 style_data = []
 soup = BeautifulSoup(requests.get(player_url).content, 'lxml')

〜〜省略〜〜

 for link in soup.select("span.numL"):
   if 1 <= len(link.getText()) and len(link.getText()) <= 2:
     if link.getText() == '-':
       style_data.append(link.getText())
     else:
       style_data.append(int(link.getText()))

 3. 各チームごとに、取得した各選手のPlayingStyleをエクセルに追加する

以下のコード。楽ちん

sheet.append(style_data)

最後は指定のファイル名でエクセルファイルを保存しておしまい。

#ファイルに保存
book.save(BOOK_NAME)

5-2. 上記コードの実行結果

実行結果のファイルは「2. 今回の結論」で述べた通り。全57チーム、各選手のPlayingStyleを出力することができました。

6. 終わりに 

今回の勉強日記は以上になります。

結局、今回はデータ取得だけで終わってしまいました。

次回は取得したデータを使って、又なんかうまい具合にpython使って、J3チームの分析っぽいことをしてみようと思っています。

ではまた。