Python

【Python】スポーツナビから海外サッカーの得点ランキングをスクレイピング

みなさん、こんにちは。いし(@ishilog2)です。

今回はPythonを用いて、Yahoo SportsNaviから海外サッカーの順位表をスクレイピングにて取得したいと思います。

[st_toc]

導入編

今回のコードではrequestsとBeautifulSoup、Pandasを使用します。
インストールしていない方はインストールして下さい。

実践

スポーツナビ(https://soccer.yahoo.co.jp/ws/stats/52)から順位表を取得します。

サンプルコード

def WorldSoccreStats(LeagueCode):
    r = requests.get("https://soccer.yahoo.co.jp/ws/stats/" + str(LeagueCode))
    soup = BeautifulSoup(r.text, "html.parser")
    rs = soup.find("div", class_="sn-table sn-table--rankingStats")
    rs = [i.strip() for i in rs.text.splitlines()]
    rs = [i for i in rs if i != ""]
    rs = [rs[i:i + 6] for i in range(0, len(rs), 6)]
    df = pd.DataFrame(rs[1:-1], columns = rs[0])
    print(df)

WorldSoccreStats(52)

結果

    順位                選手名                チーム名        国籍  得点 試合数
0    1            ハリー・ケーン         トテナム・ホットスパー    イングランド  23  35
1    2           モハメド・サラー              リヴァプール      エジプト  22  37
2    3       ブルーノ・フェルナンデス      マンチェスター・ユナイテッド     ポルトガル  18  37
3    4       パトリック・バンフォード          リーズ・ユナイテッド    イングランド  17  38
4    4            ソン・フンミン         トテナム・ホットスパー        韓国  17  37
5    6  ドミニク・キャルバート・ルーウィン              エヴァートン    イングランド  16  33
6    7        ジェイミー・ヴァーディ            レスター・シティ    イングランド  15  34
7    8          オリー・ワトキンス            アストン・ヴィラ    イングランド  14  37
8    9      アレクサンドル・ラカゼット               アーセナル      フランス  13  31
9    9        イルカイ・ギュンドアン         マンチェスター・シティ       ドイツ  13  28
10  11          カルム・ウィルソン      ニューカッスル・ユナイテッド    イングランド  12  26
11  11            クリス・ウッズ             バーンリーFC  ニュージーランド  12  33
12  11         ケレチ・イヘアナチョ            レスター・シティ    ナイジェリア  12  25
13  11           ダニー・イングス             サウザンプトン    イングランド  12  29
14  15            サディオ・マネ              リヴァプール      セネガル  11  35
15  15      マーカス・ラッシュフォード      マンチェスター・ユナイテッド    イングランド  11  37
16  15            ガレス・ベール         トテナム・ホットスパー     ウェールズ  11  20
17  15          マテウス・ペレイラ  ウェスト・ブロムウィッチ・アルビオン      ブラジル  11  33
18  15         ウィルフリード・ザハ           クリスタル・パレス  コートジボワール  11  30
19  20   ピエール・エメリク・オーバメヤン               アーセナル       ガボン  10  29
20  20            ニコラス・ペペ               アーセナル  コートジボワール  10  29
21  20         アンワル・エル・ガジ            アストン・ヴィラ      オランダ  10  28
22  20        エディンソン・カバーニ      マンチェスター・ユナイテッド     ウルグアイ  10  26
23  20         マイケル・アントニオ       ウェストハム・ユナイテッド    イングランド  10  26
24  20         トマシュ・ソウチェク       ウェストハム・ユナイテッド       チェコ  10  38
25  20         ラヒム・スターリング         マンチェスター・シティ    イングランド  10  31
26  20       クリスティアン・ベンテケ           クリスタル・パレス      ベルギー  10  30
27  28          ディオゴ・ジョッタ              リヴァプール     ポルトガル   9  19
28  28         ロベルト・フィルミノ              リヴァプール      ブラジル   9  36
29  28         ジェシー・リンガード       ウェストハム・ユナイテッド    イングランド   9  16
30  28           リヤド・マフレズ         マンチェスター・シティ    アルジェリア   9  27
31  28          フィル・フォーデン         マンチェスター・シティ    イングランド   9  28
32  28         ガブリエル・ジェズス         マンチェスター・シティ      ブラジル   9  29
33  28         ハーヴェイ・バーンズ            レスター・シティ    イングランド   9  25
34  28            チェ・アダムス             サウザンプトン    イングランド   9  36
35  84               南野拓実             サウザンプトン        日本   3  19

 

解説

① requestsを用いてHTMLを取得
r = requests.get("https://soccer.yahoo.co.jp/ws/stats/" + str(LeagueCode))

requests.get(‘URL’)でHTML情報を習得します。

② BeautifulSoupを使用してhtml形式にパース
soup = BeautifulSoup(r.text, "html.parser")

①で習得したHTMLからBeautifulSoupオブジェクトを作成します。

③ sn-table sn-table–rankingStatsクラスの文字列を取得
rs = soup.find("div", class_="sn-table sn-table--rankingStats")
④ 取得した内容をリストに格納
rs = [i.strip() for i in rs.text.splitlines()]

リスト内表記を使用して、習得したデータをリストに格納・リスト内の要素の前後にある空白を削除します。splitlines()で改行コードで分割して、strip()で空白を削除します。
ただこれだと見づらいのでリスト内の空白要素を削除します

rs = [i for i in rs if i != ""]
⑤ リストを分割
rs = [rs[i:i + 6] for i in range(0, len(rs), 6)]

6個ずつに分割しています。

⑥ リストをデータフレームへ変換
df = pd.DataFrame(rs[1:-1], columns = rs[0])

pd.DataFrame()でリストからデータフレームへ変換します。
リスト1つ目はヘッダーのため2つ目からをデータフレームにしています。カラムにはリスト1つ目を設定します。

【おまけ】各リーグコード

リーグ名 番号
イングランド プレミアリーグ 52
スペイン ラ・リーガ 67
ドイツ ブンデスリーガ 56
イタリア セリエA 53
フランス リーグアン 54
オランダ エールディビジ 2
ベルギー ベルギーリーグ 48
ポルトガル ポルトガル・リーグ 69

 

ABOUT ME
ishi
こんにちは。IshiLog.com管理人です。 趣味は食事とゲーム、ガジェットを買うこと。 業務推進部にてRPA等による業務効率化やWebアプリ開発等を行なっています。 このブログではPython等のプログラミングに関する備忘録として技術や知識、趣味に関することを紹介していきます。