[dart api 1] 기업공시시스템 open api 사용하기#dart#기업공시시스템#open api#API#다트

2017. 8. 24. 12:44

전자공시시스템인 dart에 있는 OPEN API를 이용하여 기업 정보를 가져와 보려고 합니다. 여기에는 기업에서 공시하는 많은 자료들이 있습니다. 그 중에서도 저는 주식투자를 하시는 분들이 관심이 많으실 기업재무재표를 가져오는 것을 목표로 하고자 합니다.


OPEN API의 사전상 뜻은 다음과 같습니다. "인터넷 이용자가 일방적으로 웹 검색 결과 및 사용자인터페이스(UI) 등을 제공받는 데 그치지 않고, 직접 응용프로그램과 서비스를 개발할 수 있도록 공개된 API" (출처: 매일경제용어사전)

dart의 정보를 가지고 직접 응용프로그램과 서비스를 개발할 수 있다니, 정말 놀랍네요.



제목



관련 글 보기

데이터프레임(DataFrame) 엑셀처럼 조회하기

생산자물가지수와 주가의 관계를 알아보자
이메일로 나중에 보고 싶은 웹페이지 저장하기-이메일활용tip, 이메일정보관리



그럼 dart에서 제공하는 OPEN API를 확인하기 위해, 전자공시시스템인 dart에 접속해 보겠습니다.

아래 그림과 같이, 우측 상단의 "오픈API" 메뉴를 클릭하시면 dart에서 제공하는 OPEN API정보를 확인하실 수 있습니다.


다트_홈페이지

(다트 홈페이지)



현재 dart에서는 2가지의 API를 제공하고 있는데요. 

하나는 검색API라고 해서, 어떤 공시자료가 올라왔는지 확인하는 API입니다. 그리고 또 다른 하나는 기업개황 관련된 API인데 대표자명, 법인등록번호, 주소 등의 정보가 들어 있습니다. 아쉽게도 현재 재무제표를 직접 제공하는 API는 없습니다. 따라서 저희는 어떤 공시자료가 올라왔는지 확인할 수 있는 검색API를 이용하여 해당 재표제표 정보를 확인하고자 합니다.




그럼, 검색API를 이용해서 어떤 공시자료들이 올라왔는지 확인해 보도록 하겠습니다.


다트_오픈API2



OPEN API를 이용하려면, 해당 사이트에서 받은 인증 key가 있어야 합니다.

저는 이전에 발급받은 key가 있어서 그 key를 사용하도록 하겠습니다.


다트_오픈API_인증키

(다트 오픈API 인증키 화면)



일일 사용량이 10,000건으로 제한되어 있습니다. 그런데 개인적인 목적으로 사용하기 때문에 1만건을 넘을 일은 없을 듯 합니다. 인증key는 API를 불러올 때 사용하므로, 잘 적어두어야 합니다.


저는 파이썬을 이용해서, 작업을 할 예정입니다.

작업을 위해 설치가 필요한 프로그램은 아래 글을 참조 바랍니다.



API를 이용해서 정보를 가져오는 방법은, 정해진 형식대로 url(인터넷 주소)을 만들어 요청하는 방식입니다.  먼저 url에 보고 싶은 종목의 코드를 넣어야 되는데, 이것은 증권의 종목코드와 동일하므로 다음에서 검색해서 넣으시면 됩니다.


저는 한솔케미칼에 관심이 많아서, 한솔케미칼 종목코드를 넣었습니다.


그리고 재무재표가 들어있는 사업,반기,분기보고서가 필요하여 "bsn_tp=A001&bsn_tp=A002&bsn_tp=A003" 라고 url에 추가하였습니다.


해당 변수에 대한 상세설명은 해당 페이지의 오픈API 개발가이드를 참조 바랍니다.


# coding=utf-8
#
# 기업 open_api 이용하기
#

from urllib.request import urlopen
import pandas as pd
from bs4 import BeautifulSoup
import webbrowser

API_KEY="발급받으신 인증key를 여기에 넣으시면 됩니다"
company_code="014680"

url = "http://dart.fss.or.kr/api/search.xml?auth="+API_KEY+"&crp_cd="+company_code+"&start_dt=19990101&bsn_tp=A001&bsn_tp=A002&bsn_tp=A003"
resultXML=urlopen(url)
result=resultXML.read()



요청 양식은 xml, json 2가지 형태가 있는데, 저는 xml형식으로 요청하도록 하겠습니다. 

result를 print 해 보시면, 회신받은 정보가 xml형태로 저장되어 있는 것을 확인할 수 있습니다.


xmlsoup=BeautifulSoup(result,'html.parser')



BeautifulSoup을 이용하여, parsing하면 아래와 같이 회신받은 정보를 확인할 수 있습니다.


In[3]: print(xmlsoup) <?xml version="1.0" encoding="utf-8"?> <result> <err_code>000</err_code> <err_msg>정상</err_msg> <page_no>1</page_no> <page_set>10</page_set> <total_count>84</total_count> <total_page>9</total_page> <list>




정보가 list tag 단위로 저장되기 때문에, list단위로 정보를 나누어 저장한 뒤에 for문을 이용해서 한 줄씩 dataframe으로 저장하고, 합쳤습니다.


 

data = pd.DataFrame()

te=xmlsoup.findAll("list")

for t in te:
temp=pd.DataFrame(([[t.crp_cls.string,t.crp_nm.string,t.crp_cd.string,t.rpt_nm.string,
t.rcp_no.string,t.flr_nm.string,t.rcp_dt.string, t.rmk.string]]),
columns=["crp_cls","crp_nm","crp_cd","rpt_nm","rcp_no","flr_nm","rcp_dt","rmk"])
data=pd.concat([data,temp])




최종적으로 저장된 data를 출력해 보시면, 아래와 같이 data가 잘 저장되어 있는 것을 확인할 수 있습니다.



In[3]: print(data) crp_cls crp_nm crp_cd rpt_nm rcp_no flr_nm \ 0 Y 한솔케미칼 014680 반기보고서 (2017.06) 20170811001153 한솔케미칼 0 Y 한솔케미칼 014680 분기보고서 (2017.03) 20170515003957 한솔케미칼 0 Y 한솔케미칼 014680 사업보고서 (2016.12) 20170331002748 한솔케미칼 0 Y 한솔케미칼 014680 분기보고서 (2016.09) 20161114000451 한솔케미칼 



현재 공시된 보고서의 list들을 위와 같이 볼 수 있습니다. 여기에 있는 정보를 조합해서 url을 만들면 보고서를 확인할 수 있습니다.

data=data.reset_index(drop=True)
url2="http://dart.fss.or.kr/dsaf001/main.do?rcpNo="+data['rcp_no'][0]


첫 번째 rcp_no를 이용해서 url을 만들었습니다. 이 url을 웹브라우저에 입력해도 되지만, 파이썬에서는 직접 코드를 입력해 웹브라우저를 실행할 수 있습니다.

webbrowser.open(url2)

위와 같이 입력하시면, 바로 아래와 같이 한솔케미칼의 반기 보고서가 웹브라우저에 뜨는 것을 확인하실 수 있습니다.


한솔케미칼_반기보고서

(한솔케미칼 반기 보고서)




이렇게 해서 OPEN API를 활용하여, 한솔케미칼의 재무재표를 웹브라우저로 띄워봤습니다. 작업을 하고 나니, naver 증권에 있는 재무재표를 가져오는 게 더 쉽고 간단할 거 같다는 생각이 드네요. 하지만  최신 공시 자료는 dart에 있으니까 의미는 있는 것 같습니다.

다음에는 반기보고서 중에서 재무재표에 해당하는 부분파이썬에서 분석할 수 있도록 dataframe으로 만들었습니다. 자세한 내용은 아래 글을 참조 바랍니다.

( 참조: [dart api2] 다트 open api로 매출총이익률 계산하기 )


이 글 공유하기



댓글()
  1. 아무개 2017.11.02 14:10 댓글주소  수정/삭제  댓글쓰기

    잘 읽고 있습니다. 덕분에 저도 간단하게 구현해봤어요. ^^감사합니다.

  2. 두두 2018.08.28 18:24 댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다. 질문이 있습니다.
    print(data)
    부분에 말입니다.
    첫 열이 모두 0으로 되어있는건 왜그런가요?
    아무리 concat함수를 찾아봐도 첫 열은 0 1 2 3 이런식으로 되어있는데 말이죠
    그게 문제인지 data['rcp_no'][0] 를 해도 여러개가 나와 url에 저장할 수가 없습니다ㅜ

    • Favicon of https://tariat.tistory.com BlogIcon 테리엇 2018.08.30 00:32 신고 댓글주소  수정/삭제

      concat으로 data와 temp 두 데이터 프레임을 합치는데요.
      temp는 for문에서 html데이터를 한 줄씩 불러와 데이터프레임을 만듭니다. 이 때 인덱스가 0으로 생성되고, 이것들이 합쳐지다보니 첫 열이 모두 0이 됩니다. ( for문에 print(temp)를 넣어보시면 잘 아실 수 있을 듯 합니다.)
      data = data.reset_index(drop=True) 라고 입력하시면 인덱스를 원하시는 순서로 만드실 수 있습니다.