Web Harvesting + Dynamic HTML 다루기

# TripAdvisor_review_image ------------------------------------------------

library(rvest)
library(RSelenium)
library(foreach)
#웹주소

# 함수 ----------------------------------------------------------------------

expandMore <- function(wdd) {
  eles = wdd$findElements(using='css selector','span.moreLink')
  a=foreach(ele=eles) %do% tryCatch(ele$clickElement(),error=function(e){})
}

goNextReviewPage <- function(wdd) {
  result <- tryCatch({
    nextBtn = wdd$findElement(using='css selector','a.nav.next')
    nextBtn$clickElement()
    return(TRUE)
  },error=function(e){
    return(FALSE)
  })
  result
}


# Headless PhantomJS ------------------------------------------------------
pjs <- phantom()
# Web Harvesting ----------------------------------------------------------
url = "http://www.tripadvisor.com/Restaurant_Review-g35805-d570063-Reviews-or20-Alinea-Chicago_Illinois.html#REVIEWS"
# 브라우저 열기
wd <- remoteDriver(browserName='phantomjs')
wd$open(silent=T)
# 언어를 영어로 고정
wd$phantomExecute('var page=this;
                   page.customHeaders={"Accept-Language":"en-US"}',list())
# 웹페이지로 이동
wd$navigate(url)
# 리뷰 다 열기
expandMore(wd)
# 시스템 반응 기다림(1초)
Sys.sleep(1)
# 페이지 소스 받아서 HTML DOM으로 변환
page_source <- wd$getPageSource()
page_dom <- html(page_source[[1]])

# 리뷰 내에 포함된 사진 자료 획득
review_container <- page_dom %>% html_nodes(xpath="//div[@id='REVIEWS']/div[starts-with(@id,'review_')]")
review_ids <- page_dom %>% html_nodes(xpath="//div[@id='REVIEWS']/div[starts-with(@id,'review_')]") %>% html_attr("id")
cnt <- 0
picture_count <- lapply(review_container,function(x) {
  cnt <<- cnt + 1 #커서증가
  a <- x %>% html_nodes("div.photosInline ul li img.reviewInlineImage") %>% html_attr("src")
  if(length(a)==0) {
    return(0)
  } else {
    # 사진이 발견되면 디렉토리 생성(있으면 덮어쓰기)
    dir.create(review_ids[cnt],showWarnings = FALSE)
    # 사진 다운로드
    foreach(faddr = a,fname=str_c(review_ids[cnt],"/",sprintf("%04d",1:length(a)),".jpg")) %do% {
      download.file(faddr,fname,quiet=TRUE,mode='wb')
    }
    # 사진 개수 반환
    return(length(a))
  }
})
rm(cnt) #커서 제거
picture_count <- unlist(picture_count)
picture_count
wd$close()
pjs$stop()


댓글

이 블로그의 인기 게시물

Bradley-Terry Model: paired comparison models

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

R에서 csv 파일 읽는 법