概要
先日、2020明治安田生命Jリーグの日程が発表されました。(リリース)
このリリースにはPDF形式でJ1・J2・J3リーグの日程が提供されています。
また、Jリーグでは様々なデータを試合軸・チーム軸・選手軸で別サイトに提供しています。
本投稿は、PDF形式をスクレイピングすのではなく、上記サイトで提供されている「日程・結果」メニューから得られるページをpandas
が提供するread_html
を使って簡単に取得します。
URL構成
https://data.j-league.or.jp/SFMS01/search?competition_years=2020&competition_frame_ids=1&competition_ids=477&tv_relay_station_name=
- 基本:https://data.j-league.or.jp/
- アプリ名?:SFMS01
- パラメータ1:competition_years=2020 #年度
- パラメータ2:competition_frame_ids=1 #カテゴリー(J1)
- パラメータ3:competition_ids=477 #年度ごとのID
- それ以外は固定のまま
コード説明
game_schedule.py
# cording:uft-8
import pandas as pd
yyyy = 2020
url = 'https://data.j-league.or.jp/SFMS01/search?'
category = {'1': 477, '2': 478, '3': 479}
schedule = pd.DataFrame(index=None, columns=['年度', '大会', '節', '試合日', 'K/O時刻', 'ホーム', 'スコア', 'アウェイ', 'スタジアム', '入場者数', 'インターネット中継・TV放送'])
J1・J2・J3のカテゴリーと年度ごとのIDをdic形式で作成する。
空のデータフレームを作成する。
game_schedule.py
for key, value in category.items():
para = 'competition_years=' + str(yyyy)
para1 = '&competition_frame_ids=' + str(key)
para2 = '&competition_ids=' + str(value)
para3 = '&tv_relay_station_name='
full_url = url + para + para1 + para2 + para3
# print(full_url)
df = pd.read_html(full_url, attrs={'class': 'table-base00 search-table'}, skiprows=0)
schedule = pd.concat([schedule, df[0]], sort=False)
ポイントは、pd.read_html(full_url, attrs={'class':'table-base00 search-table'}...
で、対象のURLと<table>
の属性を指定しています。
取得したものをschedule
に結合します。
game_schedule.py
# NaNを置き換えたければ
# schedule = schedule.fillna({'KO時刻': '●未定●', '入場者':0})
schedule.to_csv('./csv/Game_Schedule_' + str(yyyy) + '.csv', index=False, sep=',')
指定フォルダにcsv形式で保存します。
まとめ
- シンプルな
<table>
はpandas
のread_html
で簡便に取得できる。
データの活用
- 応援するチームのみ抽出して、遠征するスケジュールに利用する。
- 試合後は、スコアや入場者数の実績が登録されるので分析に利用できる。