이번 포스팅에서는 오픈API를 활용해서 공공데이터포털에서 제공하는 “금융위원회 금융회사기본정보” 데이터를 가져오는 방법에 대해서 알아 보겠습니다. Tool은 파이썬을 사용하겠습니다. 그리고 나서 다음 포스팅에서는 “금융위원회 금융회사기본정보” 를 분석하는 방법과 많은 인사이트를 도출해 보겠습니다.
오픈 API를 활용하여 공공데이터 가져오기
본격적인 데이터 분석을 하기에 앞서, 오픈 API를 활용하여 분석하고자 하는 데이터를 가져오는 방법에 대해서 알아보겠습니다. 실제 데이터분석에 사용할 예정인 “금융위원회_금융회사기본정보” 를 가져오겠습니다. 제일 먼저 아래 버튼을 클릭하여 해당 웹페이지로 이동하겠습니다.
오픈 API 상세 정보 확인
클릭해서 이동해 보면, 금융위원회_금융회사기본정보에 대한 오픈 API 상세 정보가 보입니다. 해당 페이지에서 데이터를 가져오는 데 가장 중요한 부분은 요청주소, 요청변수(Request Parameter), 출력결과(Response Element)입니다.
요청주소
요청주소는 우리의 정보가 저장되어 있는 웹페이지의 주소를 나타냅니다. 해당 주소로 정보를 요청하라는 뜻입니다.
금융위원회_금융회사기본정보가 있는 요청주소는 http://apis.data.go.kr/1160100/service/GetFnCoBasiInfoService/getFnCoOutl임을 알 수 있습니다.
요청변수
요청변수(Request Parameter)는 최종 데이터를 얻기 위해 요청해야 하는 변수입니다. 요청변수 리스트는 아래의 표와 같습니다.
항목명(국문) | 항목명(영문) | 항목크기 | 항목구분 | 샘플데이터 | 항목설명 |
---|---|---|---|---|---|
서비스키 | ServiceKey | 4 | 필수 | – | 공공데이터포털에서 받은 인증키 |
페이지 번호 | pageNo | 4 | 필수 | 1 | 페이지번호 |
한 페이지 결과 수 | numOfRows | 4 | 필수 | 10 | 한 페이지 결과 수 |
결과형식 | resultType | 4 | 필수 | xml | 결과형식(xml/json) |
기준일자 | basDt | 8 | 옵션 | 20200408 | 작업 또는 거래의 기준이 되는 일자(년월일) |
법인등록번호 | crno | 13 | 옵션 | 1101113892240 | 법인등록번호 |
금융회사명 | fncoNm | 1000 | 옵션 | 메리츠자산운용 | 금융회사의 이름 |
요청변수에는 필수항목과 옵션항목이 있습니다. 필수항목은 데이터를 요청할 때 반드시 입력해야 하는 변수이고, 옵션항목은 선택사항입니다.
출력결과
출력결과(Response Element)는 요청주소와 요청변수를 전송했을 때, 받을 수 있는 정보 리스트입니다.
전체 데이터를 한번에 가져오기 전에 요청주소 요청변수를 사용하여 샘플데이터 1건에 대한 정보를 가져오는 방법에 대해서 먼저 알아보겠습니다.
요청주소와 요청변수를 사용하여 샘플데이터 1건에 대한 정보 가져오는 방법
웹페이지의 주소 입력창에 요청주소와 요청변수를 아래와 같은 방법으로 입력합니다.
https://apis.data.go.kr/1160100/service/GetFnCoBasiInfoService/getFnCoOutl?serviceKey=****&pageNo=1&numOfRows=10&resultType=json&basDt=20200408&crno=1101113892240&fncoNm=%EB%A9%94%EB%A6%AC%EC%B8%A0%EC%9E%90%EC%82%B0%EC%9A%B4%EC%9A%A9
(참고로 serviceKey=**** 에서 ****은 공공데이터에 회원으로 가입하고 받은 본인의 API인증키를 입력해야 합니다.)
(위의 구문에 대해 자세히 알고 싶으시면 아래의 포스팅 글을 참고하시기 바랍니다.)
요청주소와 요청변수를 입력하면 웹페이지상에서 아래와 같은 출력 결과가 나옵니다.
{"response":{"body":{"items":{"item":[{"basDt":"20200408","crno":"1101113892240","fncoNm":"메리츠자산운용","fncoEnsnNm":"Meritz Asset Management","isinCd":"","isinCdNm":"","fncoRprNm":"***","corpRegMrktDcd":"E","corpRegMrktDcdNm":"기타","bzno":"1078708658","fncoAdr":"서울특별시 종로구 북촌로 104 계동빌딩","fncoZpcd":"03051","fncoHmpgUrl":"","fncoTlno":"02-6320-3000","fncoFxno":"02-6320-3009","sicCd":"","sicNm":"64201","fncoEstbDt":"20080506","fncoStacMm":"12","fncoXchgLstgDt":"","fncoXchgLstgAbolDt":"","fncoKosdaqLstgDt":"","fncoKosdaqLstgAbolDt":"","fncoKrxLstgDt":"","fncoKrxLstgAbolDt":"","fncoSmenpYn":"","mntrFcnFncoCd":"","mntrFcnFncoCdNm":"","fncoEmpeCnt":"0","empeAvgCnwkTermCtt":"","fncoEmpeAvgSlryAmt":"0","actnAudpnNm":"","audtRptOpnnCtt":"","fncoMainBizNm":"","fssCorpUnqNo":"00685935","fssCorpChgDtm":"2020/03/23"}]},"numOfRows":10,"pageNo":1,"totalCount":1},"header":{"resultCode":"00","resultMsg":"NORMAL SERVICE."}}}
API로 1건의 데이터를 요청해서 1건의 출력 결과를 얻게 되었습니다.
그럼 위의 과정을 이용하여 특정시점(2022년 11월 17일)의 금융회사 기본정보를 모두 불러 오겠습니다.
금융위원회 금융회사기본정보 모두 불러오기
패키지 로딩
제일 먼저 해야하는 일은 데이터를 불러오는 데 필요한 패키지 정보를 파이썬에 로딩하는 작업입니다.
# 데이터 호출을 위해 필요한 라이브러리 import
from urllib.parse import urlencode
import requests
import json
import pandas as pd
import math
URL 입력 및 API 호출 결과 확인
그 다음 URL 및 query string을 입력하여 API를 통해 데이터를 호출합니다. 정상적으로 호출에 성공하였다면, response 200 이라는 결과를 얻게 됩니다.
# url 입력
url = "http://apis.data.go.kr/1160100/service/GetFnCoBasiInfoService/getFnCoOutl"
# queryString 입력
queryString = "?" + urlencode(
{
# 공공데이터 사이트 가입 시 받은 본인의 서비스 키 입력
"serviceKey": "공공데이터 가입 시 부여받은 service key 입력",
"pageNo": 1
"numOfRows": 10,
"resultType": "json",
"basDt": 20221117
}
)
# 최종 요청 url 생성
queryURL = url + queryString
# API 호출
response = requests.get(queryURL)
response
=> 출력결과: <Response [200]> 확인
API 호출 결과 json 형태로 데이터 로딩
API로 호출한 데이터를 json 형태로 로딩합니다.
# 호출된 데이터를 joson 형태로 로딩
rDict = json.loads(response.text)
rDict
# 호출된 데이터를 joson 형태로 로딩
rDict = json.loads(response.text)
rDict
-----------------------------------
# 호출된 결과의 일부 출력 결과
{'response': {'body': {'items': {'item': [{'basDt': '20221117',
'crno': '1101110002959',
'fncoNm': '(주)한화',
'fncoEnsnNm': 'HANWHA CORP',
'isinCd': '000880',
'isinCdNm': '',
'fncoRprNm': '***, ***, ***, ***, ***',
'corpRegMrktDcd': 'P',
'corpRegMrktDcdNm': '유가',
'bzno': '2028116825',
'fncoAdr': '서울특별시 중구 청계천로 86 24층',
'fncoZpcd': '04541',
'fncoHmpgUrl': 'www.hanwhacorp.co.kr',
'fncoTlno': '02-729-1114',
'fncoFxno': '0505-730-3333',
'sicCd': '',
'sicNm': '20494',
'fncoEstbDt': '19521028',
'fncoStacMm': '12',
호출된 전체 데이터 개수 확인
호출된 전체 데이터 개수를 확인합니다.
# 오픈 API 호출 결과 데이터의 개수 확인 및 저장
numOfRows = rDict["response"]["body"]["numOfRows"]
# 전체 데이터의 개수 확인 및 저장
totCnt = rDict["response"]["body"]["totalCount"]
totCnt
----------------------
=> 출력결과: 1066
총 오픈 API 호출 횟수 계산 및 저장
전체 데이터를 불러오기 위한 API 호출 횟수를 계산하고 저장합니다.
loopCount = math.ceil(totCnt/numOfRows)
loopCount
------------------
=> 출력결과: 107
API를 활용한 전체 데이터 호출
전체 데이터를 호출하고, 그 결과를 D드라이드에 “금융회사기본정보조회서비스.csv” 파일명으로 저장합니다.
# 전체 데이터를 저장할 객체 선언
finalTotalData = pd.DataFrame()
# 오픈 API 호출을 총 오픈 API 호출 횟수만큼 반복 실행
for i in range(loopCount) :
# queryString 입력
queryString = "?" + urlencode(
{
"serviceKey": "공공데이터 가입 시 부여받은 service key 입력",
"pageNo": i+1,
"numOfRows": 10,
"resultType": "json",
"basDt": 20221117
}
)
# 최종 요청 url 생성
queryURL = url + queryString
# API 호출
response = requests.get(queryURL)
# 딕셔너리 형태로 변환
rDict = json.loads(response.text)
# 데이터 프레임만 선택하여 doc 객체에 저장
doc = rDict["response"]["body"]["items"]["item"]
# 추출한 데이터를 누적해서 저장
finalTotalData = pd.concat([finalTotalData, pd.DataFrame(doc)], axis = 0, ignore_index = True)
# CSV 파일로 저장하기
finalTotalData.to_csv("D://금융회사기본정보조회서비스.csv", index = False, encoding = "utf-8-sig")
D드라이브를 열어 보시면 “금융회사기본정보조회서비스.csv” 파일이 생성되었음을 확인하실 수 있습니다. 다음 포스팅에서는 생성된 데이터를 활용하여 다양한 인사이트를 도출해 보겠습니다.