💡

【Python】EDNIETのAPIを使って有価証券報告書をPDF形式で取得する

2022/07/17に公開
5

はじめに

EDINETは、金融庁が公開している有価証券報告書などの電子開示閲覧サイトです。
有価証券報告書をPDF形式でダウンロードしたり、XBRL形式でデータとして直接取得することも可能です。
ここではEDINETのAPIとPythonを使って、有価証券報告書をPDF形式で取得する方法をご紹介していきます。

0. 書類管理番号(docid)の取得

EDINETで有価証券報告書を取得するためには、その書類管理番号(docid)を特定する必要があります。
書類管理番号は、企業や提出日、提出書類の内容によって一意に定まっているものです。
この書類管理番号を取得する方法は以下のリンクに記載しています。
https://zenn.dev/robes/articles/bb7ea6202af81c

1. 必要なライブラリのインポート

必要なライブラリをインポートします。
requestsを使用します。

import requests

2. パラメータの設定

書類管理番号(docID)、APIのエンドポイント、APIのリクエストパラメータを設定します。

# 書類管理番号
docid = "S100FIZV"

# 書類取得APIのエンドポイント
url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/" + docid

# 書類取得APIのリクエストパラメータ
params = {
  "type" : 2
}

3. PDFファイルの取得

EDINETのAPIを使って、ファイル名「docID.pdf」で取得します。

# APIの呼び出し
res = requests.get(url, params=params, verify=False)

# 出力ファイル名
filename = docid + ".pdf"

# ファイルへ出力
if res.status_code == 200:
  with open(filename, 'wb') as f:
    for chunk in res.iter_content(chunk_size=1024):
      f.write(chunk)

4. 複数のPDFファイルの取得

上記は1社の有価証券報告書だけを取得するコードになっていますが、リストで複数のdocIDを指定すれば、複数のPDFファイルを一度に取得できます。


#リストの中に、取得したい有価証券報告書の書類管理番号=docidを入力します
docID_list = ['S100O02E','S100O26N']

for docid in docID_list:
        
    url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/" + docid
    
    params = {
        "type" : 2}
    
    filename = docid + ".pdf"
    
    res = requests.get(url, params=params, verify=False)
    
    if res.status_code == 200:
        with open(filename, 'wb') as f:
            for chunk in res.iter_content(chunk_size=1024):
                f.write(chunk)
    

5. さいごに

書類管理番号(docid)を取得するのが少し面倒ですが、ここさえ乗り越えれば、簡単に有価証券報告書を取得できます。

Discussion

azumaazuma

コメント失礼します。最近プログラミングを触り始めた初心者です。

取得した有価証券報告書のデータはどこで見られるのでしょうか。また、「3. PDFファイルの取得」で作成した出力ファイルはどこに保存されているのでしょうか。

他の記事も読ませて頂きましたが、何分無知ですので質問させて頂きました。

osn_Lofiosn_Lofi

コメントありがとうございます。

ファイルの保存場所ですが、Googleコラボをお使いですと、Googleコラボのディレクトリに保存されます。
画面左にあるパネルのフォルダーマークを押していただくと、ご覧いただけると思います。

慣れないうちは分かりにくいですね。
分からなかったら、また聞いてください。

azumaazuma

返信ありがとうございます。

無事にファイルの場所を見つけることができました!

ただ、「[python]XBRL形式の有価証券報告書のテキストデータを取得する」の記事の「3.XBRLファイルの読み込み」を参考にデータを取得しようと思っても、なかなかうまくできません。ファイルのパスが間違っているのか、タクソノミのkeyやcontext_refが違うのか分かりません。以下がコードとエラーです。

parser = EdinetXbrlParser()

xbrl_path = '/content/' + docid + '/XBRL/PublicDoc/*.xbrl'
xbrl_path = glob.glob(xbrl_path)[0]

edinet_xbrl_object = parser.parse_file(xbrl_path)

#①事業等のリスクをとってみる
key='jpcrp_cor:BusinessRisksTextBlock'
context_ref='FillingDateInstant'
data = edinet_xbrl_object.get_data_by_context_ref(key, context_ref)
text_data = data.get_value()

#②経営方針、経営環境および対処すべき課題等をとってみる
key='jpcrp_cor:BusinessPolicyBusinessEnvironmentIssuesToAddressEtcTextBlock'
context_ref='FillingDateInstant'
data = edinet_xbrl_object.get_data_by_context_ref(key, context_ref)
text_data = data.get_value()

AttributeError: 'NoneType' object has no attribute 'get_value'

osn_Lofiosn_Lofi

コメントありがとうございます。
お疲れ様です。

念のため、私の方でもコードを実行しましたが、エラーはでませんでした。
したがって、タクソノミのkeyやcontext_refに誤りはありません。

そのうえでですが、ご指摘のエラーは、そもそも、XBRLファイルの中身を取得できていない可能性があります。

その原因として、docidが間違っている可能性がありますので、まずは、docidの中身を確認してみてください。Googleコラボのディレクトリにある、ご自身が取得したい有価証券報告書のフォルダ名と一致しているかどうか。。。

とにかく、以下のdocidコードが鍵だと思います。
xbrl_path = '/content/' + docid + '/XBRL/PublicDoc/*.xbrl'

azumaazuma

返信ありがとうございます。

案の定、docidが異なっていて改めて正しいものを指定した結果、正常に実行できたようです。
おかげさまで大変助かりました。ありがとうございます。