从 R 中的多个页面中抓取评论
Scraping reviews from Multiple pages in R
我一直在努力在网页上完成抓取。我的任务是从网站上抓取评论并 运行 对其进行情绪分析。但是我只设法在第一页完成了抓取,如何抓取分布在多个页面上的同一部电影的所有评论。
这是我的代码:
library(rvest)
read_html("https://www.rottentomatoes.com/m/dune_2021/reviews") %>%
html_elements(xpath = "//div[@class='the_review']") %>%
html_text2()
这只会让我获得第一页的评论,但我需要所有页面的评论。任何帮助将不胜感激。
您可以避免昂贵的浏览器开销并使用 httr2。该页面使用 queryString GET 请求来批量抓取评论。对于每个批次,startCursor 和 endCursor 的偏移量参数可以从之前的请求中获取,并且有一个 hasNextPage 标志字段可用于终止额外审查的请求。对于初始请求,
title id需要自己取,offset参数可以设置为''.
收集完所有评论后,在我的例子中,我应用了一个自定义函数来从每条评论中提取一些可能感兴趣的项目,以生成最终数据框。
致谢:我从 @flodal here
得到了使用 repeat()
的想法
library(tidyverse)
library(httr2)
get_reviews <- function(results, n) {
r <- request("https://www.rottentomatoes.com/m/dune_2021/reviews") %>%
req_headers("user-agent" = "mozilla/5.0") %>%
req_perform() %>%
resp_body_html() %>%
toString()
title_id <- str_match(r, '"titleId":"(.*?)"')[, 2]
start_cursor <- ""
end_cursor <- ""
repeat {
r <- request(sprintf("https://www.rottentomatoes.com/napi/movie/%s/criticsReviews/all/:sort", title_id)) %>%
req_url_query(f = "", direction = "next", endCursor = end_cursor, startCursor = start_cursor) %>%
req_perform() %>%
resp_body_json()
results[[n]] <- r$reviews
nextPage <- r$pageInfo$hasNextPage
if (!nextPage) break
start_cursor <- r$pageInfo$startCursor
end_cursor <- r$pageInfo$endCursor
n <- n + 1
}
return(results)
}
n <- 1
results <- list()
data <- get_reviews(results, n)
df <- purrr::map_dfr(data %>% unlist(recursive = F), ~
data.frame(
date = .x$creationDate,
reviewer = .x$publication$name,
url = .x$reviewUrl,
quote = .x$quote,
score = if (is.null(.x$scoreOri)) {
NA_character_
} else {
.x$scoreOri
},
sentiment = .x$scoreSentiment
))
我一直在努力在网页上完成抓取。我的任务是从网站上抓取评论并 运行 对其进行情绪分析。但是我只设法在第一页完成了抓取,如何抓取分布在多个页面上的同一部电影的所有评论。
这是我的代码:
library(rvest)
read_html("https://www.rottentomatoes.com/m/dune_2021/reviews") %>%
html_elements(xpath = "//div[@class='the_review']") %>%
html_text2()
这只会让我获得第一页的评论,但我需要所有页面的评论。任何帮助将不胜感激。
您可以避免昂贵的浏览器开销并使用 httr2。该页面使用 queryString GET 请求来批量抓取评论。对于每个批次,startCursor 和 endCursor 的偏移量参数可以从之前的请求中获取,并且有一个 hasNextPage 标志字段可用于终止额外审查的请求。对于初始请求, title id需要自己取,offset参数可以设置为''.
收集完所有评论后,在我的例子中,我应用了一个自定义函数来从每条评论中提取一些可能感兴趣的项目,以生成最终数据框。
致谢:我从 @flodal here
得到了使用repeat()
的想法
library(tidyverse)
library(httr2)
get_reviews <- function(results, n) {
r <- request("https://www.rottentomatoes.com/m/dune_2021/reviews") %>%
req_headers("user-agent" = "mozilla/5.0") %>%
req_perform() %>%
resp_body_html() %>%
toString()
title_id <- str_match(r, '"titleId":"(.*?)"')[, 2]
start_cursor <- ""
end_cursor <- ""
repeat {
r <- request(sprintf("https://www.rottentomatoes.com/napi/movie/%s/criticsReviews/all/:sort", title_id)) %>%
req_url_query(f = "", direction = "next", endCursor = end_cursor, startCursor = start_cursor) %>%
req_perform() %>%
resp_body_json()
results[[n]] <- r$reviews
nextPage <- r$pageInfo$hasNextPage
if (!nextPage) break
start_cursor <- r$pageInfo$startCursor
end_cursor <- r$pageInfo$endCursor
n <- n + 1
}
return(results)
}
n <- 1
results <- list()
data <- get_reviews(results, n)
df <- purrr::map_dfr(data %>% unlist(recursive = F), ~
data.frame(
date = .x$creationDate,
reviewer = .x$publication$name,
url = .x$reviewUrl,
quote = .x$quote,
score = if (is.null(.x$scoreOri)) {
NA_character_
} else {
.x$scoreOri
},
sentiment = .x$scoreSentiment
))