如何结合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'))
我正在尝试 抓取 亚马逊上某个产品的评论并将结果导出为 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'))