如何使用rvest自动单击“加载更多”来抓取所有数据

时间:2018-07-14 23:19:35

标签: r rvest purrr rcrawler

我正在使用rvest抓取一个网站,以获取网页上的一些感兴趣的信息。一个示例页面就是这样的https://www.edsurge.com/product-reviews/mr-elmer-product/educator-reviews,我写了一个这样的函数:

PRODUCT_NAME2 <- c()
REVIEW <- c()
USAGE <- c()

DF4 <- data.frame(matrix(ncol=3, nrow=0))

parse_review_page <- function(url) {
    product_name2 <- read_html(url) %>%
            html_nodes(".mb0 a") %>%
            html_text()
    review <- read_html(url) %>% 
            html_nodes(".review-ratings__text strong") %>%
            html_text() 
    usage <- read_html(url) %>% 
            html_nodes("p:nth-child(3)") %>%
            html_text() 


    row_num <- length(review)
    product_name2 <- rep(product_name2, row_num)

    PRODUCT_NAME2 <- c(PRODUCT_NAME2, product_name2)
    print(length(PRODUCT_NAME2))

    REVIEW <- c(REVIEW, review)
    print(length(REVIEW))

    USAGE <- c(USAGE, usage)
    print(length(USAGE))

    current_df2 <- data.frame(PRODUCT_NAME2, REVIEW, USAGE)
    DF5 <<- rbind(DF4, current_df2)
    return (DF5)
    }

然后我用它将结果放入数据框:

url_to_scrape <- c("https://www.edsurge.com/product-reviews/mr-elmer- 
product/educator-reviews")

DF6 <- url_to_scrape %>% map_dfr(parse_review_page)

但是我遇到的问题是,由于有100多个用户评论,因此该网页只会显示30个用户评论。更具挑战性的是,单击页面底部的“加载更多”后,URL不会更改,因此基本上没有要刮取的第二,第三...页面。谁能提出解决此问题的建议,以便我可以通过运行我创建的功能来抓取所有评论数据?

1 个答案:

答案 0 :(得分:0)

以下是使用http请求读取接下来几页的示例代码:

library(httr)
library(xml2)
library(magrittr)

url <- "https://www.edsurge.com/product-reviews/mr-elmer-product/educator-reviews"
elmer <- GET(url)
xcrsftoken <- read_html(rawToChar(elmer$content)) %>% 
    xml_find_first(".//meta[@name='csrf-token']") %>% 
    xml_attr("content")

for (n in 1:5) {
    resp <- GET(paste0(url, "/feed?page=",n,"&per_page_count=30"), 
        add_headers("X-CSRF-Token"=xcrsftoken, "X-Requested-With"="XMLHttpRequest"))

    if (status_code(resp)==200) 
        write_html(read_html(rawToChar(resp$content)), paste0(n, ".html"))
}