LoginSignup
41

More than 5 years have passed since last update.

Pythonでスクレイピング - 投信協会webから投資信託の基準価格を取得する

Last updated at Posted at 2016-01-16

この記事について

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)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41