EDINET API で XBRL ファイルを取得する方法を書きました。
⇒ 【EDINET API】Python で XBRL を取得する方法【決算分析】
(以下は古い情報です)
金融庁のエディネット(EDINET)からXBRLを取得する方法です。「EDINET トップページ」→「書類検索」→「書類簡易検索画面」で検索ボタンを押した結果を取得します。
ところで、EDINETには「ダウンロード」というそれっぽい画面があるのですが、こちらは使いません。検索結果の表について、提出日の時刻情報が削られている点、EDINETコードが無い点、PDFが無い点、これらが問題です。XBRLだけ取得しても管理できないので、ちょっと利用しづらいのです。
一応、XBRLを読み込めばEDINETコードは載っていますが、やはり対応するPDFが無いと答え合わせができません。そういった理由から、「書類検索」を使って取得します。
取得方法【EDINET】
EDINETの書類検索URLを調べる
EDINETは、検索条件の設定をもとにjavascriptでURLを生成して、GETメソッドで検索結果のページを要求しているようです。なので、「書類種別や提出期間などを設定して検索した時のURL」をもとに、EDINETコードだけを変更すれば検索結果が得られそうです。
検索結果のページを取得する
パイソンでそのようなURL生成関数を書いて、ユー・アール・エル・リブ(urllib)で生成したURLを開きます。URLに問題がなければ、検索結果のhtmlが返るはずです。エラーページを取得した場合は、内容に応じて長い待機を挟むか、終了するようにします。
エラーページは、URLが間違っていたり、EDINETがメンテナンス中だったりした時に返ってきました。
開示情報リスト・PDF・XBRLを取得する
検索結果のページをビューティフル・スープ(BeautifulSoup)やエル・エックス・エム・エル イー・ツリー(lxml.etree)で読み込んで、開示情報リスト、PDF、XBRLを取得します。
ただし、PDFとXBRL(zipファイル)のリンクは、javascriptで生成するようになっています。aタグのonclick属性にそのjavascriptの引数が並んでいますので、ブラウザでクリックした時と同じようにそれらを並べてあげれば取得できます。もちろん、javascriptの実行環境は不要です。
検索結果が100件以上の場合はページが複数に分かれます。検索URLにページ番号を表すパラメータがありますので、ページが分かれている分だけ辿るようにします。
あと、ファイル名に関してです。通常はレスポンスヘッダ(response headers)の中のコンテント・ディスポジション(Content-Disposition)からファイル名を取得しますが、EDINETの場合はそれだとPDFとXBRLで全く異なる名前になってしまいます。
このままでは対応するPDFを探すときに混乱します。後々のXBRLプログラムのデバッグが大変になりますので、対応するPDFと同じ書類管理番号(「S」から始まる番号)に合わせたほうが良いと思います。
最新の開示情報の取得方法
今のところ1社ごとの検索結果はほぼ100件以内なので、ページ送りは不要です。ページ送りが必要になるのは、最新情報を追加していく場合ですね。以下の条件で検索すると、過去3日分の開示情報が300件ほど表示されますので、3ページほど辿ることになります。
- 提出者/発行者/ファンド:(空欄)
- 書類種別:■有価証券報告書/半期報告書/四半期報告書
■大量保有報告書 ■その他の書類種別
(大量保有とその他は必要ならチェックします) - 決算期:(空欄)
- 提出期間:過去3日
検索結果はEDINETコードで検索した場合と同じ方法で取得できます。
書類検索の検索結果は、最大3000件までです。すべての上場企業の開示を取得するには、EDINETコードで1社ずつ取得してから、最新の開示情報を取得していくことになります。2段階です。
感想
特別なセッション管理やクッキーの送信は不要だったので、その点はプログラムが簡単になりました。一方で、検索URLのパラメータが長くて、その生成がちょっと面倒でしたね。PDFとXBRLのリンクもjavascriptで生成するようになっていて、そこもちょっと面倒でした。そこさえできれば、あとは取得できると思います。