etc/Crawling

[R] OpenDART API 크롤링 (1) - 상장기업 고유번호 가져오기

코딩무민 2020. 12. 2. 09:39
반응형

오늘은 OpenDART를 이용하여 기업의 공시나 재무제표를 크롤링 하는 방법을 알아보도록 하겠습니다. 

일단, 크롤링하기 위해서는 OpenDART의 API 인증키가 필요합니다.

인증키를 생성하는 방법은 아래 링크를 보시면 자세히 나와있습니다! 

2020/10/16 - [크롤링] - [Python] 다트(DART) 오픈 API 공시(재무제표) 크롤링(Crawling)

 

다트(DART) 오픈 API 공시(재무제표) 크롤링(Crawling) - Python

오늘은 상장된 단일기업의 재무제표를 가져오는 크롤링을 해보도록 하겠습니다. 일단, 다트의 공시 API를 가져오기 위해서 Open DART 사이트에 들어갑니다. opendart.fss.or.kr/ 시스템 점검으로 모든 서

coding-moomin.tistory.com

 

이제 R을 이용하여 상장기업 고유번호를 가져와보도록 하겠습니다. 

 

0. 필요한 Library 설치 

R 크롤링에 필요한 라이브러리를 설치합니다. 

#install.packages("httr")
#install.packages("rvest")
#install.packages("xml2")
library(httr)
library(rvest)
library(xml2)

1. URL Request 후 파일 Unzip

API 인증키를 넣은 후, URL을 Request하면 ZIP 파일이 불러와집니다. 

이를 Download 하고 압축파일을 unzip 합니다. 

마지막으로 read_xml을 이용해서 이를 읽어주면 다음과 같은 형태로 나오게 됩니다. 

# Unzip the file
crtfc_key= '자신의 인증키'

res <- httr::GET(url = 'https://opendart.fss.or.kr/api/corpCode.xml',
                 query = list(crtfc_key = I(x = crtfc_key)))
dir = "CORPCODE.zip"
download.file(res$url, dir, mode="wb") 
unzip("CORPCODE.zip")
xdata = read_xml('CORPCODE.xml', Encoding = "UTF-8")
print(xdata) 

결과는 다음과 같이 나오는 것을 알 수 있습니다. 

 

2. 데이터 전처리 

이제 불러온 데이터 중 text만 추출한 뒤, DataFrame 형식으로 바꾸어주도록 하겠습니다. 

xml_children()은 xml을 각각을 더 하위노드로 쪼개주는 함수입니다. 

xml_children(xdata)

xml_children 1번한 결과 

xml_children(xml_children(xdata))

xml_children 2번한 결과 

2-1) Text 만 추출하는 법

xml_children() 함수를 2번 적용한 후 xml_contents()를 이용해 내용만 불러오고 이를 문자열로 바꿔주는 과정입니다. 

text_list = xml_children(xml_children(xdata)) %>% xml_contents() %>% as.character()
head(text_list, 20)

2-2) Data.Frame 형식으로 바꾸기

빈 list 3개를 만들어주고, 각각 순서에 맞게 list에 넣어준 후 dataframe으로 합쳐주면 모든 과정이 끝이 나게 됩니다. 

corpcode = c()  ; corpname = c()  ; m_date  = c()

len <- length(text_list) /4 

for(i in 1:len){
  corpcode[i] = text_list[4*(i-1)+1]  #기업 고유번호는 4개중 1번째
  corpname[i] = text_list[4*(i-1)+2]  #기업명은 4개중 2번째
  m_date[i]  = text_list[4*(i-1)+4]  #수정 날짜는 4개중 4번째
}

data = data.frame(corpcode, corpname, m_date)
print(head(data))

write.csv(data, '기업_고유번호.csv')

 

 

다음 포스팅은 상장기업의 재무제표를 가져오는 크롤링을 해보도록 하겠습니다! 

 

 

 

 

참고 

m.blog.naver.com/tmddn3020/221839030921

반응형