본문 바로가기
  • Homines, dum docent, discunt
  • Repetitio est Mater Memoriae
  • Dilige et fac quod vis
지식 창고/R 언어

금융통계정보시스템 OPEN API R 코드

by Manana Cho 2022. 5. 25.
반응형

https://fisis.fss.or.kr/fss/fsiview/indexw.html

 

금융통계정보시스템

 

fisis.fss.or.kr

* 본 사이트는 금융 기관의 금융 정보들을 확인할 수 있습니다. 아래와 같이 OPEN API 사용 방법에 대해 상세히 설명해두었기 때문에 인증키를 발급받고 사용하는 것에는 큰 문제가 없습니다. XML, JSON, XLS를 모두 지원한다는 것도 큰 장점입니다. 

https://fisis.fss.or.kr/fss/fsiview/indexw.html

그러나 각 URL에 데이터가 할당되어 있어 데이터 수집시 URL을 전부 생성해주어야하는 어려움이 있습니다. 

저는 이하의 코드에 나오듯, for 루프 구문을 이용하여 URL을 조합해 불러오는 방법을 사용하였습니다. 

엑셀의 자동완성 기능을 사용하면 보다 아래의 일련의 과정으로 보다 쉽게 구문을 조합할 수 있습니다. 

(1) [1] 부분을 ctrl+H로 지우고,

(2) 정의한 함수 finstatfun을 이용해 json 구문으로 불러오는 함수식 작성

(3) 변수명을 자동완성으로 정의

finstatcodetemplate.xlsx
0.01MB

(만일의 경우를 위해 코드 수정 템플릿을 위에 첨부합니다.) 

 

전체 코드는 아래와 같습니다. 

 

finstatcode.txt
0.09MB

###InstallPackages/Libraries-------------------------------
if (!require('httr')) install.packages('httr'); library('httr')
if (!require('jsonlite')) install.packages('jsonlite'); library('jsonlite')
if (!require('dplyr')) install.packages('dplyr'); library('dplyr')
if (!require('tidyverse')) install.packages('tidyverse'); library('tidyverse')
if (!require('rvest')) install.packages('rvest'); library('rvest')
if (!require('xml2')) install.packages('xml2'); library('xml2')
if (!require('dplyr')) install.packages('dplyr'); library('dplyr',  warn.conflicts = FALSE)
if (!require('shiny')) install.packages('shiny'); library('shiny')
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')
if (!require('DT')) install.packages('DT'); library('DT')
if (!require('tibble')) install.packages('tibble'); library('tibble')
if (!require('shinythemes')) install.packages('shinythemes'); library('shinythemes')
if (!require('lubridate')) install.packages('lubridate'); library('lubridate')
if (!require('rsconnect')) install.packages('rsconnect'); library('rsconnect')
if (!require('scales')) install.packages('scales'); library('scales')
###API_KEY---------------------------------------------------

api_key="[개인 API 코드]"

###홈페이지제공코드표

 

확장금융권역 분류표.csv
0.00MB
금융권역 분류표.csv
0.00MB

expandedfinancialrange=read.csv("확장금융권역 분류표.csv")

financialrange=read.csv("금융권역 분류표")

#Function-----------------------------------------------------------
finstatfun=function(url){
  urlinfo=GET(url)
  urlinfo_json=content(urlinfo, as='text')
  urlinfo_json
  urlinfo=fromJSON(txt = urlinfo_json %>% 
                     as.character())
  urlinfo_df=urlinfo$result$list
  urlinfo_df
}
finstatfundt=function(url){
  urlinfo=GET(url)
  urlinfo_json=content(urlinfo, as='text')
  urlinfo_json
  urlinfo=fromJSON(txt = urlinfo_json %>% 
                     as.character())
  urlinfo_df=urlinfo$result$list
  urlinfo_df
  DT::datatable(urlinfo_df)
}

###------------------------------------------------------------------------
###[1]금융회사 API (financeCd)---------------------------------
comp_base_url="http://fisis.fss.or.kr/openapi/companySearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
financeCd=0010224 #선택사항
partDiv="A" #국내은행 (금융권역(financialrange) 분류표 참조)
financialcorp_url=paste0(comp_base_url,
                         response_method, 
                         '?lang=',language,
                         '&auth=',api_key, 
                         '&partDiv=',partDiv
                         #,"&financeCd=",financeCd

financialcorp_url
financeCd=GET(financialcorp_url)
financeCd
status_code(x = financeCd) #값이 있는지 확인하는 코드입니다. 
financeCd_json=content(financeCd, as='text')
financeCd_json
financeCd_list=fromJSON(txt = financeCd_json %>% 
                          as.character())
financeCd_df=financeCd_list$result$list
financeCd_df
DT::datatable(financeCd_df)
write.csv(financeCd_df,"금융회사상세.csv")

##[1]금융회사 API-All(financeCdall)-------------------------------------------------------
comp_base_url="http://fisis.fss.or.kr/openapi/companySearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
#financeCd=0010224 #선택사항
#partDiv="A" #국내은행 (금융권역(financialrange) 분류표 참조)
financialrangelist=unlist(financialrange$code)
for (partdiv in financialrangelist){  #루프 구문을 이용한 URL 조합
 print(paste0(comp_base_url,
                         response_method, 
                         '?lang=',language,
                         '&auth=',api_key, 
                         '&partDiv=',partdiv
                         #,"&financeCd=",financeCd
        ))
}

###PASTE CODE### #위에서 조합된 코드를 가공해 불러들일 것

#----------------------------------------------------------------------------
financeCdall=rbind(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22)
financeCdall
shinyApp(
  ui = fluidPage(DTOutput('tbl')),
  server = function(input, output) {
    output$tbl = renderDT(
      financeCdall, options = list(lengthChange = FALSE)
    )
  }
)
write.csv(financeCdall,"금융회사상세(전체).csv")

###[2]통계목록 대분류 API-ALL(listNoall)---------------------------------
##이하의 스크립트는 전체 코드를 불러오기는 하나, 데이터 요청 제한을 초과함으로 시행을 추천드리지 않습니다. 
stat_base_url="http://fisis.fss.or.kr/openapi/statisticsListSearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
lrgDiv="A" #금융권역코드 (확장금융권역(expandedfinancialrange) 분류표 참조)
smlDiv="B" #재무현황 #통계표분류코드 (확장금융권역(expandedfinancialrange) 분류표 참조)
rstudioapi::writeRStudioPreference("console_max_lines", 10000)
sink(file='myoutput.txt')
for(lrgDiv in expandedfinancialrange$fincode){
  for(smlDiv in expandedfinancialrange$statcode){
  print(paste0(stat_base_url,
                  response_method, 
                  '?lang=',language,
                  '&auth=',api_key, 
                  '&lrgDiv=',lrgDiv,
                  '&smlDiv=',smlDiv))
    }
}
sink() # 조합된 URL이 1000개를 넘어가 메모장으로 연결되게 만듦
###PASTE URL###


#listnoall=rbind(b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,...b9014,b9015,b9016,b9017,b9018,b9019,b9020,b9021,b9022,b9023,b9024,b9025)
listnoall
shinyApp(
  ui = fluidPage(DTOutput('tbl')),
  server = function(input, output) {
    output$tbl = renderDT(
      listnoall, options = list(lengthChange = FALSE)
    )
  }
)
write.csv(listnoall,"통계표 상세(전체).csv")

###----------------------------------------------------------------------------------
###[3]계정항목 API(accountCd)---------------------------------
acct_base_url="http://fisis.fss.or.kr/openapi/accountListSearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
listNo="SA024" #부문별손익
acct_url=paste0(acct_base_url,
                response_method, 
                '?lang=',language,
                '&auth=',api_key, 
                '&listNo=',listNo

acct_url
acctlist=GET(acct_url)
acctlist
status_code(x = acctlist) #값이 있는지 확인하는 코드입니다. 
acctlist_json=content(acctlist, as='text')
acctlist_json
acctlist_list=fromJSON(txt = acctlist_json %>% 
                         as.character())
accountCd_df=acctlist_list$result$list
accountCd_df
DT::datatable(accountCd_df)
write.csv(accountCd_df,"계정항목 .csv")
###[3]계정항목대분류 API(accountCdall)---------------------------------
acct_base_url="http://fisis.fss.or.kr/openapi/accountListSearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
listNolist=unlist(listNo_df$list_no)
for (listNo in listNolist){
  print(paste0(acct_base_url,
                response_method, 
                '?lang=',language,
                '&auth=',api_key, 
                '&listNo=',listNo)
  )
}
##accountCdall SCRIPT-------------------------------------------------------------
###PASTE URL###
###----------------------------------------------------------------------------
acctlistall=rbind(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,c24)
shinyApp(
  ui = fluidPage(DTOutput('tbl')),
  server = function(input, output) {
    output$tbl = renderDT(
      acctlistall, options = list(lengthChange = FALSE)
    )
  }
)
write.csv(financeCdall,"금융회사상세(전체).csv")
write.csv(accountCd_df,"계정항목 .csv")

###[*]통계정보 API---------------------------------
statinfo_base_url="http://fisis.fss.or.kr/openapi/statisticsInfoSearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
#Set-------------------------------------------------
financeCd_list=unlist(financeCd_df$finance_cd)
financeCd_list
listNo_list=unlist(listNo_df$list_no)
listNo_list
accountCd_list=unlist(accountCd_df$account_cd)
accountCd_list
#item-------------------------------------------
financeCd="0010927"
listNo="SA029" #부문별손익
accountCd="A"
term="Y" #Y(연도), H(반기), Q(분기)
startBaseMm=201306 #검색시작년월
endBaseMm=201306 #검색종료년월
statinfo_url=paste0(statinfo_base_url,
                    response_method, 
                    '?lang=',language,
                    '&auth=',api_key, 
                    '&financeCd=',financeCd,
                    '&listNo=',listNo,
                    '&accountCd=',accountCd,
                    '&term=',term,
                    '&startBaseMm=',startBaseMm,
                    '&endBaseMm=',endBaseMm

statinfo_url
statinfo=GET(statinfo_url)
statinfo
status_code(x = statinfo) #값이 있는지 확인하는 코드입니다. 
statinfo_json=content(statinfo, as='text')
statinfo_json
statinfo=fromJSON(txt = statinfo_json %>% 
                    as.character())
statinfo_df=statinfo$result$list
statinfo_df
DT::datatable(statinfo_df)
write.csv(statinfo_df,"통계정보 .csv")
###[**]통계정보 API 부문별 손익 전체---------------------------------
statinfo_base_url="http://fisis.fss.or.kr/openapi/statisticsInfoSearch."
response_method="json"#canchoosefrom①xml②json③xls
language="kr" #kr(한글), en(영어)
#Set-------------------------------------------------
financeCd_list=unlist(financeCd_df$finance_cd)
financeCd_list
listNo_list=unlist(listNo_df$list_no)
listNo_list
accountCd_list=unlist(accountCd_df$account_cd)
accountCd_list
#item-------------------------------------------
listNo_list=c("SA029","SA030","SA031","SA032","SA033") #부문별손익
accountCd="A"
term="Y" #Y(연도), H(반기), Q(분기)
startBaseMm=202006 #검색시작년월
endBaseMm=202006 #검색종료년월
for(financeCd in financeCd_list){
  for(listNo in listNo_list){
  print(paste0(statinfo_base_url,
                    response_method, 
                    '?lang=',language,
                    '&auth=',api_key, 
                    '&financeCd=',financeCd,
                    '&listNo=',listNo,
                    '&accountCd=',accountCd,
                    '&term=',term,
                    '&startBaseMm=',startBaseMm,
                    '&endBaseMm=',endBaseMm)
  )
  }
}
###STAT info SCRIPT-----------------------------------------------------
###PASTE URL###
##--------------------------------------------------------
statinfo_all=rbind(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26,d27,d28,d29,d30,d31,d32,d33,d34,d35,d36,d37,d38,d39,d40,d41,d42,d43,d44,d45,d46,d47,d48,d49,d50,d51,d52,d53,d54,d55,d56,d57,d58,d59,d60,d61,d62,d63,d64,d65,d66,d67,d68,d69,d70,d71,d72,d73,d74,d75,d76,d77,d78,d79,d80,d81,d82,d83,d84,d85,d86,d87,d88,d89,d90,d91,d92,d93,d94,d95,d96,d97,d98,d99,d100,d101,d102,d103,d104,d105,d106,d107,d108,d109,d110,d111,d112,d113,d114,d115,d116,d117,d118,d119,d120,d121,d122,d123,d124,d125,d126,d127,d128,d129,d130,d131,d132,d133,d134,d135,d136,d137,d138,d139,d140,d141,d142,d143,d144,d145,d146,d147,d148,d149,d150,d151,d152,d153,d154,d155,d156,d157,d158,d159,d160,d161,d162,d163,d164,d165,d166,d167,d168,d169,d170)
statinfo_all
DT::datatable(statinfo_all)
write.csv(statinfo_all,"통계정보부문별순익 .csv")

반응형

댓글