R语言爬取fxblue站点失败:rvest、RSelenium均返回空值,求正确方案
失败原因说明
- 首次使用rvest爬取失败:目标站点的情绪数值为前端动态渲染数据,初始静态HTML中不存在
.SentimentValueCaptionLong对应节点,该节点是页面加载完成后由JavaScript请求后端接口数据后生成的。rvest仅能读取初始静态HTML内容,无法执行JavaScript渲染逻辑,因此无法定位到目标节点。 - 第二次使用RSelenium爬取失败:执行页面跳转后未设置等待时间,直接拉取页面源码时,JavaScript尚未完成数据请求和节点渲染操作,拉取到的源码中仍未生成目标节点,因此返回空结果。
修正后的RSelenium实现代码
library(RSelenium) # 注意:chromever参数需与本地安装的Chrome浏览器版本保持一致,否则会启动失败 rD <- rsDriver(browser="chrome", port=9999L, verbose = F, chromever = "填写你的Chrome对应版本号") remDr <- rD[["client"]] remDr$maxWindowSize() remDr$navigate("https://www.fxblue.com/market-data/tools/sentiment") # 设置等待时间,确保页面JS执行完成、目标节点渲染完毕,可根据网络情况调整时长 Sys.sleep(3) # 直接通过RSelenium定位元素并提取文本,无需转换为rvest对象处理 target_node <- remDr$findElement(using = "css selector", value = ".SentimentValueCaptionLong") result <- target_node$getElementText()[[1]] print(result) # 任务完成后关闭浏览器和驱动,避免后台残留进程 remDr$close() rD$server$stop()
更高效的实现方案(无浏览器依赖)
你可以通过浏览器开发者工具的「网络」面板,筛选XHR/Fetch类型的请求,找到返回情绪数据的后端接口,直接发起请求解析返回的JSON数据即可。该方案不需要启动浏览器,运行速度更快,也无需处理浏览器版本匹配、节点等待等问题。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

