반응형

전자공시(Open DART) 재무제표 크롤링 02:: 기업 고유번호 (Julia programming)

 

  전자공시 OPEN DART 시스템(https://opendart.fss.or.kr)에서 API로 가장 많이 이용되는 것이 "공시검색"과 "단일회사 전체 재무제표"라고 합니다. 재무제표를 크롤링 하려면 단일회사 전체 재무제표에서 받아와야 할텐데, 개발가이드를 보다보면 공시대상회사의 "고유번호"라는 것이 필요합니다. A라는 회사의 재무제표를 특정지어 보고 싶을 때, 그 회사의 8자리 고유번호를 알아야 합니다. 처음에는 단순히 주식시장의 종목코드와 동일하겠지 생각했었는데, 다릅니다.

 

  이번 글에서는 줄리아로 Open DART에서 고유번호를 받아와서 DataFrame으로 변환하는 작업을 합니다.

 

"개발가이드" > "공시정보" > "고유번호 개발가이드"(https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019018)를 살펴보면 아래 그림과 같습니다.

  출력되는 포멧이 무려 Zip File 입니다. zip파일을 받아서 보면, "CORPCODE.xml" 파일이 하나 있고 내용은 아래 그림처럼 생겼습니다.

  일단은 OpenDART에 요청을 해야겠고, Zip 파일을 열고, xml 형식의 데이터를 DataFrame으로 변환해야합니다.

 

get_corpcode(crtfc_key::String) 함수를 아래와 같이 만들었습니다. crtc_key는 Open DART에서 받은 40자리 인증키를 인자로 넘겨주게끔 하였습니다. 반환되는 값은 DataFrame으로 "corp_code","corp_name","stock_code","modify_date" 이렇게 4개의 컬럼명을 가지고 있습니다. 위의 4개는 각각 "고유번호","기업명","주식코드","최근수정일" 입니다.

using HTTP, ZipFile, LightXML, DataFrames


function get_corpcode(crtfc_key::String) # crtfc_key == DART API 인증키
  items = ["corp_code","corp_name","stock_code","modify_date"]
  # 나중에 xml 읽을때 key로 쓸고, DataFrame의 컬럼명으로 쓰기 위해 선언

  url = "https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=$(crtfc_key)"
  zfile = HTTP.get(url)  # HTTP의 response
  r = ZipFile.Reader(IOBuffer(zfile.body))  # IO로 변환하여 zip파일을 읽음
  f  = r.files[1] # 어차피 파일은 1개니까 인덱스를 바로 붙여서 파일 선택
  xdoc = parse_string(read(f,String)) # 파일을 String으로 해서 xml 파싱
  xroot = root(xdoc) # <result></result>를 받아오기
  ces = collect(child_elements(xroot)) # <list></list>를 배열로 받아오기
  tmp_arr = [] # 임시로 값들을 넣을 1차원 배열
  for i in 1:length(ces)
    for key in items
      push!(tmp_arr,content(find_element(ces[i],key)))
      # <list></list> 안에 있는 내용을 items의 각 key값으로 받아서 배열에 넣기
    end
  end
  df = convert(DataFrame,permutedims(reshape(tmp_arr,4,trunc(Int,length(tmp_arr)/4))))
  # 1차원배열에 넣어놨던걸 4개의 컬럼을 가지는 형태로 변환하여 DataFrame 만듦
  rename!(df,items)  # 컬럼명 붙이기
  df = df[length.(df.stock_code) .> 1 , :]
  # 주식시장 상장 기업만 보기 위해서 주식코드가 있는 것만 필터링
  free(xdoc) # xml 파싱한 것 닫기
  return df
end

return된 dataframe의 첫 5줄을 출력을 해보면 다음과 같은 결과가 나옵니다.

julia> println(first(df,5))

5×4 DataFrame
│ Row │ corp_code │ corp_name    │ stock_code │ modify_date │
│     │ Any       │ Any          │ Any        │ Any         │
├─────┼───────────┼──────────────┼────────────┼─────────────┤
│ 1   │ 00260985  │ 한빛네트      │ 036720     │ 20170630    │
│ 2   │ 00264529  │ 엔플렉스      │ 040130     │ 20170630    │
│ 3   │ 00358545  │ 동서정보기술  │ 055000     │ 20170630    │
│ 4   │ 00231567  │ 애드모바일    │ 032600     │ 20170630    │
│ 5   │ 00247939  │ 씨모스       │ 037600     │ 20170630    │

이제 주식시장에 상장된 기업의 고유번호를 알아내었으니, 이 고유번호를 이용해서 재무제표를 요청할 것입니다.

반응형

+ Recent posts