본문 바로가기

프로그래밍/DART 재무제표 크롤링

DART 재무제표 크롤링

앞서 받아온 CORPCODE.xml 파일을 이용하여 종목의 재무제표를 읽어오는 프로그램을 작성하였다.

 

opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS003&apiId=2019020

 

전자공시 OPENDART 시스템 | 개발가이드 | 상세

상장기업 재무정보 개발가이드 상장기업 재무정보 단일회사 전체 재무제표 단일회사 전체 재무제표 개발가이드 기본 정보 기본 정보 메서드 요청URL 인코딩 출력포멧 GET https://opendart.fss.or.kr/api/

opendart.fss.or.kr

DART에서 제공하는 개발 가이드를 참고하여 작성하였다. 정보를 요청하기 위해선 아래 5가지 인자를 필수로 결정하여야 한다.

 

 

명칭 타입 필수여부 값 설명
crtfc_key API 인증키 STRING(40) Y 발급받은 인증키(40자리)
corp_code 고유번호 STRING(8) Y 공시대상회사의 고유번호(8자리)
※ 개발가이드 > 공시정보 > 고유번호 API조회 가능
bsns_year 사업연도 STRING(4) Y 사업연도(4자리)
※ 2015년 이후 부터 정보제공
reprt_code 보고서 코드 STRING(5) Y 1분기보고서 : 11013
반기보고서 : 11012
3분기보고서 : 11014
사업보고서 : 11011
fs_div 개별/연결구분 STRING(3) Y CFS:연결재무제표, OFS:재무제표

아래 예시와 같이 5가지 정보를 포함한 ULR을 통해 정보를 받을 수 있다. xml 또는 json 형식으로 제공된다.

 

https://opendart.fss.or.kr/api/fnlttSinglAcntAll.xml?crtfc_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&corp_code=00126380&bsns_year=2018&reprt_code=11011&fs_div=OFS

 

 

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
import xml.etree.ElementTree as elemTree

#기업 코드 불러오기
tree = elemTree.parse("corp_num\CORPCODE.xml")
datalist = tree.findall("list")
corp_code = [x.findtext("corp_code") for x in datalist]
corp_name = [x.findtext("corp_name") for x in datalist]
stock_code = [x.findtext("stock_code") for x in datalist]

stocklist={}

for i in range(len(corp_code)):
    stocklist[stock_code[i]]=[corp_name[i], corp_code[i]]

#API 키
auth_key = '##################'

#데이터 불러오기 함수
def get_Data(stock_code, start_year):

    stock_code_find = str(stock_code)
    #종목 코드를 이용하여 기업 코드 찾기
    corp_code_find = stocklist[stock_code_find][1]

    #보고서를 읽어오고자 하는 해당 년도
    start_year=str(start_year)

    report_list = ["11013",'11012','11014','11011']
    # 1분기 보고서 : 11013
    # 반기 보고서 : 11012
    # 3분기 보고서 : 11014
    # 사업 보고서 : 11011

    # 분기 별로 1분기, 반기, 3분기, 사업 보고서를 차례로 불러옴
    for report_temp in report_list:
        report_code = report_temp

        #공시 시기 리스트 작성
        report_type = {'11013':'03','11012':'06','11014':'09','11011':'12'}
        report_date = start_year+"_"+report_type[report_code]

        #xml 형식으로 데이터 요청
        url = 'https://opendart.fss.or.kr/api/fnlttSinglAcnt.xml?crtfc_key=' + auth_key + '&corp_code=' + corp_code_find + '&bsns_year=' + start_year + '&reprt_code=' + report_code

        data = urlopen(url)
        data_xml = BeautifulSoup(data.read(),'html.parser')

        #재무제표 정보가 포함된 list 항목만 추출
        data_list = data_xml.find_all("list")

        value =[]
        index =[]
        data_dic={}

        #thstrm_amount : 당기의 재무 정보
        #fs_nm : 연결 재무제표 여부
        #account_nm : 재무제표 항목
        #연결 재무 여부와 항목을 합쳐서 index로 사용
        for i in data_list:
            value.append(i.thstrm_amount.string)
            index_temp = i.fs_nm.string + "_" + i.account_nm.string
            index.append(index_temp)
            data_dic[index_temp]=i.thstrm_amount.string
        print(data_dic)


        #전체 data 중 관심있는 항목만 추출
        output_data={}
        for i in df1.index:
            output_data[i]=data_dic[i]
        print(output_data)

        #데이터 프레임에 열 추가
        df1[report_date]=output_data.values()


#데이터 프레임 index, 얻고자 하는 항목
data_index = {'연결재무제표_유동자산','연결재무제표_자산총계','연결재무제표_자본총계','연결재무제표_부채총계','연결재무제표_매출액','연결재무제표_영업이익','연결재무제표_당기순이익'}
#초기값
init_value = [0,0,0,0,0,0,0]
df1=pd.DataFrame(data=init_value,index=data_index)

#정보 추출
get_Data(204320,2017)
get_Data(204320,2018)
get_Data(204320,2019)

#초기값 삭제
del df1[0]

결과값으로 2017년부터 2019년까지 분기별 보고서의 재무 정보를 얻을 수 있다. 이 데이터를 xlwings를 이용하여 엑셀에서 사용할 예정이다.

 

Output

                        2017_03  ...            2019_12
연결재무제표_영업이익      60,363,355,069  ...    218,566,072,916
연결재무제표_자산총계   4,275,743,632,980  ...  4,595,620,752,355
연결재무제표_자본총계   1,448,072,055,748  ...  1,585,614,508,699
연결재무제표_부채총계   2,827,671,577,232  ...  3,010,006,243,656
연결재무제표_당기순이익     35,154,465,990  ...    118,239,649,304
연결재무제표_유동자산   1,986,079,754,997  ...  2,109,809,125,607
연결재무제표_매출액    1,430,367,258,464  ...  5,981,877,182,405