Pythonでプロ野球スコア速報を取得する
Page content
昨年書いた、Pythonでプロ野球のスコア速報を取得するスクリプト。
Pythonでスクレイピング
Pythonでは、bs4というライブラリを使って簡単にウェブスクレイピングできる。
$ pip install requests bs4
import bs4
これを使って他サイトからプロ野球速報を取得したい。
書いてみる
import requests
import json
from bs4 import BeautifulSoup
def start_array(soup):
starts = []
raw_starts = soup.select('.teams .yjSt')
for raw_info in raw_starts:
info = raw_info.text
if info != '予告先発' and info != '戦評':
starts.append(info)
return starts
def inning_array(soup):
innings = []
raw_innings = soup.select('.teams .yjMSt')
for raw_inning in raw_innings:
inning = raw_inning.text
inning = inning.replace('回', '')
inning = inning.replace('表', 't')
inning = inning.replace('裏', 'b')
inning = inning.replace('試合前', 'yet')
inning = inning.replace('結果', 'end')
inning = inning.replace('中止', 'stop')
innings.append(inning)
return innings
def team_array(soup):
teams = []
team_alp = {
'広島': 'C',
'阪神': 'T',
'DeNA': 'DB',
'巨人': 'G',
'中日': 'D',
'ヤクルト': 'YS',
'ソフトバンク': 'H',
'西武': 'L',
'楽天': 'E',
'オリックス': 'Bs',
'ロッテ': 'M',
'日本ハム': 'F',
}
raw_teams = soup.select('.teams .yjMS')
for raw_team in raw_teams:
alp = team_alp[raw_team.text]
teams.append(alp)
return teams
def score_array(soup):
scores = []
raw_scores = soup.select('.teams .score_r')
for raw_score in raw_scores:
scores.append(raw_score.text)
return scores
def live_scores():
url = 'http://baseball.yahoo.co.jp/npb/schedule/'
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, 'html.parser')
games = len(soup.select('.teams'))
starts = start_array(soup)
innings = inning_array(soup)
teams = team_array(soup)
scores = score_array(soup)
output = []
for i in range(games):
game_score = {
'Info': {
'Start': starts[i],
'Inning': innings[i]
},
'Home': {
'Team': teams[i * 2 + 1],
'Score': scores[i * 2 + 1]
},
'Away': {
'Team': teams[i * 2],
'Score': scores[i * 2]
}
}
output.append(game_score)
return json.dumps(output)
print(live_scores())
結果
以下のようなJSON
形式の配列が表示される。
[{
"Info": {"Start": "14:00", "Inning": "end"},
"Home": {"Team": "G", "Score": "5"},
"Away": {"Team": "D", "Score": "1"}
},
...
おわり
個人成績を取得してセイバーメトリクスを算出、みたいなこともやってみたい。
[参考記事]Pythonでプロ野球の個人成績一覧をJSONにして取得する