반응형

전자공시(Open DART) 재무제표 크롤링 05:: 다중회사 주요계정

 

다중회사 주요계정에 대해서 크롤링하는 것은 앞서 "전자공시(Open DART) 재무제표 크롤링 04:: 단일회사 주요계정"와 거의 유사합니다. 전자공시 웹페이지에서 설명을 처음 읽었을 때, 단일회사 주요계정을 받아오는 것과 무엇이 다른지 몰라서 당황했었습니다. 왜나면 전자공시 OPENDART 시스템 > 개발가이드 > 상장기업 재무정보 > 다중회사 주요계정 개발가이드를 보면 요청인자가 단일회사의 경우와 동일하게 설명이 되어있습니다.

 

단일회사 주요계정 요청과 다중회사 주요계정 요청시 다른 점은 여러 회사를 한번에 요청하느냐 아니냐의 차이밖에 없습니다.

  • 단일회사 (예) : corp_code=12345678
  • 다중회사 (예) : corp_code=12345678,23456789,01234567

위의 예시처럼 기업의 고유번호(corp_code) 값을 여러개 넘길 수 있다는 것입니다. 물론 요청시 사용하는 URL도 다릅니다.

 

여러 회사에 대해서 한번에 요청해서 데이터를 받을 수 있다는 것은 크롤링할 때 중요합니다. 크롤링을 할때 일반 포털사이트의 경우, 크롤링 행위가 데이터에 대한 저작권이 위배될 수 있는 문제라서 짧은 시간에 많이 요청을 할 경우 막혀버릴 수 있습니다. 또한 아무리 API가 제공된다고 하더라도 하루에 요청할 수 있는 횟수의 제한이 있기 때문에 최소한의 요청으로 최대한의 데이터를 획득하는 것은 중요합니다. 확인은 해보지 않았지만 Open DART api의 경우 1분에 100여차례 요청을 하면 에러가 난다는 이야기를 본 적이 있습니다.

 

단일회사 때와 요청인자와 응답결과가 거의 똑같아서 설명은 생략합니다. 여기서도 JSON 데이터로 받아서 데이터프레임으로 변환을 하며, 앞서 "전자공시(Open DART) 재무제표 크롤링 03:: 단일회사 전체 재무제표"를 하면서 만든 convertFnltt(url, items, item_names) 함수를 여기에서도 이용할 생각입니다.

 

함수명은 "get_fnlttMultiAcnt"로 get 뒤에 약어들은 OpenDART에서 쓰는 걸 그대로 이용하고 있습니다.

using HTTP, JSON, DataFrames

function get_fnlttMultiAcnt(crtfc_key::String, corp_code::Array{String},
                            bsns_year::String, reprt_code::String)
  items = ["rcept_no", "bsns_year", "stock_code", "reprt_code", "account_nm",
          "fs_div", "fs_nm","sj_div", "sj_nm", "thstrm_nm", "thstrm_dt",
          "thstrm_amount","thstrm_add_amount", "frmtrm_nm", "frmtrm_dt",
          "frmtrm_amount","frmtrm_add_amount", "bfefrmtrm_nm", "bfefrmtrm_dt",
          "bfefrmtrm_amount","ord"]
  item_names = ["접수번호", "사업연도", "종목코드", "보고서코드", "계정명",
                "개별연결구분","개별연결명", "재무제표구분", "재무제표명", "당기명",
                "당기일자","당기금액", "당기누적금액", "전기명", "전기일자",
                "전기금액","전기누적금액", "전전기명", "전전기일자", "전전기금액",
                "계정과목정렬순서"]
  corps_str = join(corp_code,",")
  #문자열 Array를 "문자열1,문자열2,..,문자열N"으로 하나의 문자열로 변환
  url = "https://opendart.fss.or.kr/api/fnlttMultiAcnt.json"*
        "?crtfc_key=$(crtfc_key)"*"&corp_code=$(corps_str)"*
        "&bsns_year=$(bsns_year)"*"&reprt_code=$(reprt_code)"
  return convertFnltt(url,items,item_names)
end

 

단일회사 주요계정때와 다른점은 corp_code를 Array{String}으로 전달하게끔 하였습니다. 여러 개의 고유번호가 있는 배열을 받아와서 하나의 문자열로 변환하여 URL을 생성합니다. 최대 몇 개의 회사가 동시에 요청되는지 명확하게 테스트해보진 않았지만 500개는 가능했지만, 1000개는 주소가 너무 길어져서 에러메시지를 받았습니다.

 

이번에도 컬럼이 21개인지라 확인이 어려우니, 엑셀로 저장해서 보겠습니다. 테스트 삼아 20개의 회사 고유번호를 대충 넣어봤습니다.

julia> using XLSX

julia> cpy_list = ["00454265","00171636","00264644","00535719","00790121","00960641","00569992","00263140","01130937","00232496","00307897","01088458","00108047","00520887","00147772","00600013","00268181","00491938","00304401","00609254"]

julia> df = get_fnlttMultiAcnt("OPEN DART api 인증키",cpy_list,"2019","11011")

julia> XLSX.writetable("report.xlsx", SHEET1=( collect(DataFrames.eachcol(df)), DataFrames.names(df) ))

 

요청시 URL 주소가,

"https://opendart.fss.or.kr/api/fnlttMultiAcnt.json?crtfc_key=API인증키&corp_code=00454265,00171636,00264644,00535719,00790121,00960641,00569992,00263140,01130937,00232496,00307897,01088458,00108047,00520887,00147772,00600013,00268181,00491938,00304401,00609254&bsns_year=2019&reprt_code=11011"

이런 식으로 매우 깁니다.

 

아무튼 결과는 다음과 같이 됩니다.

 

전자공시 데이터를 크롤링하고 나면 결국에는 여러 회사들의 주요지표들을 비교하게 될텐데, 한꺼번에 여러 회사의 정보를 받아올 수 있어 좋긴 합니다.

반응형

+ Recent posts