EDINETから資料とデータ(PDF、XBRL)をダウンロードするpythonコード




EDINETから資料(PDF、XBRL)データをダウンロードするpythonのコードです。
元々過去3年分しかデータダウンロードできなかったですが、2023年から過去10年分のデータがダウンロードできるようになりました。

2023/1/4(水)時点で2013/1/4のデータがダウンロードできました。

以下コードになります.

import sys
import requests
import pandas as pd
from pathlib import Path


def main():
  args = sys.argv

    for index_date, date_ymd in enumerate(args[1:]):

        # YYYYMMDD形式→YYYY-MM-DD形式に変換
        date = '{}-{}-{}'.format(date_ymd[:4], date_ymd[4:6], date_ymd[6:])

        # URL・引数定義(書類一覧取得)
        list_url = 'https://disclosure.edinet-fsa.go.jp/api/v1/documents.json'
        list_params = {
            'date': date,
            'type': '2'
        }

        # ファイル一覧をEDINETから取得
        doc_list = requests.get(list_url, list_params).json()
        df = pd.DataFrame(doc_list['results'])
        count = len(doc_list['results'])
        # print("{}処理件数:{}件".format(date, len(doc_list['results'])))

        # ファイル一覧をCSV形式で保存
        list_path = "./edinet_doc/list/"
        list_file = "doc_list_{}.csv".format(date_ymd)
        Path(list_path).mkdir(parents=True, exist_ok=True)
        df.to_csv("{}/{}".format(list_path, list_file), encoding='utf_8_sig')

        for index_doc, row in df.iterrows():
            print("{} : {}/{}".format(date, str(index_doc + 1), str(count)))
            doc_id = row['docID']

            # 銘柄コード・銘柄名(提出者名)・書類名を取得
            if row['secCode'] is None:
                code = 'zzzz'
            else:
                code = str(row['secCode'])[:4]
            if row['filerName'] is None:
                name = 'no_name'
            else:
                name = row['filerName'].replace(' ', '').replace(' ', '')
            if row['docDescription'] is None:
                description = 'no_title'
            else:
                description = row['docDescription'].replace(' ', '').replace(' ', '')

            # URL・引数定義(書類取得)
            doc_url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/{}".format(doc_id)
            pub_param = {'type': '1'}
            pdf_param = {'type': '2'}
            at_param = {'type': '3'}
            en_param = {'type': '4'}

            # 提出本文書及び監査報告書
            pub_path = "./edinet_doc/xbrl/{}/".format(date_ymd)
            pub_file = "{}_{}_{}.zip".format(code, name, description)
            get_file(pub_path, pub_file, doc_url, pub_param)

            # PDFファイル
            pdf_path = "./edinet_doc/pdf/{}/".format(date_ymd)
            pdf_file = "{}_{}_{}.pdf".format(code, name, description)
            get_file(pdf_path, pdf_file, doc_url, pdf_param)

            # 提出本文書及び監査報告書
            at_path = "./edinet_doc/attach/{}/".format(date_ymd)
            at_file = "{}_{}_{}.zip".format(code, name, description)
            get_file(at_path, at_file, doc_url, at_param)

            # 英文ファイル
            en_path = "./edinet_doc/en/{}/".format(date_ymd)
            en_file = "{}_{}_{}.zip".format(code, name, description)
            get_file(en_path, en_file, doc_url, en_param)

            # break


def get_file(path, file, url, param):
    Path(path).mkdir(parents=True, exist_ok=True)
    docs = requests.get(url, param)
    if docs.headers['Content-Type'] != "application/json;charset=utf-8":
        file = open(path + file, "wb")
        file.write(docs.content)


if __name__ == "__main__":
    main()




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください