如何结合for循环的结果并在R中一次打印?

How to combine the result of for-loop and print all at once in R?

我正在尝试 抓取 亚马逊上某个产品的评论并将结果导出为 CSV 格式。我试图在一个函数中嵌入 for 循环,但它一直失败。所以我把函数和 for 循环分开看结果,现在我不知道如何合并第 1 页到第 10 页的 for 循环的结果。

当 运行 脚本时,它按页显示评论,但是当我将结果保存为 CSV 时,文件只有第 10 页上的评论。

如何将 for 循环的结果组合在一起并保存在 CSV 中?

#install.packages("tidyverse")
#install.packages("rvest")
#install.packages("xml2")

library(tidyverse)
library(rvest)
library(xml2)

#Product = LG OLED77C9PUB Alexa Built-in C9 Series 77" 4K Ultra HD Smart OLED TV (2019)
#ASIN = B07PQ98L9D

scrape_amazon <- function(ASIN, page_num){


url_reviews <- paste0("https://www.amazon.com/LG-OLED77C9PUB-Alexa-Built-Ultra/product-reviews/",ASIN,"/?pageNumber=",page_num)
doc <- read_html(url_reviews)

#Review Date
doc %>%
    html_nodes("[data-hook='review-date']")%>%
    html_text() -> review_data


#Review Title
doc %>%
    html_nodes("[class='a-size-base a-link-normal review-title a-color-base review-title-content a-text-bold']")%>%
    html_text() -> review_title

#Review Text
doc %>%
    html_nodes("[class='a-size-base review-text review-text-content']")%>%
    html_text() -> review_text

#Number of Stars in Review
doc %>%
    html_nodes("[data-hook='review-star-rating']")%>%
    html_text() -> review_star

#Return a tibble
tibble(review_data,
       review_title,
       review_text,
       review_star,
       page = page_num)%>%
    return()

}


for (i in 1:10){
    review_all <- scrape_amazon(ASIN = "B07PQ98L9D", page_num = i) %>%
                        print(review_all)
}


#save in csv
write.table(review_all, file= "C:/Users/path/review.csv")

我们可以使用 purrr 中的 map_df 获取 10 页的数据

library(rvest)
final <- purrr::map_df(1:10, ~scrape_amazon(ASIN = "B07PQ98L9D", page_num = .x))

for 循环的问题是每次迭代都会覆盖前一次,因此您只能获取最后一次的数据。我们可以创建一个列表来存储所有页面的数据。

review_all <- vector("list", length = 10)
 for (i in 1:10){
   review_all[[i]] <- scrape_amazon(ASIN = "B07PQ98L9D", page_num = i)
}
final <- do.call(rbind, review_all)

我们可以使用write.csv将数据写入csv

write.csv(final, "C:/Users/path/review.csv", row.names = FALSE)

您的 reveiw_all 变量在 for 循环的每次迭代中得到更新。因此,在 i=1 review_all 保存第 1 页的数据,并且由于您的打印命令也在循环内,因此它会打印该结果。但是当您移动到下一次迭代时,review_all 会更新为第 2 页的数据。 所以最后,review_all 只保存第 10 页的数据,这基本上就是你在写入 csv 时看到的内容。

在一般情况下使用 for 循环时,类似以下内容可能会有所帮助。您创建一个收集器变量(在下面的例子中是 result),它的工作是存储 for 循环每次迭代的结果。

result = vector('list', 10)
for(i in 1:10){
  sq = i^2
  cube = i^3
  quad = i^4
  result[[i]] = c(sq, cube, quad)
}

#converting to df
result <- as_tibble(do.call(rbind, result)) %>% set_colnames(c('sq', 'cube', 'quad'))