전자공시(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"
이런 식으로 매우 깁니다.
아무튼 결과는 다음과 같이 됩니다.
전자공시 데이터를 크롤링하고 나면 결국에는 여러 회사들의 주요지표들을 비교하게 될텐데, 한꺼번에 여러 회사의 정보를 받아올 수 있어 좋긴 합니다.
'금융 & 부동산 > 주식' 카테고리의 다른 글
전자공시(Open DART) 재무제표 크롤링 2 : Python (0) | 2020.05.04 |
---|---|
전자공시(Open DART) 재무제표 크롤링 : Python (6) | 2020.05.03 |
전자공시(Open DART) 재무제표 크롤링 04:: 단일회사 주요계정 (Julia) (0) | 2020.04.25 |
전자공시(Open DART) 재무제표 크롤링 03:: 단일회사 전체 재무제표 (Julia) (0) | 2020.04.24 |
전자공시(Open DART) 재무제표 크롤링 02:: 기업 고유번호 (Julia) (0) | 2020.04.24 |