メッシとロナウドがクラブ通算600ゴール達成したらしいので、これまでの得点データをスクレイピングしてみます。
1. はじめに
概要
2019年5月1日、チャンピオンズリーグ準決勝のリバプール戦において、メッシがクラブ通算600ゴールを達成しました。これを記念して、メッシのクラブにおける全得点データをスクレイピングにより取得してみます。
初得点から14年…通算600ゴール到達のメッシを10の数字で振り返る | サッカーキング
バルセロナのアルゼンチン代表FWリオネル・メッシが、クラブキャリア通算600ゴールを達成した。 5月1日に行われた、チャンピオンズリーグ(CL)準決勝ファー···
ロナウドも、この数日前の4月27日に通算600ゴールを達成しています。ちなみに、メッシは683試合で、ロナウドは801試合で600ゴールらしいです。どっちもすごいけど、メッシの異常さが際立ちます。
「メッシの600ゴールが良い刺激に…」アッレグリがC・ロナウドのさらなる覚醒に期待 | Goal.com 日本
ユヴェントスのマッシミリアーノ・アッレグリ監督は、クリスティアーノ・ロナウドがバルセロナのリオネル・メッシの活躍に触発されることを期待した。1日に行われたチャンピオンズリーグ準決勝のリヴァプール戦で、メッシは芸術撃なFK弾を含む2ゴールを挙げて、バルセロナの3-0の勝利に大きく貢献。さらに、このゴールでクラブ通算得点数...(続く)
利用するWebページ
transfer markt
に掲載されているこちらのデータを利用させて頂きます。
2. Messiの全得点データ取得
以前↓でやったこととだいたい同じです。
J1とLaLigaのクラブ間格差を、Pythonで分析でしてみた
NishipyJリーグは、どのチームが優勝する、専門家でも予想が難しいそうです。一方、スペインのLaLigaは、優勝チーム(Barcelona or Real Madrid)や上位に入るであろうチームが、容易く予想できることで有名...(続く)
インポート
今回使う予定のライブラリをインポートします。
1 2 3 4 5 6 |
import urllib.request from bs4 import BeautifulSoup import pandas as pd import csv import re |
HTMLの取得
urllib.request.Request()
で、headers
にユーザーエージェントを設定して、HTMLを取得します。
1 2 3 4 5 6 7 8 9 10 11 |
url = "https://www.transfermarkt.com/lionel-messi/alletore/spieler/28003/saison//verein/0/liga/0/wettbewerb//pos/0/trainer_id/0/minute/0/torart/0/plus/1" headers = { "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0", } request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request) encoding = response.info().get_content_charset(failobj="utf-8") html = response.read().decode(encoding) |
必要なデータを抽出
Beautiful Soup
を使って、必要なデータだけを抽出します。
1 2 3 |
soup = BeautifulSoup(html, 'html.parser') data = soup.find_all('table')[1] |
CSVファイルとして出力
今回は、各ゴールについてType of goal
までのデータを取得することにしました。よって、Type of goal
が出現したら、次のゴールのデータであると判断してます。
元のデータが複雑なので、ここで出力したCSVファイルは、あとで適切に修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
goal_types = ['Left-footed shot','Header','Right-footed shot','Penalty','Direct free kick', 'Chest', 'Penalty rebound', 'Counter attack goal', 'Long distance kick', 'Tap-in', 'Direct corner', 'Deflected shot on goal', 'Solo run'] # CSVの中身 csv_contents = [] tmp_list = [] for td in data.find_all('td', {'class':['links no-border-links', 'zentriert', 'no-border-links hauptlink', '']}): text = td.text.strip() text = re.sub('\xa0.*', '', text) if re.match('^\W', text): continue else: tmp_list.append(text) if text in goal_types: if len(tmp_list) == 3: blanks = ['']*10 blanks.extend(tmp_list) csv_contents.append(blanks) elif len(tmp_list) == 16: csv_contents.append(tmp_list[:13]) blanks = ['']*10 blanks.extend(tmp_list[13:]) csv_contents.append(blanks) else: csv_contents.append(tmp_list) tmp_list = [] # CSVのヘッダー。不要な列が混入してしまったため、Unnecessaryとしておく csv_headers = ['Unnecessary', 'Competition', 'Day', 'Date', 'HomeAway', 'Unnecessary', 'Unnecessary', 'Opponent', 'Result', 'Position','Minute', 'AtThisPoint','TypeOfGoal'] # CSVファイルの出力 with open('Messi_goals.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(csv_headers) for row in csv_contents: writer.writerow(row) |
CSVファイルの修正
Unnecessary
を削除
Unnecessary
としておいた、不要なカラムを削除します。
1 2 3 4 5 6 7 |
df_messi = pd.read_csv('Messi_goals.csv') del df_messi['Unnecessary'] del df_messi['Unnecessary.1'] del df_messi['Unnecessary.2'] df_messi.head() |
- 欠損値の穴埋め
Position
およびTypeOfGoal
に欠損値があるようでした。メッシはRWで出場し、左足でゴールを決めることが多いことを想定して、欠損値の穴埋めを行います。
1 2 3 |
df_messi = df_messi.fillna({'Position':'RW', 'TypeOfGoal':'Left-footed shot'}) print(df_messi.isnull().sum()) |
- 修正版CSVファイルの出力
修正が完了したので、再度出力します。
1 2 |
df_messi.to_csv('Messi_goals.csv') |
こんな感じに仕上がりました。
3. Ronaldoの全得点データ取得
ついでなので、ロナウドのデータも取得しておきます。ロナウドのデータはこちらにありました。前章と同様にすると、こんな感じで取得できました。
4. 最後に
- 汚いコードで恥ずかしいですが、GitHubにもNotebookをあげておきます
GitHub - nishipy/Messi_Ronaldo_Goals
Contribute to nishipy/Messi_Ronaldo_Goals development by creating an account on GitHub.
- 次はデータをBigQueryに入れて、Data Portalできれいに可視化します
以上.
コメント