如何用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代码实现自动滚动加载全部评论,以下是具体实现方案:
关键逻辑说明
- 定位评论列表的专属容器,避免滚动整个页面干扰其他元素
- 循环执行滚动操作,每次滚动后等待页面加载新评论
- 通过对比滚动前后的评论数量,判断是否已加载全部内容
修改后的完整代码
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
相关产品推荐
相关产品推荐

