Jリーグ選手名鑑からの情報収集に引き続き海外組の情報収集もスクリプトを作成してみました。
1.海外サッカー選手情報サイト
サッカー選手の情報サイトとしては、transfermarkt.com が有名のようです。ドイツのサイトのようですが全世界のプロリーグおよびそこに所属する選手の情報が集められており、情報が充実しており更新も早そうです。特に、移籍に関する情報が詳しく移籍毎の移籍金の推移や市場価格などが記載されております。各メデイアが出す市場価格トップ10とかいう記事はほとんどこのサイトを参考にしているようです。
ということで、このサイトの情報を自動収集して一覧表を作成するツールです。
2.ツールの説明
2.1 事前準備
関連記事:Jリーグ選手名鑑収集ツールを参照お願いします。同じ環境で動きます。
2.1 概略
- transfermarkt.com の各国、各リーグ、各チームの選手一覧から日本国籍の各選手の個別ページをたどって各選手の情報を収集します。
- C:\JData フォルダ(別記事の1.事前準備 4.Cromeドライバーのインストールで作成)配下に overseas_all_作成日付.csv ファイルとして格納されます。
- 出力項目は、”リーグ名“,”クラブ”,”背番号”,”
HG”,”名前”,“英名”,”Pos”,”出生地”,”生年月日”,”身長”,”体重”,”出場試合数”,”ゴール数”,”市場価格”,”J初出場日”,”J初得点日”,”代表出場数”,“所属1”,・・・,”所属10”です。
HG(ホームグロウン)はJリーグ特有なので当然ないです。あと体重は何故かないです(基本的に可変だからと思います)。
このサイトは移籍情報が充実してるのでいろいろ他にもあるのですがとりあえず最新の市場価格だけJリーグのやつから追加取得してます。代表履歴情報も充実してて年代別代表の情報もあります。Jリーグのやつより充実してるしJリーガーもこっちサイトの情報もマージするかも。
ゴール数欄はキーパーの場合失点数が入ってるようです。多いのでビビリました。 - 対象のリーグは2021/1/17現在で以下の15リーグの情報を取得しておりますが、日本人選手がいてそうなら他からも取ってこようかなと思います。
#0:ドイツ1部,#1:プレミア,#2:スペイン1部,#3:イタリア1部,#4:フランス1部,#5:ポルトガル1部,#6:ベルギー1部,#7:オランダ,#8:オーストリア,#9:ドイツ2部,#10:スペイン2部,#11:カタール,#12:UAE,#13:韓国1部,#14:中国1部
- 現在の条件だとプログラム起動後30分程度で出力されるはずです。 コンソールをよく見るとエラーとかワーニングとかいっぱい出てますが、まあ、最後まで進むので良いかと。
- ソースコードを少し修正すれば各国のリーグのみの情報を出力できます。
125行目の loop= “NO” ,126行目のurl= urls[n]のnにリーグ対応のインデクス番号をいれれば良いです。
2.2 起動方法
- 2.3のコードを”適当.py”というファイル名でC:\JData配下に格納してください。
※私は Joverseas_collect.py って名前にしてます - スタートからWindows PowerShell を起動し python 適当.py を入力し起動します。
2.3 コード
from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup
import csv
import datetime
from selenium.webdriver.chrome.options import Options
# Webスクレイピング用関数 transfermarktのリーグ毎のURLとcsvファイルを指定
def cl_from_transfermarkt(url, f, headless ='OFF'):
players_table = []
if headless == 'ON':
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome("C:\jData\chromedriver",options=options)
else:
browser = webdriver.Chrome("C:\jData\chromedriver")
browser.get(url)
sleep(2)
soup = BeautifulSoup(browser.page_source, "html.parser")
trs = soup.select("#yw1 > table > tbody > tr")
for tr in trs:
#tr = trs[8]
team_url="https://www.transfermarkt.com"+tr.select("td:nth-child(2)")[0].a["href"]
browser.get(team_url)
sleep(1)
team_page = BeautifulSoup(browser.page_source, "html.parser")
members = team_page.select("#yw1 > table > tbody > tr")
for member in members:
#member =members[16]
if member.select("td:nth-child(5)")[0].img["title"] =="Japan":
member_url = "https://www.transfermarkt.com"+ member.select("td.hauptlink")[0].select("div")[0].a["href"]
browser.get(member_url)
sleep(1)
member_page = BeautifulSoup(browser.page_source, "html.parser")
league = member_page.find(class_="mediumpunkt").text.replace("\n","").replace("\t","")
member_data = member_page.select("table.auflistung")[0]
if member_data.select("tr:nth-child(10)")[0].select("a:nth-child(2)"):
club = member_data.select("tr:nth-child(10)")[0].select("a:nth-child(2)")[0].text
else:
club = member_data.select("tr:nth-child(9)")[0].select("a:nth-child(2)")[0].text
if member_page.find(class_="dataName").span:
number = member_page.find(class_="dataName").span.text.replace("#","")
else:
number=""
hg="NA"
name = member_data.select("tr:nth-child(1)")[0].td.text
english = member_page.find(class_="dataName").h1.text
position = member_data.select("tr:nth-child(7)")[0].td.text.replace("\n","").replace(" ","")
birthPlace = member_page.select("[itemprop='birthPlace']")[0].text.replace(", ","/")
birthday = member_data.select("tr:nth-child(2)")[0].td.text
height = member_data.select("tr:nth-child(5)")[0].td.text.replace("\xa0m","").replace(",",".")
height = int(float(height)*100)
weight = "NA"
if member_page.select("[data-viewport='Marktwert']")[0].select("div.row.collapse > div > div > div > div.row.collapse > div.large-5.columns.small-12 > div > div.zeile-oben > div.right-td"):
value = member_page.select("[data-viewport='Marktwert']")[0].select("div.row.collapse > div > div > div > div.row.collapse > div.large-5.columns.small-12 > div > div.zeile-oben > div.right-td")[0].text.strip()
else:
value = "NA"
appearances= member_page.select("#yw2 > table > tbody > tr.odd > td:nth-child(3) > a")[0].text
goals= member_page.select("#yw2 > table > tbody > tr.odd > td:nth-child(4)")[0].text
table_body = [league,club,number,hg,name,english,position,birthPlace,birthday,height,weight,value,appearances,goals]
ex_teams =[]
if member_page.select("[data-viewport='Jugendvereine']"):
member_youth = member_page.select("[data-viewport='Jugendvereine']")
youths = member_youth[0].find(class_="content").text.replace("\n","").replace("\t","").split(', ')
for youth in youths:
youth = youth.split(' (')[0]
ex_teams.append(youth)
ex_teams = ex_teams[:len(ex_teams)]
transfers = member_page.select("div.responsive-table > table > tbody > tr")
for transfer in reversed(transfers):
if transfer.select("td:nth-child(5)"):
ex_teams.append(transfer.select("td:nth-child(5)")[0].text)
affiliations =[]
if len(ex_teams)>10:
affiliations = ex_teams[:10]
else:
for i in range(10-len(ex_teams)):
ex_teams.append("")
affiliations = ex_teams
table_body = table_body+affiliations
players_table.append(table_body)
# csvファイルに書き出し
for player in players_table:
writer = csv.writer(f,lineterminator="\n")
writer.writerow(player)
urls =[
#0:ドイツ1部
"https://www.transfermarkt.com/1-bundesliga/startseite/wettbewerb/L1",
#1:プレミア
"https://www.transfermarkt.com/premier-league/startseite/wettbewerb/GB1",
#2:スペイン1部
"https://www.transfermarkt.com/primera-division/startseite/wettbewerb/ES1",
#3:イタリア1部
"https://www.transfermarkt.com/serie-a/startseite/wettbewerb/IT1",
#4:フランス1部
"https://www.transfermarkt.com/ligue-1/startseite/wettbewerb/FR1",
#5:ポルトガル1部
"https://www.transfermarkt.com/primeira-liga/startseite/wettbewerb/PO1",
#6:ベルギー1部
"https://www.transfermarkt.com/jupiler-pro-league/startseite/wettbewerb/BE1",
#7:オランダ
"https://www.transfermarkt.com/eredivisie/startseite/wettbewerb/NL1",
#8:オーストリア
"https://www.transfermarkt.com/bundesliga/startseite/wettbewerb/A1",
#9:ドイツ2部
"https://www.transfermarkt.com/2-bundesliga/startseite/wettbewerb/L2",
#10:スペイン2部
"https://www.transfermarkt.com/segunda-division/startseite/wettbewerb/ES2",
#11:カタール
"https://www.transfermarkt.com/qatar-stars-league/startseite/wettbewerb/QSL",
#12:UAE
"https://www.transfermarkt.com/uae-arabian-gulf-league/startseite/wettbewerb/UAE1",
#13:韓国1部
"https://www.transfermarkt.com/k-league-classic/startseite/wettbewerb/RSK1",
#14:中国1部
"https://www.transfermarkt.com/chinese-super-league/startseite/wettbewerb/CSL",
]
#ここからプログラム実行開始
loop= "YES" #全取得:"YES",特定リーグ取得:"NO"
url= urls[10] #loop="NO"の場合にリーグを指定
#CSVファイル作成 &ヘッダ書き出し
if loop == "YES":
#全リーグの場合
league = "all_"
else:
#リーグ指定の場合
league = url[url.rfind('/')+1:] +"_"
csv_date= league+datetime.datetime.today().strftime("%Y%m%d")
csv_file_name= "C:\jData\overseas_"+csv_date+".csv"
f=open(csv_file_name,"w",encoding='utf_8_sig',errors="ignore")
writer = csv.writer(f,lineterminator="\n")
table_head = ["リーグ","クラブ","背番号","HG","名前","英名","Pos","出生地","生年月日","身長","体重","市場価格","出場試合数","ゴール数"]
table_head_add = ["ex1","ex2","ex3","ex4","ex5","ex6","ex7","ex8","ex9","ex10"]
table_head= table_head+table_head_add
writer.writerow(table_head)
#選手情報書書き出し
if loop == "YES":
#全リーグの場合
for url in urls:
cl_from_transfermarkt(url, f, 'ON')
else:
#リーグ指定の場合
cl_from_transfermarkt(url, f)
#CSVファイルのクローズ
f.close
2.4 出力結果
2021年1月17日の出力結果は以下。
3. その他
今回、海外で活躍してる選手がまとまったサイトを探してて、transfermarkt.com を発見しました。こいつは凄いです。Jリーグの情報も入ってるし。この後も色々やってみますが、構成がかわっちゃうとまたコードを書き換えなくちゃいけないので大変なんですよね。APIで提供してくれてるとことかないか探してるんですけど、無料じゃないですかね。いろいろ情報募集しております。
コメント
[…] […]