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()
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()
댓글
댓글 쓰기