4,259 views
この記事は最終更新から 2685日 が経過しています。
NPB様のサイトには、現役全選手の年別成績が掲載されている。
趣味でいろいろと統計計算をしてみたいのだが、選手個々のデータをコピペでExcelに貼り付ける作業には限界がある。
そこで、またスクレイピングで取得することにする。
以前 (81) 野球選手の成績を主成分分析 (続編1/2) ではYahooスポーツ様のサイトの掲載情報を計算に使わせていただいた。今回はNPB様のデータを取得してみたい。
試作したプログラムでは、現在三冠王の柳田選手のページを対象にデータ取得してみる。

実行結果はこんな感じになった。
CSVファイルなので、この後はいろいろなツールで読み込んで計算に使える。
2011,福岡ソフトバンク,6,5,5,1,0,0,0,0,0,0,0, 0,0, 0,0,0,3, 0,.000,.000,.000 2012,福岡ソフトバンク,68,212,195,17,48,10,1,5,75,18,6, 1,2, 0,10,5,56, 2,.246,.385,.300 2013,福岡ソフトバンク,104,337,298,48,88,19,2,11,144,41,10, 1,0, 0,32,7,96, 3,.295,.483,.377 2014,福岡ソフトバンク,144,615,524,91,166,18,4,15,237,70,33, 6,0, 3,72,16,131, 8,.317,.452,.413 2015,福岡ソフトバンク,138,605,502,110,182,31,1,34,317,99,32, 8,0, 1,88,14,101, 9,.363,.631,.469 2016,福岡ソフトバンク,120,536,428,82,131,31,4,18,224,73,23, 2,0, 0,100,8,97, 8,.306,.523,.446 2017,福岡ソフトバンク,93,400,317,73,105,23,0,25,203,80,14, 7,0, 7,70,6,86, 5,.331,.640,.453
■仕様
・選手紹介ページのURLを与える。
・対象ページから年別成績を抽出してCSVファイルに保存する。
■プログラム
コマンドライン入力
$ python3
>>> import lib_npb
>>> cPlayer = lib_npb.get_player_data("http://npb.jp/bis/players/31835133.html")
>>> cPlayer.output_record_to_csv_file("data.txt")
lib_npb.py
import urllib.request
from bs4 import BeautifulSoup
import csv
#////////////////////////////////////////////////////////////////
class NpbPlayer:
def __init__(self, name):
self.name = name
self.ary_record = []
def append_record(self, ary):
self.ary_record.append(ary)
def output_record_to_csv_file(self, fname):
with open(fname, "w") as fh:
writer = csv.writer(fh, lineterminator="\n")
writer.writerows(self.ary_record)
#////////////////////////////////////////////////////////////////
def get_player_data_detail( resp ):
bs = BeautifulSoup(resp.read(), "html.parser")
# find name
td = bs.find("td",{"class":"registerPlayer"})
h1 = td.find("h1")
cPlayer = NpbPlayer(h1.get_text())
# find record
div = bs.find("div",{"id":"registermaintbl"})
for tr in div.findAll("tr",{"class":"registerStats"}):
ary_1_record = []
for td in tr.findAll("td"):
ary_1_record.append(td.get_text())
cPlayer.append_record(ary_1_record)
return cPlayer
#////////////////////////////////////////////////////////////////
def get_player_data( url ):
try:
resp = urllib.request.urlopen(url)
except urllib.error.HTTPError as e:
print("HTTP-Error : ", e.code)
return None
except urllib.error.URLError as e:
print("URL-Error : ", e.reason)
return None
else:
cPlayer = get_player_data_detail(resp)
return cPlayer
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-01-24: 0回 2026-01-23: 0回 2026-01-22: 0回 2026-01-21: 1回 2026-01-20: 0回 2026-01-19: 0回 2026-01-18: 3回