(86) NPBプロ野球選手の年別成績を取得する。

投稿者: | 2017年8月4日

3,689 views

この記事は最終更新から 2318日 が経過しています。

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です