如何使用rvest爬取网页点击触发的弹窗说明文本?
抓取失败原因
你使用read_html()执行的是静态页面爬取,只能获取页面初始加载的HTML源码。目标弹窗#definitionBoxText的文本内容是JavaScript动态生成的:只有点击对应经济变量旁的按钮时,前端JS才会将对应变量的说明数据填充到该节点中,初始状态下节点内容为空,因此静态爬取无法拿到目标内容。
解决方法
方案1:抓取后台接口(效率更高)
- 打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR请求,点击任意变量旁的按钮,查看触发的说明数据请求,分析接口的请求参数和返回格式
- 直接用
httr包构造对应变量的接口请求,解析返回的JSON/文本数据即可,无需渲染整个页面,抓取效率远高于模拟浏览器
方案2:动态模拟浏览器操作
如果接口加密或分析难度高,可以使用R的动态爬虫工具模拟用户点击操作,等内容渲染后再提取:
# 依赖包安装:install.packages(c("chromote", "magrittr")) library(chromote) library(magrittr) # 启动无头浏览器 browser <- ChromoteSession$new() # 访问目标页面 browser$Page$navigate("https://www.theglobaleconomy.com/download-data.php") # 等待页面加载完成 Sys.sleep(3) # 示例:点击第一个经济变量对应的i按钮,可根据需求循环替换对应元素的选择器 browser$Runtime$evaluate('document.querySelectorAll(".indInfo")[0].click()') # 等待弹窗内容填充 Sys.sleep(0.5) # 提取弹窗说明文本 def_text <- browser$Runtime$evaluate( 'document.querySelector("#definitionBoxText").innerText' )$result$value print(def_text) # 关闭浏览器 browser$close()
提示:批量抓取时请控制请求间隔,遵守站点的使用规则,避免触发反爬限制。
内容的提问来源于stack exchange,提问作者deeplyr
相关产品推荐
相关产品推荐

