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