我正试图从Tripadvisor刮刮某家酒店的酒店评论。我正在使用Rvest来实现我的目标。该脚本必须抓取多个页面。
在执行我的脚本时,rvest在循环执行时有时会返回带有空值的向量。这是完全随机的。有人对此有解决办法吗?
我尝试手动遍历脚本。当我慢慢走下坡路时,它通常可以正常工作,但有时仍然可以拉空数据。
# Webscrapen
df <- data.frame()
x = 0
for(i in 1:250){
url <- paste("https://www.tripadvisor.com/Hotel_Review-g295424-d7760386-Reviews-or",x,"-Hyatt_Regency_Dubai_Creek_Heights-Dubai_Emirate_of_Dubai.html", sep = "")
x = x + 5
reviews <- url %>%
read_html() %>%
html_nodes('.common-text-ReadMore__content--2X4LR') %>%
html_node('.hotels-hotel-review-community-content-review-list-parts-ExpandableReview__reviewText--2OVqJ span') %>%
html_text()
rating <- url %>%
read_html() %>%
html_nodes(".hotels-hotel-review-community-content-review-list-parts-RatingLine__bubbles--3d2Be span") %>%
html_attr("class")
rating <- sapply(strsplit(rating, "_"), `[`, 4) %>%
as.numeric()
if(nrow(df) == 0){
df <- data.frame(reviews[!is.na(reviews)], rating, stringsAsFactors = F)
} else {
temp <- df
df <- rbind(temp, data.frame(reviews[!is.na(reviews)], rating, stringsAsFactors = F))
}
}
我希望刮掉所有评论,直到我的for循环停止为止。我的数据框至少应包含100条评论。
答案 0 :(得分:0)
我找到了一种解决方法,将评论放置在重复循环中,并在没有填充矢量的情况下保持重复。
代码需要花费更长的时间才能执行,但可以完成工作。
repeat{
Review <- url %>%
read_html() %>%
html_nodes('.common-text-ReadMore__content--2X4LR') %>%
html_node('.hotels-hotel-review-community-content-review-list-parts-ExpandableReview__reviewText--2OVqJ span') %>%
html_text()
if(length(Review) >= 1 ){
break;
}
}