Sponsored Link

カテゴリー別アーカイブ: 未分類

(84) BeautifulSoupでスクレイピングを効率化

(84) BeautifulSoupでスクレイピングを効率化

先の「(81) 野球選手の成績を主成分分析 (続編1/2)」ではNPB様のホームページに記載されている個人打撃成績を取得させていただいた。前回は lxmlと XPathを使って個人成績データを抽出していたが、今回はこの処理を BeautifulSoup モジュールを使って行う。


(1) BeautifulSoupをインストール

$ pip3 install beautifulsoup4

(2) 2015年セリーグ打撃成績を取得してみる

① まずは情報を取得する。

>>> from urllib.request import urlopen
>>> from bs4 import BeautifulSoup
>>> html = urlopen("http://npb.jp/bis/2015/stats/bat_c.html")
>>> bs = BeautifulSoup(html.read())

② 次に、取得した情報から必要な情報だけを抽出する。

>>> ary_players = []
>>> for tr in bs.findAll("tr",{"class":"ststats"}):
>>>     ary_score = []
>>>     for td in tr.findAll("td"):
>>>         ary_score.append(td.get_text())
>>>     ary_players.append(ary_score)

or next_siblingsを使って順位列以降の必要なデータのみを抽出してもよい。

>>> ary_players = []
>>> for td in bs.findAll("tr",{"class":"ststats"}):
>>>     ary_score = []
>>>     for td in tr.td.next_siblings:
>>>         ary_score.append(td.get_text())
>>>     ary_players.append(ary_score)

③ 最後に結果を表示する。ここでCSVファイルなどに保存すればよい。

>>> for score in ary_players:
>>>     print(score)

取得した結果は以下の通り。

['1', '川端\u3000慎吾', '(ヤ)', '.336', '143', '632', '581', '87', '195', '34', '1', '8', '255', '57', '4', '3', '2', '2', '43', '0', '3', '72', '15', '.439', '.383']
['2', '山田\u3000哲人', '(ヤ)', '.329', '143', '646', '557', '119', '183', '39', '2', '38', '340', '100', '34', '4', '0', '3', '81', '1', '5', '111', '11', '.610', '.416']
['3', '筒香\u3000嘉智', '(デ)', '.317', '138', '568', '496', '79', '157', '28', '1', '24', '259', '93', '0', '0', '0', '2', '68', '0', '2', '98', '5', '.522', '.400']
['4', 'ルナ', '(中)', '.292', '134', '564', '496', '61', '145', '26', '1', '8', '197', '60', '11', '0', '0', '6', '57', '2', '5', '77', '13', '.397', '.367']
['5', 'ロペス', '(デ)', '.291', '140', '565', '516', '63', '150', '29', '1', '25', '256', '73', '1', '1', '0', '3', '44', '3', '2', '82', '14', '.496', '.347']
['6', '平田\u3000良介', '(中)', '.283', '130', '559', '491', '76', '139', '27', '3', '13', '211', '53', '11', '7', '1', '0', '64', '1', '3', '86', '5', '.430', '.369']
['7', '鳥谷\u3000敬', '(神)', '.281', '143', '646', '551', '69', '155', '21', '4', '6', '202', '42', '9', '6', '2', '3', '89', '2', '1', '77', '8', '.367', '.380']
['8', '福留\u3000孝介', '(神)', '.281', '140', '569', '495', '53', '139', '24', '3', '20', '229', '76', '1', '2', '1', '7', '65', '1', '1', '75', '15', '.463', '.361']
['9', 'マートン', '(神)', '.276', '140', '583', '544', '46', '150', '27', '0', '9', '204', '59', '0', '1', '0', '5', '31', '0', '3', '77', '21', '.375', '.316']
['10', '梶谷\u3000隆幸', '(デ)', '.275', '134', '578', '520', '70', '143', '35', '2', '13', '221', '66', '28', '13', '2', '2', '54', '0', '0', '132', '4', '.425', '.342']
['11', '新井\u3000貴浩', '(広)', '.275', '125', '480', '426', '52', '117', '22', '2', '7', '164', '57', '3', '0', '0', '4', '48', '1', '2', '73', '15', '.385', '.348']
['12', '田中\u3000広輔', '(広)', '.274', '141', '590', '543', '61', '149', '33', '9', '8', '224', '45', '6', '7', '5', '1', '34', '2', '7', '105', '8', '.413', '.325']
['13', 'ゴメス', '(神)', '.271', '143', '601', '520', '49', '141', '28', '0', '17', '220', '72', '0', '1', '0', '3', '72', '1', '6', '134', '15', '.423', '.364']
['14', 'エルナンデス', '(中)', '.271', '138', '548', '498', '54', '135', '27', '2', '11', '199', '58', '5', '3', '10', '4', '35', '1', '0', '106', '13', '.400', '.317']
['15', '雄平', '(ヤ)', '.270', '141', '585', '551', '57', '149', '33', '4', '8', '214', '60', '7', '4', '1', '3', '27', '1', '3', '82', '7', '.388', '.307']
['16', '坂本\u3000勇人', '(巨)', '.269', '130', '558', '479', '50', '129', '21', '3', '12', '192', '68', '10', '4', '9', '5', '65', '1', '0', '79', '5', '.401', '.353']
['17', '畠山\u3000和洋', '(ヤ)', '.268', '137', '584', '512', '64', '137', '26', '0', '26', '241', '105', '0', '0', '0', '8', '62', '0', '2', '92', '10', '.471', '.344']
['18', '大島\u3000洋平', '(中)', '.260', '142', '620', '565', '70', '147', '20', '4', '6', '193', '27', '22', '8', '10', '1', '39', '1', '5', '65', '5', '.342', '.313']
['19', 'バルディリス', '(デ)', '.258', '139', '525', '465', '38', '120', '23', '0', '13', '182', '56', '0', '0', '0', '5', '43', '2', '12', '62', '12', '.391', '.333']
['20', '菊池\u3000涼介', '(広)', '.254', '143', '644', '562', '62', '143', '20', '3', '8', '193', '32', '19', '9', '49', '2', '29', '2', '2', '92', '7', '.343', '.292']
['21', '上本\u3000博紀', '(神)', '.253', '108', '452', '375', '44', '95', '18', '1', '4', '127', '31', '19', '11', '29', '0', '44', '1', '4', '69', '1', '.339', '.338']
['22', '長野\u3000久義', '(巨)', '.251', '130', '479', '434', '49', '109', '20', '3', '15', '180', '52', '3', '2', '5', '2', '34', '0', '4', '81', '12', '.415', '.310']
['23', '丸\u3000佳浩', '(広)', '.249', '143', '633', '530', '81', '132', '28', '1', '19', '219', '63', '15', '7', '4', '4', '94', '2', '1', '143', '4', '.413', '.361']
['24', '中村\u3000悠平', '(ヤ)', '.231', '136', '502', '442', '36', '102', '14', '0', '2', '122', '33', '3', '2', '14', '2', '40', '1', '4', '80', '9', '.276', '.299']