전자공시 OPEN API는 응답 데이터유형으로 JSON과 XML을 제공한다.
JSON과 XML중 어떤 데이터 포맷을 사용할지는 사용자의 몫이다. 가독성은 기본이고 협업을 하는 상황이라면 다수 사용자들이 다루기 쉬운 용어가 더 적합할 것이다. 본 장에서는 JSON 포맷을 다룬다.
관련 포스트 시리즈
- python - 다트.전자공시 Open API 활용(1), 전체 상장사(고유코드) 조회 - HTTP로 얻은 Stream zip파일 읽기
- python - 다트.전자공시 Open API 활용(3), 공시대상회사 추출 및 가공 ( xml to dict - xmltodict library)
- python - 다트.전자공시 Open API 활용(4), 공시대상회사 조회 - 대화형 콘솔 만들기
- 전자공시 Open API 활용(5), 기업 재무제표 조회 API ( 분기/반기/사업보고서 - 재무상태표, 손익계산서 )
- 전자공시 Open API 활용(6), pandas 기초 - 재무제표 json 데이터를 pandas DataFrame으로 변환
JSON이란 ?
https://ko.wikipedia.org/wiki/JSON
JSON(제이슨, JavaScript Object Notation)은 속성-값 쌍( attribute–value pairs and array data types (or any other serializable value)) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다.
JSON은 다음과 같은 기본 자료형을 제공한다.
- Object
- String
- Number
- Array
- Boolean
JSON 데이터 구조
{
"이름": "홍길동", # string
"나이": 25, # Number
"성별": "여",
"주소": "서울특별시 양천구 목동",
"특기": ["농구", "도술"], # Array
"가족관계": {"#": 2, "아버지": "홍판서", "어머니": "춘섬"}, # Object
"회사": "경기 수원시 팔달구 우만동"
}
출처: https://ko.wikipedia.org/wiki/JSON
JSON과 Python 의 기본자료형 구조 비교
JSON | Python |
object | dict |
string | str |
number | int, float |
true / false | True / False |
null | None |
Python은 JSON 라이브러리를 Built-in 라이브러리로 포함하고 있다. 별도 설치없이 아래와 같이 사용할 수 있다.
import JSON
자 이제 OPEN DART의 기업개황 서비스 호출하고 JSON 포맷으로 수신해보자
python - [OPEN DART]전자공시 OPEN API, HTTP로 얻은 Stream zip파일 읽기
https://youngwonhan-family.tistory.com/6 에서 HTTP url 호출하는 내용을 그대로 사용한다.
기업개황 URL : https://opendart.fss.or.kr/api/company.json
from urllib.request import urlopen
from zipfile import ZipFile
from io import BytesIO
def bind_params(params : dict):
url_params = []
for key in params:
url_params.append(key + '=' + params[key])
return url_params
url = 'https://opendart.fss.or.kr/api/company.json?'
params = {
'crtfc_key':'Insert your crtfc key', # API 인증키
'corp_code':'00132008' # 기업 고유번호 8자리
}
url = url + '&'.join(bind_params(params))
resp = urlopen(url)
if resp.code == 200:
resp_json_str = resp.read().decode()
수신한 resp_json 데이터를 출력해보자
>>> print(resp_json_str)
{"status":"000","message":"정상","corp_code":"00132008","corp_name":"(주)선우",
"corp_name_eng":"SUN WOO CO., LTD.","stock_name":"선우","stock_code":"",
"ceo_nm":"김병욱","corp_cls":"E","jurir_no":"1701110017162","bizr_no":"5038113212",
"adres":"경상북도 고령군 성산면 성산로 868 (어곡리)","hm_url":"www.isunwoo.com","ir_url":"",
"phn_no":"054-955-1700","fax_no":"054-955-1715","induty_code":"33303","est_dt":"19810427",
"acc_mt":"12"}
>>> print(type(resp_json_str))
<class 'str'>
형태는 JSON으로 보이지만 str 형태이다. JSON data가 데이터 송수신등을 위해 직렬화 되어있는 상태이다. 이를 역직렬화 하기 위해서 load 함수를 사용하여 JSON Object로 변환한다.
>>> resp_json = json.loads(resp_json_str)
>>> print(type(resp_json))
>>> print(json.dumps(resp_json, indent=4, ensure_ascii=False))