山雅サポのpython勉強日記_#2 (webスクレイピング, エクセル操作)
1. はじめに
本記事は、山雅サポによるpythonの勉強の備忘録になります。
*前回の記事はこちら
・・・ひとまず3日坊主は回避(苦笑
2. 今回の結論
各チームの分析用の素材として、2021シーズンの全57チーム/各選手のPlayingStyleを取得するコードを作ってみた(以下の画像参照)。
実際のファイルはこちら。
では、詳細を説明していきます。
3. 今回実現したいこと
ほぼ初めましてとなる、J3各チームの分析をしたい
→ 去年大躍進を見せた宮崎さんとか、お隣さんとか。どんな選手がいるのか全然知らないので。
4. どうやってpythonで実現するのか
4-1. 各チームの分析って・・・どうやるの?
チームを作るの要素の1つは"選手"である。そのためまずは、どんな特徴をもった選手がいるのか知ることが必要だと考えた。
各選手の特徴はどうやって調べるのか。今回は、Football LAB様の "PlayingStyle"を使うことにした(下図参照)。この数値だけが全てではないが、選手の特徴を簡単に掴める素晴らしい仕組みである。Football LAB様、いつも本当にお世話になっております。
※引用元:https://www.football-lab.jp/
結論:
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/」)
コードは以下の部分
#全てのチームの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を取得する
コードとしてはこの部分
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から値を取得する
コードは以下の部分。
# 対象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チームの分析っぽいことをしてみようと思っています。
ではまた。