EDINET APIを使ったデータ取得プログラムを書いてみた
中島聡さんの「結局、人生はアウトプットで決まる」という本を読んで感銘を受けたので、早速ブログを始めてみました。
初回はEDINET APIを使ったデータ取得プログラムを書いてみたので、分かったことをまとめてみようと思います。
そもそもEDINETとは、金融庁が運営している開示システムのことで主に有価証券報告書が取得可能なサイトのことです。
書類検索というタブを選ぶと、企業が開示したPDFやXBRLファイルを取得できます。
※XBRLというのは金融系のデータを開示するときのデータ形式のことです。イメージはHTMLに似ていて、<年齢>12</>のような形(本来は英語でタグ名が書いてあります)で開示されています。
GUIで画面からポチポチ取得もできるのですが大量にデータを重複なくダウンロードするのが大変だなと思っていたところ、金融庁がAPIを公開していることがわかったので早速プログラムを書いてみました。
※APIとはシステムの機能を外部から呼び出すためのインターフェースのことで、今回でいうと指定のURLにアクセスするとほしいPDFファイルがダウンロードできたりします。
指定のURLにリクエストを投げると、指定日付に開示されたデータのjson情報の一覧が返ってきます。
jsonデータから取得したい開示文書IDを抽出し、再度リクエストを投げるとPDFファイルやXBRLファイルがダウンロードできる仕組みでした。
今回はREST APIの王道であるpythonのrequestsを使ってプログラムを書きました。
ポイントは下記の2つです。
①REST APIの応答データのPDFやZIPファイルの内容はバイナリデータで返答されるので、レスポンスのcontentをバイナリ形式でファイルに書き出す必要がある。
※バイナリとは、テキストの反対で人間が読んでも直接は解読できない形式のデータのことをいいます。
②書類ダウンロードAPIのレスポンスは一部欠けていることがあるため、jsonには書き出さずstatus_codeを参照してエラーハンドリングした方がよい。
※レスポンスをjsonにdumpしようとすると、JSONDecodeError:Expecting Valueとなり抜け出せなくなりました。
その他で発見したことは、訂正有価証券報告書を開示するときは確認書の開示も義務付けられていますが、EDINETのGUIでは画面に確認書も表示されるものの検索結果の件数に記載の数字には含まれないということです(最初はGUIに合わせようと子ドキュメントも取得しようとしましたが、GUIの検索結果件数とAPIの取得件数が一致せずに1時間くらい悩みました。。。)。
ベータ版としてPDFのみ取得できるようにしました。XBRLの取得や取得エラーとなったファイルの再取得、環境変数の外部ファイル分離など、まだまだ改善していこうと思います。
実際に作成したプログラムはGithubに公開してみたので、興味があれば見てみてください。
https://github.com/Shintaro-lab/EDINET-API.git