【问题标题】:How to combine the result of for-loop and print all at once in R?如何在R中组合for循环的结果并一次打印?
【发布时间】:2019-11-16 06:36:17
【问题描述】:

我正在尝试抓取亚马逊上某个产品的评论,然后以 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")

【问题讨论】:

    标签: r for-loop web-scraping web-crawler tibble


    【解决方案1】:

    我们可以使用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)
    

    【讨论】:

      【解决方案2】:

      您的 reveiw_all 变量在 for 循环的每次迭代中都会得到更新。因此,i=1review_all 保存第 1 页的数据,并且由于您的打印命令也在循环中,因此它会打印该结果。但是当您进入下一次迭代时,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'))
      

      【讨论】:

        猜你喜欢
        • 2020-09-04
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多