주식 가치투자에 대해 공부하던 중 기업의 공시 정보를 제공하는 사이트를 알게 되었다. 기업개황, 사업보고서등의 정보가 OPEN API로 제공되는데 여러장에 걸쳐 API 사용법과 데이터 핸들링에 대해 알아본다.
관련 포스트 시리즈
-
python - 다트.전자공시 Open API 활용(2), 기업개황 응답데이터 JSON 핸들링( JSON 기초 )
-
python - 다트.전자공시 Open API 활용(3), 공시대상회사 추출 및 가공 ( xml to dict - xmltodict library)
-
전자공시 Open API 활용(5), 기업 재무제표 조회 API ( 분기/반기/사업보고서 - 재무상태표, 손익계산서 )
-
전자공시 Open API 활용(6), pandas 기초 - 재무제표 json 데이터를 pandas DataFrame으로 변환
참고:
전자공시 시스템의 OPEN API중 "공시정보 목록"은 Zip 파일로 제공한다.
( 아래 API URL은 인증키가 있어야 하므로 인증키 신청을 먼저 해야 함. )
XML, HTML파서인 BeautifulSoup을 사용하기 위해 패키지 설치를 선행한다.
pip install BeautifulSoup
Python에서 공시검색 Rest api를 요청하여 Zip파일을 Stream으로 읽는다.
Stream 은 BytesIO를 사용하여 파일처럼 로드 한다.
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from zipfile import ZipFile
from io import BytesIO
from bs4 import BeautifulSoup
url = "https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=Insert your crtf key"
resp = urlopen(url)
# 수신된 resp의 bytes를 Buffer에 쌓고 zip file을 로드한다.
with ZipFile(BytesIO(resp.read())) as zf:
file_list = zf.namelist()
while len(file_list) > 0:
file_name = file_list.pop()
corpCode = zf.open(file_name).read().decode()
break
# XML 데이터 파싱
soup = BeautifulSoup(corpCode, 'html.parser')
print(soup.prettify())
OUT [1]: #결과
<result>
<list>
<corp_code>
00918949
</corp_code>
<corp_name>
동화테크
</corp_name>
<stock_code>
</stock_code>
<modify_date>
20200129
</modify_date>
</list>
<list>
<corp_code>
00132008
</corp_code>
<corp_name>
선우
</corp_name>
<stock_code>
</stock_code>
<modify_date>
20200129
</modify_date>
</list>
</result>
(참고) 수신데이터 용량이 크므로 soup.prettify() 수행시간 오래 걸림
Zip파일은 복수개의 파일이 있을 수 있으므로 namelist() 로 파일이름을 list로 받는다.
ZipFile 로 오픈 후 read() 시 byte형태 이기 때문에 decode() 처리 한다.
corpCode = zf.open(file_name).read().decode()
※ BytesIO 함수는 io 라이브러리에서 제공하며 Python 2.6, 2.7, 3.x 버전에서 제공 됨
위에서 얻은 XML을 Dict나 Json 데이타 타입으로 변경하려면 아래 링크를 참조한다.
2021/02/08 - [python] - Python - BeautifulSoup 객체(ResultSet, Tag) Dict, XML로 변환하기