Open Api를 활용한 유기동물 데이터 추출

library(XML)
library(tidyverse)
library(lubridate)

#open api 인증키
service_key <-'본인인증키'

#open api url
url <- 'http://openapi.animal.go.kr/openapi/service/rest/abandonmentPublicSrvc/abandonmentPublic?'

#검색 시작일
bgnde = '20150101'

#축종코드 417000 = 개, 422400 = 묘
upkind = c('417000','422400')

#시도코드 6110000 = 서울특별시
uprcd = c('6110000','6260000','6270000','6280000','6290000',
          '5690000','6300000','6310000','6410000',
          '6420000','6430000','6440000','6450000','6460000','6470000',
          '6480000','6500000')

#한번에 출력되는 값의 갯수
num_rows <- 50000

#xml을 담기 위한 리스트 생성
urlist <- list()

cnt <- 0

#for문을 이용하여 urlist에 xml 담기
for(i in 1:length(uprcd)){
  for (j in 1:length(upkind)){
    #cnt를 이용하여 인덱스 설정
    cnt = cnt + 1 
    #xml을 urlist에 각 인덱스마다 복사
    urlist[cnt] <- paste0(url,'bgnde=',bgnde,
                          '&upkind=', upkind[j],
                          '&upr_cd=', uprcd[i],
                          '&numOfRows=', num_rows,
                          '&ServiceKey=', service_key)
    
  }
}

#urlist에 있는 xml을 파싱하기 위해 빈 리스트 생성
raw.data <- list()
rootnode <- list()
for(i in 1:length(urlist)){
  #xml 파싱
  # 생성한 URL 대로 XML 을 요청한다
  raw.data[[i]] <- xmlTreeParse(urlist[i], useInternalNodes = TRUE,encoding = "utf-8") 
  #xml을 정보를 불러 올 수 있는 형태로 변환
  rootnode[[i]] <- xmlRoot(raw.data[[i]])
}

#접수일, 품종, 발견장소,공고번호,상태 데이터를 담기 위해 빈 벡터 생
a <- c()
b <- c()
c <- c()
d <- c()
e <- c()
#벡터에 접수일, 품종, 발견장소, 공고번호,상태 삽입
#union_all을 하지 않으면 전에 삽입했던 값이 사리지고 union을사용하면 중복된 값이 삭제 됨
for(i in 1: length(rootnode)){
  a <- union_all(a,xpathSApply(rootnode[[i]],"//happenDt",xmlValue))
  b <- union_all(b,xpathSApply(rootnode[[i]],"//kindCd",xmlValue))
  c <- union_all(c,xpathSApply(rootnode[[i]],"//happenPlace",xmlValue))
  d <- union_all(d,xpathSApply(rootnode[[i]],"//orgNm",xmlValue))
  e <- union_all(e,xpathSApply(rootnode[[i]],"//processState",xmlValue))
  
}

#벡터를 이용하여 유기견 데이터프레임 생성
df <- data.frame(접수일= a,
                    품종=b,
                    상태=e,
                    발견장소=c,
                    관활기간=d)
                         
#df접수일을 date format으로 변환
df$접수일<-ymd(df$접수일)

view(table(year(df$접수일)))     

#df$관할기간을 공백으로 분리후 첫번째 값을 시도로 지정
df$시도<-sapply(str_split(df$관활기간," "),head,1)

view(table(df$시도))
view(df)

#년도별에 따른 시도 유기동물 수 추출 
df2<-df %>%
  group_by(year(df$접수일), 시도) %>%
  summarise(count = n())



write.csv(df,'./csv/abandoned_animal_national.csv',row.names = FALSE)