2020년 7월 7일 화요일

[OpenDart] Open API 사용하기 (주요 공시 조회)

개요

 파이썬 문법을 익힌 후 내가 원하는 종목을 찾기 위해서 어떤방법이 좋을까 생각해 보았다.
코스피, 코스닥에 엄청 많은 기업들이 있는데 그 모든 기업에 대해 내가 일일히 하나씩 알기는 불가능에 가까웠고, 이에 관련된 Open API 들이 없을까 찾아보다가 
Dart 에서 간단한 절차를 통해 API KEY 만 발급 받으면 주요공시 조회, 재무제표, 손익계산서 등을 조회 할 수 있는 API 를 사용할 수 있는 것으로 확인하여 파이썬으로 데이터를 받는 프로그램을 만들기 시작했다.

API KEY 발급신청

 1. 먼저 OpenDart 홈페이지에 접속. Open Dart 홈페이지 (https://opendart.fss.or.kr/)

 2. 엄청 크게 표시된 인증키 신청 클릭
 


 3. 간단한 정보를 입력하고 등록 버튼을 누르면 등록한 Email 주소로 인증메일이 도착한다.
    메일에서 인증하기 클릭만 하면 등록 완료!


파이썬 프로그램 시작하기

 OpenDart API 와 연동하기 위해선 API 통신을 위한 라이브러리가 필요할텐데.. 
 찾아보니 requests, json 등을 간단하게 import 해서 사용하는 것으로 보인다.

import requests
import json

 막상 클래스 상단에 이렇게 선언하고 나니 requests 에 빨간불이 들어왔다.
 import 하고자 한 라이브러리가 설치되지 않아서 인 듯 하다. (당연 처음 해보는거니..)

 이런 경우 Alt + F12 로 터미널창을 열어 다음과 같이 입력하여 requests 모듈을 설치한다.
 C:\workspace\python\eps_module> pip install requests 

 콘솔창에 쭈욱 메시지들이 뜨며 설치가 완료되면 설치된 모듈을 통해 통신하는 함수를 생성한다. 

import requests
import json
import Constants
import Utils
import zipfile
import io

# 전역변수로 선언하면 현재 일자를 세팅해둘 수 있다.
strToday = Utils.getStrCurrentDate('%Y%m%d')

def getNotification(pageNo):
    # 공시요청 API 파라메터 세팅
    reqUrl = 'https://opendart.fss.or.kr/api/list.json?'
    # 발급받은 API 키
    reqUrl += 'crtfc_key=' + Constants.Global.dartApiKey
    # 조회시작일자
    reqUrl += '&bgn_de=' + strToday
    # 조회종료일자
    reqUrl += '&end_de=' + strToday
    # Page 수
    reqUrl += '&page_no=' + str(pageNo)
    # 한페이지 표시 데이터 수 (가이드 참조 10~100)
    reqUrl += '&page_count=' + str(100)

    # 요청 후 데이터 받아옴 (이렇게 간단하다니..)
    response = requests.get(reqUrl)

    hasNextData = False

    # 응답이 정상이라면
    if response.status_code == 200:
        data = json.loads(response.text)
        
        # 데이터 중 현재 페이지와 총 페이지를 비교하여 이후 요청 할 것인지 체크
        hasNextData = data['page_no'] < data['total_page']

        print('--------------------------------------------------------------------')
print('--- ' + str(data['page_no']) + '/' + str(data['total_page']) + ' ---') print('--------------------------------------------------------------------') # 리스트를 1줄씩 {회사명: 공시명} 포맷으로 출력 for i in data['list']: print(i['corp_name'] + ': ' + i['report_nm']) else: print('status code %s', response.status_code) return hasNextData
 
 위 함수는 pageNo 를 인자로 받아 오늘 일자에 발표된 공시를 가져오는 역할을 하는 함수이며 main 함수에서 while loop 를 통하여 모든 공시를 받아오도록 처리할 예정이다.

def main():
    pageNo = 0
    while True:
        pageNo += 1
        hasNextData = getNotification(pageNo)
        if not hasNextData:
            break


if __name__ == '__main__':
    main()

 파이썬에서 메인함수 선언은 Java와 다른듯 유사하였다.

 1. 먼저 main() 이라는 함수를 선언(def) 하고

 2. 그 아래 __name__ == '__main__': 문구를 통하여 함수명이 main 이면 위에 선언한
   함수를 실행하게 처리해주었다.

 3. 함수의 선언순서가 중요한데 아래에서 호출할 함수면 이전에 선언되어 있어야 한다. 
  그렇지 않으면 NameError: name 'xxxx' is not defined 에러를 만날 수 있다.

결과

 while 문에서 pageNo 를 늘려가며 모든 공시정보를 가져오는 것을 확인하였다. 

...
지투알: 임원ㆍ주요주주특정증권등소유상황보고서
이마트: 임원ㆍ주요주주특정증권등소유상황보고서
엔씨소프트: 임원ㆍ주요주주특정증권등소유상황보고서
만도: 임원ㆍ주요주주특정증권등소유상황보고서
LG화학: 임원ㆍ주요주주특정증권등소유상황보고서
LG유플러스: 임원ㆍ주요주주특정증권등소유상황보고서
...

 추가로 Open Dart 홈페이지에선 API 사용에 관한 정보도 확인이 가능하다.
 인증키를 신청한 곳에서 현재 호출한 API 종류 및 횟수를 확인 할 수 있으니 참고하면 좋을 듯 하다.



마치며

 API 연동과 별개로 python 의 간편함을 몸소 느낀 하루였다.
 pip install + 코드 몇줄이면 원하는 바를 얻을 수 있다니..

 이런 공시정보 중 유의미한 정보를 걸러내는 것은 2차로 작업해 볼 예정이다. 
 먼저는 당일 공시를 특정시간 (ex. 1시간) 마다 조회하고, 로컬 DB에 저장하여 유의미 한 것으로 판단되는 공시를 추리는 작업이 될 듯 하다.


댓글 없음:

댓글 쓰기

Recent Posts