Python 投資信託

投信データのダウンロード(改定)

投資信託協会サイトから複数の投信の基準価額データを一括でダウンロードするプログラムが不安定だったので改良しました。問題点はダウンロードしたはずのデータファイルが作成されていない時があることです。。。原因はSelenium、通信環境、PCスペック。time.sleep関数を適切な位置に挿入し、プログラム進行処理に適切な時間をかけることで問題が解決しました。

Python

投信データのダウンロード

2021/11/19

目的 Pythonを使って投資信託協会サイトから複数の投資信託のデータをダウンロードします。ダウンロードしたい投資信託のISINをまとめたcsvファイルに予め用意しておけば、簡単にダウンロードできます ...

予備作業

一つではなく、複数ファンドの基準価額データを一括で取得するには、取得したいファンドのISINが記録されてあるCSVファイルがあると楽なので、これを事前に用意します。今回はベトナム株に投資しているファンドを調べます。

"listvietnam.csv"にISINとファンド名を記録しました。ファンド名は任意です(記載しなくても良い)。

プログラム

全体の流れは前回同様で以下の通りです。改善点は、投信協会サイトのコンテンツがブラウザーに表示されるまでの時間を十分にとった後でダウンロードが開始するようにしたことです

  • Chromeの起動
  • ISINファイルの読み込み
  • 投信協会サイトへ移動
  • ダウンロード作業(ダウンロードとダウンロードファイル名の変更)
  • ダウンロード作業のループ

1と2は以下の通りです。

#1.Chromeの起動
browser = webdriver.Chrome() 
path = "https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000?isinCd="

#2.ISINファイルの読み込み
fd = open('./Fundlist/listvietnam.csv') #list***.csv
code = csv.reader(fd)

改良した点はtime.sleepをコンテンツがブラウザーに完全に表示されるまでダウンロードしている間の2箇所に明示的に入れたことです。time.sleepが必要なことは知っていましたが、コンテンツがブラウザーに完全に表示されるまで十分な時間が必要なことに意識が足りませんでした(これまではブラウザー表示を1秒に設定していましたが、私のインフラでは時間が短すぎたようです)。

試行錯誤を重ねた結果、私の場合停止させる時間は表示に4秒、ダウンロードに5秒で落ち着きました。かなり長いですね。ストレスを感じていますが私の旧石器時代のインフラでは仕方がないようです・・・「十分な」時間の長さは通信環境とPCのスペックに依存しますが、どんな環境でも一定の時間がかかることは避けられないようなので、ダウンロードに躓いたら先ずはここを疑ってみると良いでしょう。

さて、サイトが完全に表示された後にダウンロードボタンを押せば、ダウンロードが始まります。この部分をプログラムではxpathで書いています。

#3.データ取得作業のループ
for row in code:
    #1.ISINをブラウザーに渡す
    url = path + row[0]
    browser.get(url)
    time.sleep(4) #【重要】コンテンツがブラウザーに表示されるまでの時間稼ぎ(従前は1秒でした・・・)
    
    #2.クリックしてダウンロード
    browser.find_element_by_xpath('/html/body/div[5]/div/div[1]/div/div[2]/div/div[3]/a').click()
    time.sleep(5) #【重要】ダウンロードしている間の時間稼ぎ
    
    #3ダウンロードしたファイル名をISINに変更
    csvindlf = glob.glob('./Downloads/*.csv') 
    latest = max(csvindlf, key=os.path.getctime)
    print(latest) #確認(CSVファイルの最新ファイルはダウンロードファイルであるはず)
    savepath = "./投信/UP/" #ISINを含む名前に変更したダウンロードファイルの保存先
    f = savepath + row[0]+".csv"
    os.rename(latest, f)
    time.sleep(1) #【念のため】
    print(f) #確認!
    
browser.quit()
    

ダウンロードファイル名の変更

ダウンロードファイルには名前にISINが含まれていないので、ファイル名からファンドを一意に識別できません。このままでは扱えないためISINを含むファイル名に変更する処理が必要です。

処理は、

1ダウンロードフォルダ内に存在するCSVファイル群の中から

2最新のファイルを探し

3名前にISINをあてる

という考えで進めました。コンテンツ表示が不十分なまま始まったダウンロードファイル、ダウンロードが完全に終えていないファイルでは、正しいファイル処理が行われませんのでご注意ください。

一応の完成形

十分な時間を設定したことによって、ダウンロードの不具合は今の所解消され、安定稼働しています。一応の完成形としています。今後も不具合が怒らないことを祈ります。またデータを落としたいファンドが後から増えても対応できるので汎用性が大きくなっています。

-Python, 投資信託
-, , , , , , , , ,