放置していたNRK(確定拠出年金)の資産をpython BeautifulSoupで抽出する

概要

 NRKから商品ごとの資産額を抽出する。
 課題として、NRKのサイトでは過去1年の月ごとの推移しか参照できなかった。
 自分は既にMoneyForwardMEでNRKと連携していたので、MoneyForwardME上で「連携した月以降」の生データとグラフを参照できていたものの、過去のデータは参照できなかった。(MoneyForwardMEは生データもグラフも行けるので、課金するのが超おすすめ。)
 なお、過去1年より前のデータは三井住友信託銀行の「ライフガイド」で参照するしかないようだ。このサイトもグラフは充実しており、グラフ上にマウスオーバーすることで年月日と金額を表示しているが、生データを参照することはできなかった。

やりたいこと

 過去1年分のNRK→資産評価額照会で月ごとの過去データをファイルに手動で出力しておいて、Pythonでファイルからデータだけ吸い出して標準出力する。テキストはExcelに貼り手動でチャートにする。

できないこと

  NRKにログインして自動的にスクレイピングすること。セキュリティの観点もあるし、将来にわたってMoneyForwardMEでデータを参照するので、過去1年だけで良い。
 MoneyForwardMEを使っていない人には、毎月手動で保存する必要があるので、面倒くさい人やPythonを入れない人には向いていない。

準備

Python

python3とBsoup

pip install BeautifulSoup

解析したいファイル

Google ChromeブラウザでNRKにログインして、「資産評価額照会」の画面を保存する。

データの解析

from bs4 import BeautifulSoup
import urllib.request as req
import argparse

parser = argparse.ArgumentParser(
                    prog='NRK parser',
                    description='input saved HTML includes NRK chart',
                    epilog='Text at the bottom of help')

parser.add_argument('filename')

args = parser.parse_args()

url = "file:" + args.filename
res = req.urlopen(url)

soup = BeautifulSoup(res, "html.parser")

#データが格納していある要素をブラウザで検証、
#コピー → selectorで取得しておく。
#NRKのサイトでは金額の欄を検証すると、3つのカウンタが必要となることがわかる。
#prodInfo > div:nth-child(11) > div.infoHdWrap > dl:nth-child(1) > dd:nth-child(2)

# 商品詳細の件数を取得
product_list_len = len( soup.find_all('dl',class_='infoHdDl00') )

# データを格納する辞書
dicttl = {}
aryttl = []

# タイトルの抽出
for c1 in range(0, product_list_len):
  query = '#prodInfo > div:nth-child({:d}) > div.infoHdWrap > dl:nth-child(1) > dd:nth-child(2)'.format(c1)
  dlist = soup.select(query)
  for dl in dlist:
    if len(dl.contents) > 0:
      dicttl[c1] = (dl.contents[0])
      aryttl.append(c1)

# 表を3つのループでデータ抽出する
dict_data = {}

for c1 in aryttl:
  
  tdata = []
  
  for c2 in range(0,10):
    
    for c3 in range(0,5):
      query = '#prodInfo > div:nth-child({:d}) > div.infoDataWrap_02.idw-prov01 > div > table > tbody > tr:nth-child({:d}) > td:nth-child({:d})'.format(c1,c2,c3)
      dlist = soup.select(query)
      for dl in dlist:
        if len(dl.contents) > 0:
          #print(c1, dicttl[c1], c2,c3, dl.contents[0])
          key = '{0} {1}'.format(c2,c3)
          tdata.append(dl.contents[0])
  dict_data[c1] = tdata

for dd in dict_data:
  print(dicttl[dd], '\t'.join(dict_data[dd]))

上記のファイルを「parse_nrk.py」として保存する。

解析を実行する..コマンドプロンプトやシェルを開き、スクリプトとHTMLファイルが入っているディレクトリで実行。

python parse_nrk.py 2023-04.html

実行結果

三井住友銀行の確定拠出年金定期預金(3年) 555,433   555,433円 555,433円     0円 2023/04/30 15%
DCマイセレクションS25 309,352 14,928円 461,800円 395,082円 14,928円 461,800円 66,718円 2023/04/28 13%
DC日本債券インデックス・オープンP 783,101 12,407円 971,592円 980,114円 12,407円 971,592円 ▲8,522円 2023/04/28 27%
三井住友外国債券インデックスS 58,804 17,889円 105,194円 75,600円 17,889円 105,194円 29,594円 2023/04/28 3%
三井住友・DC外国株式インデックスファンドS 170,013 49,921円 848,721円 631,796円 49,921円 848,721円 216,925円 2023/04/28 24%
フィデリティ・日本成長株・ファンド 202,643 31,642円 641,202円 396,072円 31,642円 641,202円 245,130円 2023/04/28 18%

Excelでのデータ解析

画像が貼れないけど、ピボットテーブルなどにして商品ごとの推移や、グラフ作成にするなど。
「購入不可」となって動いていなかったり下降している商品を見つけて運用割合を見直す。

自分の場合、恥ずかしながら16年間放置していたため、ひどいことになっていたので、この機に見直しておいた。
定額・・・▲ほとんど利率なし
日本国債・・・▲下落
日本株式・・・99%のプラスだったが、2022年に「購入不可」となって積立できなくなっていた。

コードの解説

・手動で保存したファイルをargparseで指定する。
・以下のような文字列をChromeの検証でCSSセレクタとしてコピーしておき、ループさせて各表のデータを抽出する。
 一番下の表を右クリックして検証すれば、nth-childが12個あることがわかる。

#prodInfo > div:nth-child(11) > div.infoHdWrap > dl:nth-child(1) > dd:nth-child(2)

参考にしたサイト

  • ChromeでCSSセレクタの使い方が参考になった。




この記事が気に入ったらサポートをしてみませんか?