전사공시 크롤링을 해보면서 공부를 하려고 했었습니다. 그런데 전자공시의 경우 open api가 제공되어있더라구요. API 호출 제한은 1일 1만회로 제한이 되어있습니다. 그래도 api가 제공되는 굳이 스크래핑을 할 필요는 없을거 같아서 api를 이용해서 한 번 공부해보도록 하겠습니다.
OPEN DART 인증키 발급
먼저 api 사용을 하려면 인증키를 발급받아야 합니다.
해당 OPEN DART 사이트에 들어가서 인증키 신청을 합시다. 방법은 간단합니다. 인증키 신청만 하면 발급이 됩니다.
인증키 신청을 눌러서 키를 발급받아봅시다.
인증키 발급 후 오픈 API 이용현황을 보면 일일 이용 현황을 볼 수 있습니다. api를 호출할 때 마다 호출건수가 카운팅됩니다.
개발가이드
개발가이드에는 공시정보, 사업보고서 주요정보, 상장기업 재무정보, 지분공시 종합정보로 나눠져있습니다. 각각의 탭의 내용에 맞는 목록들이 있습니다.
공시정보 목록을 보겠습니다. 먼저 기업의 전자공시정보를 얻기위해서는 기업들의 고유 번호를 알아야 합니다. API명 고유번호 부분을 사용해보겠습니다. 내용은 공시대상회사의 고유번호, 회사면, 대표자면, 종목코드를 파일로 제공한다고합니다.
전자공시 OPEN DART API 의 경우 요청 URL, 메서드, 요청 인자 등 설명이 나와있습니다. 다만 예제 코드가 있으면 더 좋은텐데 코드는 별도로 없네요. 결과로는 Zip 파일을 주고있습니다.
설명을 보면 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())
바이너리 정보임을 확인 할 수 있습니다.
이 데이터를 다시 zip file
로 만들어 준 후 압축을 해제하면 우리가 원하는 xml
파일을 볼 수 있습니다.
고유번호 결과로 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
유뮤를 체크하여서 저장하였습니다.
이렇게 상장된 stock_code
가 있는 회사만 csv파일로 저장을 하였습니다. 아직 전자공시 사이트에서도 분석하는 법을 완전히 알지 못하기 때문에 필요한 기능들을 만들어 나가려면 시간은 꽤 오래 걸릴듯 하지만 차근차근 해보겠습니다.