EDINETから財務情報を取得するメモ

EDINETってなに

www.fsa.go.jp

EDINETはAPIを公開しているので画面をポチポチしなくても情報を取ってくることができる

流れ

  • 提出された書類を把握するためのAPI(書類一覧API)から提出された書類情報を取得
  • 提供された書類を取得するためのAPI(書類取得API)から提出された書類を取得

この辺は、EDINETの操作ガイドにある仕様書に記載があるので詳細は譲る

書類一覧API

  • 単一日付を指定してその日に提出された書類一覧を取得する
  • 基本的には提出書類一覧及びメタデータを取得するので type=2になるはず

用途にもよるがある程度の企業情報を必要とする場合は日付分APIを呼び出す必要がある あまり負荷がかからないように気をつけよう こちらを参考にしつつ、必要な期間の日付を生成 【Python】指定した期間の連続した日付をだす - Qiita

import os
import requests
import datetime
from datetime import timedelta

import json
import time

def daterange(_start, _end):
    for n in range((_end - _start).days):
        yield _start + timedelta(n)

base_url = 'https://disclosure.edinet-fsa.go.jp/api/v1/documents.json' # v1は変わる可能性があるらしい
base_filename = 'documents_'

def download(self, date, type=2):
    param_date = str(date)
    params = {
        "date": param_date,
        "type": type
    }
    filename = self.base_filename + param_date + ".json"
    path = "./documents/" + filename # パスは適当
    
    if not os.path.exists(path): # 再取得を避ける
        url = self.base_url
        response = requests.get(url, params=params)
        json = response.content
        with open(path, 'wb') as file:
            file.write(json)
        time.sleep(2) # 適当な時間待たせる
    return path

for target_date in daterange(start_date, end_date):
    print(target_date)
    path = download(target_date)

取得したJSONに法人番号も含まれているので紐付けておくと吉 書類管理番号(docID)があるので必要な書類のIDを控えておく

書類取得API

  • 種類一覧APIで取得した書類管理番号(docID)を使って書類を取得する
  • 基本的にはXBRLという形式のはずなので定義書を確認するなり、CSVへの変換ツールが提供されているのでそちらを使うなりする

あくまで一例(個人的には、書類管理番号(docID)の配列を作って↓を回すのが効率的な気がする)

import os
import requests

import time
import glob
import zipfile
import shutil

doc_id = xxxxx # 書類一覧APIから取得した書類管理番号(docID)
url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/" + doc_id # v1は変わる可能性があるらしい
params = {"type": 1}
filename = "./edinet/" + doc_id + ".zip" # パスは適当
if not os.path.exists(filename):  # 再取得を避ける
    res = requests.get(url, params=params ,stream=True)

    if res.status_code == 200:
        with open(filename, 'wb') as file:
            for chunk in res.iter_content(chunk_size=1024):
                file.write(chunk)
    time.sleep(3) # 適当な時間待たせる

# ダウンロードするのがzipファイルなので解凍までしておく
zip_filepath = "./edinet/" + doc_id
zip_file = zipfile.ZipFile(filename)
zip_file.extractall(zip_filepath)

# 必要なものがわかっている場合はそれだけ残してあとは消す
files = glob.glob(zip_filepath + "/XBRL/PublicDoc/*.xbrl")
for file in files:
    shutil.move(file, "./edinet/xbrl/" + doc_id + ".xbrl")
    print(file)
    dir = "/".join(file.split("/")[:3])
    if os.path.exists(dir):
        shutil.rmtree(dir)

あとは、XRBLの仕様書とにらめっこしながら必要な情報を抽出する 目検のときはPDF版と照らし合わせると確認しやすい

XRBLのパースの一例

import xmltodict
with open(file) as f:
    doc = xmltodict.parse(f.read())
    company_name = doc["xbrli:xbrl"]["jpcrp_cor:CompanyNameCoverPage"]["#text"]