使用rvest爬取redditsearch.io评论无返回结果问题求助
问题根因
- 你当前使用的
rvest::read_html只能拉取网页的静态初始源码,redditsearch.io的所有评论内容都是页面加载完成后通过JavaScript异步调用后端接口动态渲染的,初始静态源码里根本不存在div#comments节点和对应的评论内容,所以代码运行后会返回空值。 - Reddit官方站点的部分页面是服务端直接渲染好内容返回的,所以相同的静态爬取逻辑可以生效,两个站点的页面渲染逻辑完全不同。
调整方案
方案1:使用动态渲染爬取工具(适合少量爬取)
你可以用R的RSelenium包模拟真实浏览器运行,等待页面JS执行完成、评论渲染出来后再提取元素,示例逻辑如下:
library(RSelenium) library(rvest) library(tidyverse) # 启动Chrome浏览器驱动,chromever参数需要替换为你本地Chrome浏览器对应的驱动版本号 driver <- rsDriver(browser = "chrome", chromever = "你的Chrome对应版本号", port = 4567L) remDr <- driver$client # 访问目标页面 remDr$navigate("https://redditsearch.io/?term=depressed&dataviz=false&aggs=false&subreddits=ucdavis&searchtype=comments&search=true&start=0&end=1630465448&size=227") # 等待评论加载完成,可根据网络情况调整等待时长 Sys.sleep(5) # 获取渲染后的完整页面源码,再用原有逻辑提取内容 page_source <- remDr$getPageSource()[[1]] comments <- read_html(page_source) %>% html_node("div#comments") %>% html_nodes("div.body") %>% html_nodes("p") %>% html_text() # 爬取完成后关闭驱动 remDr$close() driver$server$stop()
使用该方案前需要提前配置好对应浏览器的驱动,版本要和本地安装的浏览器版本完全匹配。
方案2:直接调用站点后端接口(适合大量爬取,效率更高)
你可以打开浏览器开发者工具的「网络」面板,筛选XHR类型的请求,刷新页面后就能找到站点拉取评论的后端API接口,直接构造请求获取JSON格式的评论数据,不需要解析页面,速度更快也更稳定。
你可以直接从接口返回的JSON中提取评论内容、发布时间、作者等所有需要的字段,不需要再做HTML节点解析。
内容的提问来源于stack exchange,提问作者veleriecelerie
相关产品推荐
相关产品推荐

