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

DART 기업 코드 크롤링

hskim 2020. 12. 27. 09:07

DART에서 제공하는 API를 이용하여 재무제표를 요청하기 위해선 아래와 같은 정보가 필요하다.

 

익숙한 6자리 stock code가 아니라 corp code가 필요한 것을 알 수 있다. DART가 비상장기업의 공시자료도 관리하기 때문에 corp code를 기반으로 운영되는 것 같다.

 

결론은 재무제표를 크롤링하려면 먼저 원하는 기업의 corp code가 필요하다.

DART에서는 기업코도 API로 제공한다. API로 기업 코드 정보를 받아 검색하기 편한 리스트 또는 딕셔너리 형태로 변환이 필요하다.

 

opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019018

 

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

공시정보 개발가이드 공시정보 고유번호 고유번호 개발가이드 기본 정보 기본 정보 메서드 요청URL 인코딩 출력포멧 GET https://opendart.fss.or.kr/api/corpCode.xml UTF-8 Zip FILE (binary) 요청 인자 요청 인자

opendart.fss.or.kr

아래와 같은 코드로 DART에서 기업 코드 정보를 받아 xml 파일로 저장할 수 있다. DART에서 기업 코드 정보를 zip 파일 형식으로 제공하기 때문에, zipfile 모듈을 이용한다. 파이썬 3.7 버전을 사용 중이기 때문에 zipfile37 모듈을 설치하여 사용하였다.

from urllib.request import urlopen
from zipfile37 import ZipFile
from io import BytesIO

auth_key = '######################'

url_company_code = 'https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=' + auth_key

data = urlopen(url_company_code)
corp_code_data = ZipFile(BytesIO(data.read()))
corp_code_data.extractall('corp_num')

 

저장한 xml 코드를 프로그램에서 사용하기 위해선 저장한 xml 파일을 읽어와 리스트나 딕셔너리 형태로 가공해야한다.

아래와 같은 코드를 통해 xml 파일을 불러들여 딕셔너리 형태로 저장하였다. 상장사의 정보만 활용할 생각이기 때문에,  주식 코드를 key 값으로 사용하고, 종목 이름과 종목 코드를 리스트 형태 값으로 출력하도록 하였다.

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]]

 

결과

{' ': ['에이치디가양제삼차', '01504707'], '036720': ['한빛네트', '00260985'], '040130': ['엔플렉스', '00264529'], '055000': ['동서정보기술', '00358545'], '032600': ['애드모바일', '00231567'], '037600': ['씨모스', '00247939'], '056140': ['리더컴', '00359614'], '012400': ['허메스홀딩스', '00153551'], '045880': ['유티엑스', '00344746'], '037830': ['글로포스트', '00261188'], '030390': ['쏠라엔텍', '00268020'], '041320': ['보홍', '00269287'], '078420': ['동북아1호선박투자회사', '00475286'], '046350': ['에듀아크', '00250775'], '013650': ['데코', '00114321'], '015390': ['엘앤씨피', '00191108'], '019640': ['희훈디앤지', '00167378'], '058690': ['퓨쳐인포넷', '00225210'], '035400': ['쓰리디넷', '00223346'], '024100': ['제일저축은행', '00174129'], '026540': ['제일창업투자', '00114826'], '016510': ['현대DSF', '00173333'], '950030': ['네프로아이티', '00687599'], '036790': ['자강', '00256292'], '038830': ['케이엠에스', '00271431'], '020070': ['에버리소스', '00154727'], '037110': ['제이에스', '00246189'], '007490': ['태창기업', '00154204'], '017300': ['에이치비이에너지', '00152631'], '001950': ['남한제지', '00107923'], '056850': ['코어비트', '00358095'], '082110': ['동북아8호선박투자회사', '00510215'], '045760': ['한국통신데이타', '00347619'], '062730': ['케너텍', '00372013'], '055250': ['다휘', '00353735'], '022520': ['코오롱아이넷', '00186540'], '004620': ['캠브리지코오롱', '00128759'], '089240': ['네오세미테크', '00535588'], '045260': ['디에이치패션', '00264981'], '032380': ['핸디소프트', '00231521'], '009690': ['케이엠에이치', '00159908'], '035710': ['씨엘엘씨디', '00259493'], '114410': ['현대푸드시스템', '00359641'], '002540': ['고제', '00103325'], '012420': ['메리츠종합금융', '00161639'], '034660': ['제넥셀세인', '00211271'], '065340': ['쓰리디월드', '00388272'], '043680': ['스톰이앤에프', '00264796'], '035010': ['소예', '00134909'], '048640': ['엠엔에프씨', '00236368'], '103150': ['하이트맥주', '00684547'], '066690': ['보광티에스', '00251385'], '040740': ['아인스엠앤엠', '00262682'], '038420': ['씨엔씨엔터프라이즈', '00234555'], '084810': ['아이알디', '00507257'], '067850': ['바이나믹', '00417963'], '086720': ['코크렙제7호위탁관리부동산투자회사', '00543523'], '054170': ['엔빅스', '00300566'], '054010': ['선팩테크', '00299376'], '001190': ['마이크로닉스', '00112068'], '033720': ['블루스톤디앤아이', '00257194'], '078700': ['신지소프트', '00477372'], '076850': ['맥쿼리센트럴오피스기업구조조정부동산투자회사', '00465410'], '048510': ['테스텍', '00331760'], '030030': ['중앙디자인', '00200761'], '042870': ['에코페트로시스템', '00268297'], '021060': ['한림창업투자', '00161301'], '036270': ['헤쎄나', '00237260'], '037510': ['미래에셋굿라이프혼합형자녀를위한투자회사10-1', '00297970'], '032030': ['일공공일안경콘택트', '00107358'], '004660': ['신동방CP', '00115427'], '043630': ['지앤알', '00267474'], '013240': ['셀런', '00134051'], '093820': ['한국베트남15-1유전해외자원개발투자회사', '00596066'], '052310': ['에이치원바이오', '00347363'], '008400': ['씨앤중공업', '00150226'], '001370': ['FnC코오롱', '00152914'], '017010': ['제너비오믹스', '00158839'], '011050': ['케드콤', '00159281'], '065410': ['지엔텍홀딩스', '00210537'], '044640': ['동부씨엔아이', '00240370'], '051820': ['아이피에스', '00247887'], '046240': ['에스브이에이치', '00268358'], '060750': ['제이콤', '00316488'], '043790': ['옥션', '00264130'], '088020': ['네이쳐글로벌', '00540304'], '094950': ['GB블루오션베트남주식혼합형투자회사1호', '00617299'], '052210': ['엠씨티티코어', '00262275'], '032930': ['에이스앤파트너스', '00200798'], '061050': ['지앤디윈텍', '00335924'], '014010': ['인터피온반도체', '00111591'], '007800': ['솔로몬저축은행', '00189343'], '046320': ['엠트론스토리지테크놀로지', '00252588'], '031800': ['에스티앤아이', '00267997'], '064060': ['사이노젠', '00367376'], '060670': ['유퍼트', '00299686'], '074140': ['엑스로드', '00463050'], '068770': ['선우중공업', '00238913'], '003020': ['남양', '00107446'], '015940': ['엘지데이콤', '00114303'], '045820': ['LG파워콤', '00318617'], '031960': ['동산진흥', '00267775'], '067950': ['티이씨', '00394574'], '008320': ['한국기술산업', '00110176'], '054020': ['지케이파워', '00349787'],