본문 바로가기

PROJECT

DART open API 이용해서 데이터 쉽게 수집하기(with python)

*DART(전자공시시스템)에서 일일이 파일을 다운받지 않고, 쉽게 기업의 재무제표를 가져와서 분석하는 프로그램 만들기

 

원래 재무제표를 받기위해서는,

1) DART 사이트 접속하기

2) 검색창에 찾고 싶은 기업 이름 검색

3) 검색 결과에서 열람하고 싶은 보고서 클릭

4) 다운로드 버튼 클릭

5) 다운로드 버튼을 눌렀을 때 나오는 여러 파일 중, 내가 원하는 엑셀 파일 다운받기

6) 엑셀 파일에서 원하는 정보가 있는 sheet 클릭

이런 6단계의 과정을 거쳐야 하는데, 이 반복적인 잡업을 처리해주는 python 프로그램을 만들었습니다.

 

1. DART 사이트에서 원하는 기업의 정보 가져오기 (DART OPEN API 이용)

corp_code='005930'
#DART OPEN API 이용한 url
url = 'https://opendart.fss.or.kr/api/list.xml?crtfc_key={}&corp_code={}&bgn_de=20180101&page_count=100&pblntf_detail_ty=A001&pblntf_detail_ty=A002&pblntf_detail_ty=A003'.format(crtfc_key, corp_code)
resp = requests.get(url) # 웹 서버에 요청/응답
webpage = resp.content.decode('UTF-8') #byte 형태로 된 문자를  읽을 수 있는 형태로 변환

Python에 위의 코드를 입력하면 DART open API를 이용해서 원하는 기업의 코드, 열람하고 싶은 자료의 정보 등을 가져옵니다.

url에 설정된 주소를 보면 복잡하지만 간단합니다.

crtfc_key: open api를 이용하기 위해 사전에 dart에서 허락받은 코드입니다. (개인마다 다르므로 위 코드에는 나와있지 않습니다)

corp_code: 기업의 코드. 저는 예시로 005930(삼성전자)의 값을 넣어줬습니다.

bgn_de: search하고 싶은 자료의 등록일의 시작

page_count: 한 페이지에 들어가는 수인데 저는 max값으로 설정해주었습니다.

pblntf_detail_ty: 사업보고서, 반기보고서, 분기보고서에 해당하는 코드를 입력해주었습니다.

 

더 많은 변수들이 있는데 저는 위의 값들만 설정해주었고, 아래의 홈페이지에 더 자세하게 나와있습니다.

opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019001

 

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

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

opendart.fss.or.kr

이렇게 불러온 webpage에는 다음과 같은 정보들이 담겨있습니다.

이 중에서 저는 보고서의 이름과 년도 정도만 필요하기 때문에 report_nm, rcept_no 이 두개의 정보만 가져와서

각각 rcept_no_list, period_list 라는 변수에 넣어둘 것입니다.

re라는 정규표현식 package의 find함수를 활용하여 해당 문자가 들어간  부분을 찾습니다.

( re의 함수를 이용하기 위해서는 이전에 import re를 입력해서 re의 함수들을 불러와야 합니다)

Re.findall() 함수에 어려운 말이 많은 것 같지만, webpage에서 <rcept_no> 어쩌구 <rcept_no>가 들어간 부분을 찾는다고만 해석하시면 됩니다.

 

import re
rcept_no_list = re.findall(r'<rcept_no>(.*?)</rcept_no>', webpage)
period_list = re.findall(r'<report_nm>(.*?)</report_nm>', webpage)

 

다운로드하는 페이지에서 위 버튼의 HTML을 보면 아래와 같은 url로 링크되어 있는 것을 볼 수 있습니다.

 

따라서, 원하는 보고서의 파일을 다운받기 위해서는 rcp_no와 dcm_no가 합니다.  rcp_no는 위에서 구했기 때문에 dcm_no만 구하면 됩니다. 아래와 같이 dcm_no를 구할 수 있습니다

dcm_no_list = []
for rcept_no in rcept_no_list:
    resp = requests.get("http://dart.fss.or.kr/dsaf001/main.do?rcpNo={}".format(rcept_no))
    webpage = resp.content.decode('UTF-8')
    dcm_no = re.findall(r"{}', '(.*?)',".format(rcept_no), webpage)[0]
    dcm_no_list.append(dcm_no)

3. 엑셀 다운로드

def download_excel(period, rcp_no, dcm_no, company):
    url = 'http://dart.fss.or.kr/pdf/download/excel.do?rcp_no={}&dcm_no={}&lang=ko'.format(rcp_no, dcm_no)
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
    resp = requests.get(url, headers = {"user-agent": user_agent})
    table = BytesIO(resp.content)
    for sheet in ["연결 재무상태표", "연결 포괄손익계산서"]:
        data = pandas.read_excel(table, sheet_name=sheet, skiprows=5)
        data.to_csv(str(period) +"_"+company +"_"+sheet +".csv", encoding = "euc-kr")

for period, rcp_no, dcm_no in zip(period_list, rcept_no_list, dcm_no_list ):
    download_excel(period, rcp_no, dcm_no, '삼성전자')

excel을 다운로드하는 함수를 만들어 준 뒤, 앞서 만든 period_list, rcept_no_list, dcm_no_list를 이용하여 다운받아 줍니다.

 

완성!

이제 이 프로그램을 이용해서 쉽게 기업의 재무제표를 가져와서 분석할 수 있습니다.

 

 

'PROJECT' 카테고리의 다른 글

정말 작은 첫 프로젝트 - 공 쏘기 게임  (0) 2021.03.11