앞서 받아온 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 형식으로 제공된다.
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
'프로그래밍 > DART 재무제표 크롤링' 카테고리의 다른 글
DART 재무제표 크롤링 - 엑셀에 데이터 정리 (0) | 2020.12.30 |
---|---|
DART 기업 코드 크롤링 (0) | 2020.12.27 |