我试图在上为亚马逊上的某个产品刮掉评论,并导出CSV格式的结果。我试图在函数中嵌入for循环,但它一直失败。因此,我将函数和for循环分开以查看结果,现在我不知道如何将for循环的结果从第1页合并到第10页。
当运行脚本时,它会按页面显示评论,但是当我在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")发布于 2019-11-16 07:12:04
我们可以使用map_df从purrr获得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)发布于 2019-11-16 07:37:31
您的reveiw_all变量在for循环的每一次迭代中都会得到更新。因此,在i=1 review_all保存第1页的数据时,由于您的print命令也在循环中,所以它会打印结果。但是,当您进入下一次迭代时,review_all将被更新为第2页的数据。因此,最终,review_all只保存第10页的数据,这实质上就是写入csv时所看到的数据。
在一般情况下,在使用for循环时,下面这样的内容可能会有所帮助。您可以创建一个收集器变量(在下面的结果中),它的任务是存储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'))https://stackoverflow.com/questions/58888222
复制相似问题