EDINETから財務情報を取得するメモ
EDINETってなに
EDINETは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
あくまで一例(個人的には、書類管理番号(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"]