2021年2月1日に2021年版に更新されるらしいので、Jリーグ選手名鑑2020の選手スタッツを含めてデータを収集しました。
スタッツ以外の選手名鑑のデータは以下の記事で公開してますが、今回はさらに取得情報を追加しております。
1. 選手一覧
2021年1月14日(日)現在のデータです。各種統計データ列内に%やリーグ何位等の文字が混在しており数字処理しにくいので別途整形予定ですがまずはそのまま公開します。
2. ソースコード
関連記事のソースコードにスタッツ部分のデータ取得処理を追加しております。その他、出力情報を増やしたり、処理方法を変更したりしております。
使い方は関連記事を参照お願いします。大体1時間ぐらいで取得完了するはずです。
from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup
import csv
import datetime
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome("C:\jData\chromedriver",options=options)
target_url ="https://www.jleague.jp/club/"
browser.get(target_url)
sleep(2)
"""
error_flg = False
try:
browser.execute_script("window.scrollTo(0,document.body.scrollHeight);")
sleep(120)
except Exception:
print("画面スクロール中にエラーが発生しました。")
error_flg = True
"""
soup = BeautifulSoup(browser.page_source, "html.parser")
leagues = soup.select("body > div.content > div.main > section > section")
players =[]
for league in leagues:
level = league.h3.text
teams_l = league.select("ul.clubTeamUl > li")
teams_r = league.select('ul:nth-child(3) > li')
#デバッグ用
# d_cnt =1
for index in range(len(teams_l)+len(teams_r)):
# if d_cnt>2:
# break
# d_cnt +=1
if index %2 == 0:
team = teams_l[index//2]
else:
team = teams_r[index//2]
team_lnk = "https://www.jleague.jp/"+team.a.get("href")+"#player"
browser.get(team_lnk)
sleep(1)
soup = BeautifulSoup(browser.page_source, "html.parser")
club =soup.select("div.clubTeamTitle.clubJ1Emb.clearfix > h3 > span")[0].text
trs = soup.select("#loadArea > section > table > tbody > tr")
#デバッグ用
# debug_cnt =1
for tr in trs:
# if debug_cnt>10:
# break
# debug_cnt +=1
number = tr.select("td:nth-child(1)")[0].text
hg = tr.select("td:nth-child(3)")[0].text
name = tr.select("td:nth-child(4)")[0].text.replace("\u3000"," ")
position = tr.select("td:nth-child(5)")[0].text
hometown = tr.select("td:nth-child(6)")[0].text
birthday = tr.select("td:nth-child(7)")[0].text
# form = tr.select("td:nth-child(10)")[0].text
height = tr.select("td:nth-child(8)")[0].text.split('/')[0]
weight = tr.select("td:nth-child(8)")[0].text.split('/')[1]
participation = tr.select("td:nth-child(9)")[0].text
goal = tr.select("td:nth-child(10)")[0].text
i_url = "https://www.jleague.jp"+tr.get("data-href")
# players.append([club,number,hg,name,position,hometown,birthday,form,participation,goal,i_url])
players.append([level,club,number,hg,name,position,hometown,birthday,height,weight,participation,goal,i_url])
# print(len(players))
# タイトル行をcsvファイルに書き出し
#table_head = ["クラブ","背番号","HG","名前","英名","Pos","出生地","生年月日","身長/体重","出場試合数","ゴール数"]
table_head = ["リーグ","クラブ","背番号","HG","名前","英名","Pos","出生地","生年月日","身長","体重","出場試合数","ゴール数"]
table_head_add =["J初出場","J初得点","代表出場数","所属1","所属2","所属3","所属4","所属5","所属6","所属7","所属8","所属9","所属10"]
table_head_stats=[
'今季得点数',
'今季部位別得点(左足得点数)',
'今季部位別得点(右足得点数)',
'今季部位別得点(ヘディング得点数)',
'今季部位別得点(その他部位得点数)',
'通算ゴール数',
'現所属チーム内での得点割合',
'1試合平均シュート数',
'シュート決定率',
'1試合平均プレー数 ※1',
'1試合平均敵陣パス数',
'1試合平均自陣パス数',
'1試合平均ロングパス数',
'ロングパス成功率',
'アシスト数',
'1試合平均クロス数',
'1試合平均チャンスクリエイト数 ※2',
'1試合平均タックル数',
'タックル成功率',
'空中戦勝率',
'1試合平均インターセプト',
'被ファウル数',
'ファウル数',
'警告',
'退場',
'1試合平均セーブ数',
'セーブ率(ペナルティエリア内)',
'セーブ率(ペナルティエリア外)',
'1試合平均パス数',
'キャッチ率(ペナルティエリア内シュート)',
'キャッチ率(ペナルティエリア外シュート)',
'キャッチ率(クロス)',
'パンチ率(ペナルティエリア内シュート)',
'パンチ率(ペナルティエリア外シュート)',
'パンチ率(クロス)']
table_head =table_head + table_head_add +table_head_stats
csv_date= datetime.datetime.today().strftime("%Y%m%d")
csv_file_name= "C:\jData\Jleagers_full_"+csv_date+".csv"
# f=open(csv_file_name,"w",errors="ignore")
f=open(csv_file_name,"w",encoding='utf_8_sig',errors="ignore")
writer = csv.writer(f,lineterminator="\n")
writer.writerow(table_head)
# 所属歴の読みだしおよび選手毎にcsvファイルの書き出し
#debug =0
for player in players:
# browser.get(player[10])
browser.get(player[12])
sleep(0.2)
t_soup = BeautifulSoup(browser.page_source, "html.parser")
if t_soup.find(class_="clubPlayerNameBox"):
english = t_soup.find(class_="clubPlayerNameBox").select("li:nth-child(2)")[0].p.text
affiliations = t_soup.find(class_="clubProfileBox").text.replace("\n","").split("-")
else:
english = ""
affiliations=[]
if len(affiliations)>10:
affiliations = affiliations[:10]
else:
for i in range(10-len(affiliations)):
affiliations.append("")
first_play_date = t_soup.find(class_="playerDateTable").select("tbody > tr:nth-child(4) > td")[0].text
first_goal_date = t_soup.find(class_="playerDateTable").select("tbody > tr:nth-child(5) > td")[0].text
japan=0
if t_soup.find(class_="playerDateTable").select("tbody > tr:nth-child(6) > td"):
japan = t_soup.find(class_="playerDateTable").select("tbody > tr:nth-child(6) > td")[0].text.replace("回","")
# table_body = player[:4]+[english]+ player[4:10]+affiliations
table_body = player[:5]+[english]+ player[5:12]+[first_play_date,first_goal_date,japan]+affiliations
#player[]にstatsを追加
stat_values=[]
stat_groups = t_soup.select("#stats1 > div:nth-child(3) > div")
for stat_group in stat_groups:
for items in stat_group.select("tr"):
stat_values.append(items.td.text)
table_body= table_body+stat_values
writer.writerow(table_body)
# debug = debug +1
# if debug >50:
# break
f.close()
コメント
コメントテスト