#この記事について
Pythonとlxmlを使って、webスクレイピングで投信協会のwebサイト(投信総合検索ライブラリー)から投資信託の基準価格を取得するスクリプトです。
前に公開したYahoo!ファイナンス版について、規約上Yahoo!ファイナンスからのwebスクレイピングが禁止されていたので代わりに作成しました。
GitHubで公開してますんで最新版はこちら
sawadyrr5/PyFundJP: 日本国内の投資信託に関する情報取得スクリプト
ファンドコードではなくISINコードでの検索となりますが、基本の構文はまったく一緒です。
getNAV
# -*- coding: utf-8 -*-
# python 2.7
# 投信協会から基準価格データをスクレイピングする
import lxml.html
import datetime
def getNAV(isin, sy, sm, sd, ey, em, ed):
# 引数をdictに突っ込む
d = dict(isin=isin, sy=sy, sm=sm, sd=sd, ey=ey, em=em, ed=ed)
# dictをアンパックしてURL生成
url = 'http://tskl.toushin.or.jp/FdsWeb/view/FDST030004.seam?isinCd={isin}\
&stdDateFromY={sy}&stdDateFromM={sm}&stdDateFromD={sd}\
&stdDateToY={ey}&stdDateToM={em}&stdDateToD={ed}&showFlg=1&adminFlag=1'.format(**d)
# ElementTreeを取得
tree = lxml.html.parse(url)
# 日付, 基準価額, 純資産の要素をすべて取得しつつ、mapを適用してutf-8化
contents = map(lambda html: html.text.encode('utf-8').replace('\n',''), tree.xpath('//*[@id="showList"]//label'))
# ひとつのリストになっているので[[date, price, cap], [date, price, cap], ...]と分ける
res = []
for i in range(0, len(contents)-1, 3):
date = datetime.datetime.strptime(contents[i], '%Y年%m月%d日').strftime('%Y%m%d')
price = int(contents[i+1].replace(',','').replace('円',''))
cap = contents[i+2].replace(',','').replace('億円','')
res.append([date, price, cap])
return res
if __name__ == '__main__':
# dictにパラメータを突っ込む(日本株アルファ・カルテット(毎月分配型))
args = dict(isin='JP90C000A931', sy='2015', sm='12', sd='01', ey='2015', em='12', ed='31')
# dictごと渡してアンパック
print getNAV(**args)