전자공시 OPENDART api 이용하기 - 고유번호

전사공시 크롤링을 해보면서 공부를 하려고 했었습니다. 그런데 전자공시의 경우 open api가 제공되어있더라구요. API 호출 제한은 1일 1만회로 제한이 되어있습니다. 그래도 api가 제공되는 굳이 스크래핑을 할 필요는 없을거 같아서 api를 이용해서 한 번 공부해보도록 하겠습니다.

OPEN DART 인증키 발급

먼저 api 사용을 하려면 인증키를 발급받아야 합니다.

 

 

open-dart-api

해당 OPEN DART 사이트에 들어가서 인증키 신청을 합시다. 방법은 간단합니다. 인증키 신청만 하면 발급이 됩니다.

 

opendart-api

인증키 신청을 눌러서 키를 발급받아봅시다.

 

 

opendart-api-이용현황

인증키 발급 후 오픈 API 이용현황을 보면 일일 이용 현황을 볼 수 있습니다. api를 호출할 때 마다 호출건수가 카운팅됩니다.

 

개발가이드

opendart-api-전자공시

개발가이드에는 공시정보, 사업보고서 주요정보, 상장기업 재무정보, 지분공시 종합정보로 나눠져있습니다. 각각의 탭의 내용에 맞는 목록들이 있습니다. 

 

 

opendart-api-고유번호

공시정보 목록을 보겠습니다. 먼저 기업의 전자공시정보를 얻기위해서는 기업들의 고유 번호를 알아야 합니다. API명 고유번호 부분을 사용해보겠습니다. 내용은 공시대상회사의 고유번호, 회사면, 대표자면, 종목코드를 파일로 제공한다고합니다.

 

 

opendart-api-고유번호2

전자공시 OPEN DART API 의 경우 요청 URL, 메서드, 요청 인자 등 설명이 나와있습니다. 다만 예제 코드가 있으면 더 좋은텐데 코드는 별도로 없네요. 결과로는 Zip 파일을 주고있습니다.

 

 

opendart-api-python

설명을 보면 Zip 파일 안에 XML파일이 있다고 합니다. 요청 URL에 보면 corpCode.xml을 받을 수 있겠습니다.

 

OPEN DART API 호출

from io import BytesIO
from zipfile import ZipFile
import urllib.request
import xml.etree.ElementTree
import pandas
import csv

url = 'https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=발급받은 인증키'
with urllib.request.urlopen(url) as zipresponse:
    with ZipFile(BytesIO(zipresponse.read())) as zipfile:
        zipfile.extractall('corpCode')

urlopen을 이용하여 리소스를 가져와서 읽어보면 (print(zipresponse.read()) 바이너리 정보임을 확인 할 수 있습니다.

 

 

전자공시-활용-python

이 데이터를 다시 zip file로 만들어 준 후 압축을 해제하면 우리가 원하는 xml 파일을 볼 수 있습니다.

 

 

전자공사python주식

고유번호 결과로 CORPCODE.xml 파일을 받을 수 있습니다. 열어서 결과 설명 처럼 고유번호, 정식명칭, 종목코드가 들어 있는지 확인 해 보겠습니다. 

 

 

여기에 보면 stock_code가 없는건 비상장사로 보입니다. stock_code가 없는 회사는 저는 중요하지 않기 때문에 걸러서 파일을 저장하려고 합니다. 그리고 파일을 저장할 때에 xml은 좀 불편하여서 .csv 파일로 저장하겠습니다. 

 

tree = xml.etree.ElementTree.parse('CORPCODE.xml')
root = tree.getroot()

file = open("corpcode.csv", mode="w")
writer = csv.writer(file)
writer.writerow(["corp_code", "corp_name", "stock_code", "modify_date"])
for country in root.iter("list"):

    stock_code = country.findtext("stock_code")
    stock_code = stock_code.strip()

    if stock_code:
        country_dic = {
            "corp_code": country.findtext("corp_code"),
            "corp_name": country.findtext("corp_name"),
            "stock_code": country.findtext("stock_code"),
            "modify_date": country.findtext("modify_date"),
        }
        writer.writerow(list(country_dic.values()))

먼저 xml의 데이터를 읽어와서 stock_code 유뮤를 체크하여서 저장하였습니다.

 

 

전자공시-pythonapi

이렇게 상장된 stock_code가 있는 회사만 csv파일로 저장을 하였습니다. 아직 전자공시 사이트에서도 분석하는 법을 완전히 알지 못하기 때문에 필요한 기능들을 만들어 나가려면 시간은 꽤 오래 걸릴듯 하지만 차근차근 해보겠습니다.

 

 

그리드형(광고전용)

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band

댓글

Designed by JB FACTORY