웹 API를 R데이터로 받기

개요

웹 API로 접근 가능한 데이터는 JSON 형식으로 주는 경우가 많다. 물론 HTML이나 XML도 참 많이 있지만...

예를 들어 위키피디아의 Media Wiki API는 반환값으로 JSON을 쓸 수 있다.

RCurl로 데이터 받기


url = "http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content"

우선 url에서 JSON 데이터를 가져오려면 HTTP 콜로 URI 데이터를 다운로드 해야 한다. 따라서 {RCurl} package를 쓰자.

> library(RCurl)
>page = getURL(url)

SSL 때문에 문제가 있다면 옵션을 추가하자.

> page = getURL(url,.opts=list(ssl.verifypeer=FALSE,ssl.verifyhost=FALSE))

timeout 문제 때문에 문제가 있다고 예상되면 timeout 옵션을 추가해야 한다.

> page = getURLContent(url,.opts=list(ssl.verifypeer=FALSE,ssl.verifyhost=FALSE,timeout=90))

timeout은 초 단위다.

자세한 내용은 RCurl이나 Curl을 참고하기를 바란다.

RJSONIO


JSON을 컨트롤 하는 패키지는 {RJSONIO}이다. 말 그대로 R JSON Input/Output의 줄임말.

>library(RJSONIO)

이제 준비는 다 끝났다.

페이지를 받아서

>json_page = fromJSON(page)

JSON으로 파싱했다.
파싱된 결과는 R의 list 타입데이터로 변환된다. 따라서 데이터를 가져오기 위해 복잡한 프로그래밍 과정을 거칠 필요가 전혀 없이 list를 다루 듯 쉽게 사용할 수 있다.

> json_page$query$pages[[1]]$title
[1] "Main Page"

 반대로 list형 데이터는 JSON 형식으로 바꿀 수 있다.

> json_out <- toJSON(json_page)

웹에서 받은 API 중에서 일부만 필요하면 다음과 같이 일부만 가져가자.

> json_page_sub <- json_page[c("title","id","content")]
> json_out <- toJSON(json_page_sub)

tryCatch

API로 JSON 데이터를 받아올 때 여러가지 이유로 에러에 직면한다. 대부분이 서버에서 응답이 없는 경우이다. 충분한 테스트를 거친 후 코드에 문제가 없다면 당신의 컴퓨터에 인터넷이 연결되지 않거나 서버가 당신의 접근을 거부하는 경우가 발생된다. 자세한 내용은 서버에서 반환되는 메시지를 읽어야 알 수 있으나, rate limit가 충분한 상황에서도 에러가 발생한다면 인터넷 연결 문제나 timeout을 넘겼기 때문에 벌어진 일이 아닐까?

이러한 때를 대비하여 tryCatch() 함수로 에러를 처리하자.

trial <- 5 #몇 번 더 시도할 것인가?
checker <- 1 # 1은 통과, 0은 안됨
repeat {
  tryCatch({
     page <- getURLContent(...) # ...은 당신이 넣어야 할 내용!
     checker <- 1
  },error=function(x) {
     stopifnot(trial >= 0) #trial에서 실패하면 실행을 중지하고 이유를 생각하자.
     trial <- trial - 1
     checker <- 0
     Sys.sleep(30) #너무 공격적이어서 session이 끊어졌다면 잠깐 쉬자. 30초 정도
  })
  if(checker == 1) break #통과이면 repeat를 탈출한다.
}

위의 코드는 개념을 알려주기 위해 간단히 작성한 것이다. 개선점이 많으니 스스로 생각하여 알맞게 고치자.

댓글

  1. 질문 있습니다. 저는 Rcurl을 이용해 웹페이지의 소스코드를 따오고, 여기서 필요한 데이터를 따오곤 합니다.
    문제는 브라우저에서 소스코드보기를 통해 보여지는 소스만 가져올 수 있다는 겁니다.
    크롬에서 오른쪽 클릭을 한 후, 요소검사로 본다면 숨겨진 소스코드까지 보이는데, 이걸 따오는 R로 가져오는 방법은 없나요?

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

Bradley-Terry Model: paired comparison models

xlwings tutorial - 데이터 계산하여 붙여 넣기

R에서 csv 파일 읽는 법