首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将复循环的结果与R中一次打印的结果结合起来?

如何将复循环的结果与R中一次打印的结果结合起来?
EN

Stack Overflow用户
提问于 2019-11-16 06:36:17
回答 2查看 512关注 0票数 0

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

当运行脚本时,它会按页面显示评论,但是当我在CSV中保存结果时,文件只有第10页上的那些。

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

代码语言:javascript
复制
#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")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-16 07:12:04

我们可以使用map_dfpurrr获得10页的数据

代码语言:javascript
复制
library(rvest)
final <- purrr::map_df(1:10, ~scrape_amazon(ASIN = "B07PQ98L9D", page_num = .x))

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

代码语言:javascript
复制
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中的数据。

代码语言:javascript
复制
write.csv(final, "C:/Users/path/review.csv", row.names = FALSE)
票数 2
EN

Stack Overflow用户

发布于 2019-11-16 07:37:31

您的reveiw_all变量在for循环的每一次迭代中都会得到更新。因此,在i=1 review_all保存第1页的数据时,由于您的print命令也在循环中,所以它会打印结果。但是,当您进入下一次迭代时,review_all将被更新为第2页的数据。因此,最终,review_all只保存第10页的数据,这实质上就是写入csv时所看到的数据。

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

代码语言:javascript
复制
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'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58888222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档