如何在R中抓取需交互的网页文本?实现点击展开完整评论
解决TripAdvisor长评论抓取问题:获取完整内容的两种方案
这个问题太典型了——TripAdvisor的长评论默认只显示截断内容,点击"More"才会通过JavaScript加载/显示完整文本,而rvest只能抓取页面初始渲染的静态HTML,所以拿不到隐藏的部分。下面给你两种靠谱的解决办法:
方案一:用RSelenium模拟浏览器点击"More"
RSelenium可以模拟真实浏览器的操作,帮你自动点击所有"More"按钮,等页面加载完整后再抓取评论。
步骤和代码示例:
- 先安装必要的包(如果没装过):
install.packages("RSelenium") install.packages("rvest") install.packages("wdman")
- 启动浏览器驱动(这里以Chrome为例,确保你已经安装了Chrome浏览器和对应版本的chromedriver):
library(RSelenium) library(rvest) library(wdman) # 启动Chrome驱动 chrome_driver <- chrome() remDr <- remoteDriver(browserName = "chrome") remDr$open()
- 访问目标页面,等待加载完成,然后点击所有"More"按钮:
tripAdvisorURL <- "https://www.tripadvisor.com/Hotel_Review-g33657-d85704-Reviews-Hotel_Bristol-Steamboat_Springs_Colorado.html#REVIEWS" # 导航到页面 remDr$navigate(tripAdvisorURL) # 等待页面加载(可以根据实际情况调整等待时间) Sys.sleep(3) # 找到所有"More"按钮并点击 more_buttons <- remDr$findElements(using = "css selector", value = ".partial_entry .taLnk") for(button in more_buttons) { tryCatch({ button$clickElement() Sys.sleep(0.5) # 给一点加载时间 }, error = function(e) { # 跳过已经展开的按钮(有些可能已经是"Less"状态,点击会报错) message("跳过无法点击的按钮: ", e$message) }) }
- 现在页面上的评论都已经展开,抓取完整内容:
# 获取页面的HTML page_source <- remDr$getPageSource()[[1]] webpage <- read_html(page_source) # 提取完整评论 reviewData <- xml_nodes(webpage, xpath = '//*[contains(concat( " ", @class, " " ), concat( " ", "partial_entry", " " ))]') full_reviews <- xml_text(reviewData) # 查看第一条完整评论 cat(full_reviews[[1]])
- 最后记得关闭驱动:
remDr$close() chrome_driver$stop()
方案二:直接调用TripAdvisor的评论API(更高效)
模拟浏览器虽然直观,但速度慢还依赖浏览器。另一种更高效的方式是找到TripAdvisor加载评论的后台API,直接请求JSON数据,里面包含完整的评论内容。
步骤和代码示例:
- 打开浏览器开发者工具(F12),切换到"Network"标签,刷新页面,找到加载评论的XHR请求(通常是包含"reviews"或"api"的请求)。比如你这个页面的评论API大概是类似这样的(参数可能需要调整):
library(httr) library(jsonlite) # 构造API请求URL(参数可以从浏览器开发者工具里复制) api_url <- "https://www.tripadvisor.com/Hotel_Review-g33657-d85704-Reviews-or0-Hotel_Bristol-Steamboat_Springs_Colorado.html?filterLang=en&returnJson=true" # 发送请求 response <- GET(api_url) review_json <- fromJSON(content(response, "text")) # 提取完整评论内容 full_reviews <- review_json$reviews$data$review_text # 查看第一条评论 cat(full_reviews[[1]])
注意:API的URL和参数可能会随TripAdvisor的网站更新而变化,你需要自己在浏览器里抓最新的请求地址和参数。这种方法的优势是速度快,不需要模拟浏览器,适合批量抓取。
内容的提问来源于stack exchange,提问作者JHall651
相关产品推荐
相关产品推荐

