You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RSelenium在R中自动滚动加载并爬取全部谷歌评论?

解决RSelenium爬取谷歌评论的自动滚动问题

我正在探索使用RSelenium在R中爬取谷歌评论,以下是我的代码:

library(RSelenium)
library(wdman)
library(netstat)
library(data.table)
library(tidyverse)
library(rvest)


rD <- rsDriver(browser="firefox", port=free_port(), chromever = NULL)
remDr <- rD[["client"]]
remDr$open()
url <- "https://www.google.com/search?q=chans+bend+oreg&sxsrf=APwXEdd-Xmg-_uQOum8A7buBA97FyQqDbQ%3A1681009457208&source=hp&ei=MSsyZM6bCt2H0PEP7oeSoAU&iflsig=AOEireoAAAAAZDI5Qe24Q8NHJ9A_Z90VimpymELKNbhk&ved=0ahUKEwiO-Luc6Jv-AhXdAzQIHe6DBFQQ4dUDCAs&uact=5&oq=chans+bend+oreg&gs_lcp=Cgdnd3Mtd2l6EAMyDQguEIAEEMcBEK8BEAoyBwgAEIAEEAoyBwgAEIAEEAoyBggAEBYQHjICCCYyCAgAEIoFEIYDMggIABCKBRCGAzIICAAQigUQhgMyCAgAEIoFEIYDUABYAGDaB2gAcAB4AIABXIgBXJIBATGYAQCgAQKgAQE&sclient=gws-wiz"
remDr$navigate(url)


Sys.sleep(5)

webElem <- remDr$findElement(using = 'xpath', value = "//span[contains(text(),'Google reviews')]")
webElem$clickElement()

html <- remDr$getPageSource()[[1]]

# parse the HTML using rvest
page <- html %>% read_html()

reviews <- page %>%
  html_nodes(xpath = '//*[@jscontroller="MZnM8e"]') %>%
  html_text()

但这段代码只能爬取当前加载的评论,若要获取全部评论,我需要手动滚动到底部。请问是否可以实现自动滚动的自动化操作,无需手动操作?

可以通过执行JavaScript代码实现自动滚动加载全部评论,以下是具体实现方案:

关键逻辑说明

  1. 定位评论列表的专属容器,避免滚动整个页面干扰其他元素
  2. 循环执行滚动操作,每次滚动后等待页面加载新评论
  3. 通过对比滚动前后的评论数量,判断是否已加载全部内容

修改后的完整代码

library(RSelenium)
library(wdman)
library(netstat)
library(data.table)
library(tidyverse)
library(rvest)

# 启动浏览器驱动
rD <- rsDriver(browser="firefox", port=free_port(), chromever = NULL)
remDr <- rD[["client"]]
remDr$open()

# 导航到目标页面
url <- "https://www.google.com/search?q=chans+bend+oreg&sxsrf=APwXEdd-Xmg-_uQOum8A7buBA97FyQqDbQ%3A1681009457208&source=hp&ei=MSsyZM6bCt2H0PEP7oeSoAU&iflsig=AOEireoAAAAAZDI5Qe24Q8NHJ9A_Z90VimpymELKNbhk&ved=0ahUKEwiO-Luc6Jv-AhXdAzQIHe6DBFQQ4dUDCAs&uact=5&oq=chans+bend+oreg&gs_lcp=Cgdnd3Mtd2l6EAMyDQguEIAEEMcBEK8BEAoyBwgAEIAEEAoyBwgAEIAEEAoyBggAEBYQHjICCCYyCAgAEIoFEIYDMggIABCKBRCGAzIICAAQigUQhgMyCAgAEIoFEIYDUABYAGDaB2gAcAB4AIABXIgBXJIBATGYAQCgAQKgAQE&sclient=gws-wiz"
remDr$navigate(url)

Sys.sleep(5)

# 点击进入评论区
webElem <- remDr$findElement(using = 'xpath', value = "//span[contains(text(),'Google reviews')]")
webElem$clickElement()

Sys.sleep(3)  # 等待评论区初始化加载

# 定位评论列表容器
review_container <- remDr$findElement(using = 'xpath', value = '//div[@jsname="fk8dgd"]')

# 自动滚动加载全部评论
previous_count <- 0
while(TRUE) {
  # 执行JavaScript滚动到容器底部
  remDr$executeScript("arguments[0].scrollTop = arguments[0].scrollHeight;", list(review_container))
  
  Sys.sleep(3)  # 等待新评论加载,可根据网络情况调整时长
  
  # 获取当前已加载的评论数量
  current_html <- remDr$getPageSource()[[1]]
  current_page <- current_html %>% read_html()
  current_reviews <- current_page %>% html_nodes(xpath = '//*[@jscontroller="MZnM8e"]') %>% html_text()
  current_count <- length(current_reviews)
  
  # 如果评论数量不再增加,说明已加载全部
  if(current_count == previous_count) {
    break
  }
  previous_count <- current_count
}

# 最终提取所有评论
final_html <- remDr$getPageSource()[[1]]
final_page <- final_html %>% read_html()
all_reviews <- final_page %>%
  html_nodes(xpath = '//*[@jscontroller="MZnM8e"]') %>%
  html_text()

# 关闭浏览器和驱动
remDr$close()
rD$server$stop()

代码细节解释

  • remDr$executeScript():调用浏览器执行JavaScript,精准滚动评论容器到底部,避免影响页面其他元素
  • 循环终止条件:通过对比滚动前后的评论数量,判断是否没有新评论加载,停止循环
  • Sys.sleep():设置等待时间确保新评论有足够加载时长,可根据网络速度调整数值

内容的提问来源于stack exchange,提问作者student_R123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:37:55