본문 바로가기

BLOG/오픈소스 리뷰기

[오픈소스 리뷰기] DART 전자공시시스템(1) - API 이용하기

오프소스 리뷰 : 슬기로운 오픈소스 사용법 리뷰해드립니다!
#7 DART 전자공시시스템(1) - API 이용하기

 

 

 

안녕하세요. 디노랩스입니다!

오늘도 정말 유용한 정보를 가져왔는데요, 기업들에 관한 정보들을 손쉽게 이용할 수 있는 DART 전자공시시스템에 대해서 소개해드리려고합니다 :D

 

전자공시시스템(DART ; Data Analysis, Retrieval and Transfer System)은 상장법인 등이 공시서류를 인터넷으로 제출하고, 투자자 등 이용자는 제출 즉시 인터넷을 통해 조회할 수 있도록 하는 종합적 기업공시 시스템인데요.

DART를 활용하여 투자자 누구나 기업에 관한 정보를 손쉽게 얻을 수 있습니다.

그래서! 이번에는 DART에서 제공하는 API를 활용하여 간단한 시각화 및 문서화를 하는 방법을 알아보도록 하겠습니다.

 

 

 

 

01. DART API 인증키 신청하기

 

DART API 를 사용하기 위해서는 우선 API 인증키를 신청해야겠죠?ㅎㅎ
아래 링크로 접속하여 인증키 신청 버튼을 클릭한 뒤 신청을 완료해줍니다.
신청 후 이메일 인증을 완료하면 상단 인증키 신청/관리 탭의 오픈 API 이용현황에서 DART API 사용을 위한 Key를 확인할 수 있습니다.

https://opendart.fss.or.kr/

 

전자공시 OPENDART 시스템

--> 시스템 점검으로 모든 서비스 이용이 일시적으로 중단되어니 양해 부탁드립니다. 시스템 점검 일정 2019년12월30일 23:00 ~ 12월31일 24:00 (1시간) *상기 작업 시간은 사정에 의해 변경 될 수 있습니

opendart.fss.or.kr

 

 

 

02. 직접 API를 호출하여 가져오기

dart_fss, OpenDartReader와 같이 DART API를 활용하여 손쉽게 데이터를 수집할 수 있는 라이브러리도 있지만 우선 라이브러리를 활용하지 않고 직접 데이터를 가져오는 방법을 알아보겠습니다.

 

우선 공시정보 중 기업개황 데이터를 가져와보겠습니다.
https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019002

 

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

공시정보 개발가이드 공시정보 기업개황 기업개황 개발가이드 기본 정보 기본 정보 메서드 요청URL 인코딩 출력포멧 GET https://opendart.fss.or.kr/api/company.json UTF-8 JSON GET https://opendart.fss.or.kr/api/company

opendart.fss.or.kr

개발가이드의 기업개황 개발가이드 페이지를 확인해보면 아래와 같이 기본 정보와 요청 인자를 확인할 수 있습니다.

 

 

json, xml 형태 중 하나를 선택할 수 있으며 필수 요청인자로는 API 인증키와, 조회하려는 공시대상회사의 고유번호(8자리) 입니다.
개발가이드 페이지에서 아래로 스크롤하면 OpenAPI 테스트를 할 수 있는데 xml을 선택하여 검색버튼을 누르면 다음 그림과 같이 요청하는데 사용되는 url과 요청인자를 조합한 예시와 요청결과 xml 형식의 데이터 예시를 확인할 수 있습니다.

 

그러면 이제 위와 같은 방법으로 API를 직접 사용해봅시다!

 

# 필수 라이브러리를 불러옵니다.
import requests
from bs4 import BeautifulSoup
url = 'https://opendart.fss.or.kr/api/company.xml?'
crtfc_key = 'API key 값 넣기'       # 발급받은 API key를 입력해주세요
corp_code = '00126380'              # 공시대상회사 고유번호(8자리)
response = requests.get(f'{url}crtfc_key={crtfc_key}&corp_code={corp_code}')
soup = BeautifulSoup(response.text, 'lxml')
print(soup)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><html><body><result><status>000</status><message>정상</message><corp_code>00126380</corp_code><corp_name>삼성전자(주)</corp_name><corp_name_eng>SAMSUNG ELECTRONICS CO,.LTD</corp_name_eng><stock_name>삼성전자</stock_name><stock_code>005930</stock_code><ceo_nm>김기남, 김현석, 고동진</ceo_nm><corp_cls>Y</corp_cls><jurir_no>1301110006246</jurir_no><bizr_no>1248100998</bizr_no><adres>경기도 수원시 영통구  삼성로 129 (매탄동)</adres><hm_url>www.sec.co.kr</hm_url><ir_url></ir_url><phn_no>031-200-1114</phn_no><fax_no>031-200-7538</fax_no><induty_code>264</induty_code><est_dt>19690113</est_dt><acc_mt>12</acc_mt></result></body></html>

 

 

xml 형태로 조회하고자 하는 회사의 기업개황 데이터를 수집했습니다.
이제 xml 형태의 데이터를 조금 더 활용하기 쉽도록 데이터프레임 형태로 바꿔보겠습니다.

 

import pandas as pd

# 빈 데이터프레임 만들기
df_se = pd.DataFrame(columns=['기업명','영문기업명','종목코드','대표자명','법인구분',
                              '법인등록번호','사업자등록번호','주소','업종코드','설립일','결산월'])

# xml 데이터에서 필요한 값 추출
corp_name = soup.find('corp_name').text
corp_name_eng = soup.find('corp_name_eng').text
stock_code = soup.find('stock_code').text
ceo_nm = soup.find('ceo_nm').text
corp_cls = soup.find('corp_cls').text
jurir_no = soup.find('jurir_no').text
bizr_no = soup.find('bizr_no').text
adres = soup.find('adres').text
induty_code = soup.find('induty_code').text
est_dt = soup.find('est_dt').text
acc_mt = soup.find('acc_mt').text

# 데이터 프레임에 데이터 row 추가
df_se = df_se.append({
    '기업명':corp_name,
    '영문기업명':corp_name_eng,
    '종목코드':stock_code,
    '대표자명':ceo_nm,
    '법인구분':corp_cls,
    '법인등록번호':jurir_no,
    '사업자등록번호':bizr_no,
    '주소':adres,
    '업종코드':induty_code,
    '설립일':est_dt,
    '결산월':acc_mt,
    },
    ignore_index = True
)

 

 

이번에는 반복문을 통해 여러 회사의 기업개황 데이터를 수집해보겠습니다.

 

url = 'https://opendart.fss.or.kr/api/company.xml?'
crtfc_key = 'API key 값 넣기'   # 발급받은 API key를 입력해주세요

# 2021.10.11 기준 시가총액 상위 10개 회사의 기업개황 데이터를 불러옵니다.
corp_code_lst = ['00126380','00164779','00266961','00877059','00356361','00258801','00126362','00164742','00106641','00413046']

# 빈 데이터프레임 만들기
df_top10 = pd.DataFrame(columns=['기업명','영문기업명','종목코드','대표자명','법인구분',
                                 '법인등록번호','사업자등록번호','주소','업종코드','설립일','결산월'])

# 반복문을 통해 각 회사별 데이터 수집 후 데이터프레임에 추가
for code in corp_code_lst:
    response = requests.get(f'{url}crtfc_key={crtfc_key}&corp_code={code}')
    soup = BeautifulSoup(response.text, 'lxml')

    # xml 데이터에서 필요한 값 추출
    corp_name = soup.find('corp_name').text
    corp_name_eng = soup.find('corp_name_eng').text
    stock_code = soup.find('stock_code').text
    ceo_nm = soup.find('ceo_nm').text
    corp_cls = soup.find('corp_cls').text
    jurir_no = soup.find('jurir_no').text
    bizr_no = soup.find('bizr_no').text
    adres = soup.find('adres').text
    induty_code = soup.find('induty_code').text
    est_dt = soup.find('est_dt').text
    acc_mt = soup.find('acc_mt').text

    # 데이터 프레임에 데이터 row 추가
    df_top10 = df_top10.append({
        '기업명':corp_name,
        '영문기업명':corp_name_eng,
        '종목코드':stock_code,
        '대표자명':ceo_nm,
        '법인구분':corp_cls,
        '법인등록번호':jurir_no,
        '사업자등록번호':bizr_no,
        '주소':adres,
        '업종코드':induty_code,
        '설립일':est_dt,
        '결산월':acc_mt,
        },
        ignore_index = True
    )

 

위와 같은 방법으로 기업개황 데이터뿐만 아니라 주요 재무정보, 공시보고서 정보 등 다양한 공시정보를 수집하여 활용할 수 있는데요.

다음포스팅에서 그 다양한 활용법들을 알려드릴테니까 보시고 유용한 정보 되셨으면 좋겠습니다 :D