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

如何在R中动态提取网页指定iframe内的图表数据?

问题分析

你用httr::GET拿不到目标iframe链接,核心原因是该页面的iframe是通过JavaScript动态渲染生成的。httr只能获取服务器返回的初始静态HTML,不会执行页面中的JS代码,所以那些需要JS运行后才会出现的DOM元素(包括你要找的iframe)自然不会出现在提取的文本里。

解决方案:用动态渲染工具获取页面内容

要处理JS动态生成的内容,需要用能模拟浏览器执行JS的工具,在R里常用的有以下两种方案:

方案一:使用RSelenium(模拟真实浏览器)

RSelenium可以控制Chrome、Firefox等浏览器加载页面,等待JS执行完成后再提取DOM内容。步骤如下:

  1. 安装依赖包:
    install.packages("RSelenium")
    install.packages("rvest")
    
  2. 启动浏览器驱动(以Chrome为例,需提前安装Chrome浏览器和对应版本的ChromeDriver):
    library(RSelenium)
    library(rvest)
    
    # 启动Chrome驱动
    driver <- rsDriver(browser = "chrome", port = 4567L)
    remDr <- driver[["client"]]
    
    # 访问目标页面
    remDr$navigate("https://www.immostat.com/market-data")
    
    # 等待页面加载完成(可根据实际情况调整等待时间)
    Sys.sleep(5)
    
    # 获取渲染后的页面源码
    page_source <- remDr$getPageSource()[[1]]
    
  3. 从渲染后的源码中提取iframe链接:
    # 解析页面
    page_html <- read_html(page_source)
    
    # 定位到标题"Office Investment Prices (gross € psqm)"后的首个iframe
    iframe_node <- page_html %>%
      html_element(xpath = "//h3[text()='Office Investment Prices (gross € psqm)']/following-sibling::iframe[1]")
    
    # 提取iframe的src链接
    iframe_src <- iframe_node %>% html_attr("src")
    
  4. 下载图表数据:
    # 如果iframe里的图表是可下载的(比如CSV、Excel),可以直接请求该链接
    download.file(iframe_src, destfile = "office_prices_data.csv", mode = "wb")
    
  5. 关闭浏览器驱动:
    remDr$close()
    driver$server$stop()
    

方案二:使用chromote(轻量无头浏览器)

chromote是更轻量的无头浏览器工具,不需要单独安装浏览器驱动,步骤如下:

  1. 安装依赖包:
    install.packages("chromote")
    install.packages("rvest")
    
  2. 加载页面并获取渲染后的源码:
    library(chromote)
    library(rvest)
    
    # 创建chromote会话
    b <- ChromoteSession$new()
    
    # 访问目标页面
    b$Page$navigate("https://www.immostat.com/market-data")
    b$Page$loadEventFired() # 等待页面加载完成
    
    # 获取页面源码
    page_source <- b$Runtime$evaluate("document.documentElement.outerHTML")$result$value
    
  3. 后续提取iframe链接和下载数据的步骤和方案一一致,最后关闭会话:
    b$close()
    
注意事项
  • 确保你的Chrome浏览器版本和ChromeDriver版本匹配(RSelenium方案),否则会出现驱动启动失败的问题。
  • 部分网站可能有反爬机制,频繁请求可能会被封禁IP,建议添加适当的等待时间,避免短时间内多次请求。
  • 如果iframe中的图表是可视化组件(比如Highcharts),可能需要从页面的JS变量中提取数据,而不是直接下载链接,这时候可以用b$Runtime$evaluate()执行JS代码获取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:12:20