우리나라에서 거래되는 대부분의 소고기는 축산물 이력시스템을 통해 관리가 되고 있습니다. 일반적으로 “002”로 시작하는 소 번호를 입력하면 스마트폰 앱이나 인터넷을 통해 소고기의 이력에 대한 조회가 가능한데, 위 축산물 이력 시스템에서는 여러마리를 한꺼번에 조회할 수 있는 멀티조회 기능을 제공하고 있습니다. 하지만 현재 기준(17년 11월)으로 1회 2,000건 이하의 데이터만 다운받을 수 있으며 육량지수, 도체중과 같은 주요 데이터는 조회가 되지 않는 등의 한계가 있습니다. 또한 한우 도체성적 데이터를 이용해서 사후 분석을 진행하기 위해서는 알맞은 데이터 형태로 가공되어 있어야 편한데 대부분의 농가들은 관리하고 있는 데이터프레임의 형태가 들쑥날쑥이라 처음부터 데이터를 가져와 원하는 형태로 정리하는 것이 필요하다고 느껴서 그냥 직접 가져오기로 했습니다.

공공데이터포털에서는 축산물 품질관리원에서 발급한 축산물들에 대한 정보를 API로 공개하고 있는데, R을 이용해서 이를 가져오는 방법을 알아보도록 하겠습니다.

Part 1: 공공데이터포털 가입/활용신청하기

공공데이터 포털에 접속해 “축산물”이라는 키워드로 검색을 해보면 총 25건의 OPEN API가 검색됩니다.

이 중 “축산물품질평가원 축산물이력정보”에 들어가서 “축산물통합이력정보제공”과 “쇠고기이력정보서비스”를 활용 신청 해줍니다. 자동승인이 되므로 별도의 승인절차는 필요하지 않습니다.

활용 신청이 끝나면 인증키가 발급됩니다.

API에 대한 자세한 내용을 알고 싶으신 분은 “Open API 활용가이드”라는 제목의 워드 또는 한글파일을 통해 확인하시기 바랍니다.

Part 2: R을 이용해 Open API 가져오기

아래 내용의 R script 파일은 github에 업로드 해놓았습니다.

먼저 필요한 패키지를 설치해 줍니다.

install.packages("XML")

본인의 API key를 넣어줍니다.

#API key
API_key<-"GET YOUR SERVICE KEY FROM data.go.kr"

다음과 같이 function을 입력합니다

#function
hanwoo<-function(Cattle_No){

  #package
  require("XML")

  #import basic informations
  url1<-paste("http://data.ekape.or.kr/openapi-data/service/user/mtrace/breeding/cattle?cattleNo=",Cattle_No,"&ServiceKey=",API_key,sep="")
  xmlfile1<-xmlParse(url1)
  xmltop1<-xmlRoot(xmlfile1)
  get_inform<-xmlToDataFrame(getNodeSet(xmlfile1,"//item"),stringsAsFactors=FALSE)

  #import an issueNo
  url2<-paste("http://data.ekape.or.kr/openapi-data/service/user/grade/confirm/issueNo?animalNo=",Cattle_No,"&ServiceKey=",API_key,sep="")
  xmlfile2<-xmlParse(url2)
  xmltop2<-xmlRoot(xmlfile2)
  get_issueNo<-xmlToDataFrame(getNodeSet(xmlfile2,"//item"),stringsAsFactors=FALSE)

  Issue_No<-gsub(" ","",as.character(get_issueNo$issueNo)) #OR Issue_No<-stringr::str_trim(as.character(get_issueNo$issueNo))

  #import the carcass characteristics (by using the IssueNo)
  url3<-paste("http://data.ekape.or.kr/openapi-data/service/user/grade/confirm/cattle?issueNo=",Issue_No,"&ServiceKey=",API_key,sep="")
  xmlfile3<-xmlParse(url3)
  xmltop3<-xmlRoot(xmlfile3)
  get_hanwoo<-xmlToDataFrame(getNodeSet(xmlfile3,"//item"),stringsAsFactors=FALSE)

  print(get_hanwoo)

}

직접 번호를 넣어 테스트 해보겠습니다. 반드시 “괄호”안에 숫자를 넣어주세요.

#test
hanwoo("002083191603")

잘 돌아갑니다

익숙한 사람이라면 대충 봐도 column name이 무슨 뜻인지 알 수 있겠지만, 정확한 내용을 알고 싶으신 분은 위에서 언급한 “Open API 활용가이드”라는 제목의 워드 또는 한글파일을 통해 확인하시기 바랍니다.

여러마리의 데이터를 한꺼번에 가져오고 싶다면 다음 코드를 참고해 주세요.