R脚本与Excel无法读取CME原油期货网页表格问题求助
问题分析与解决办法
嘿,你的问题我太熟悉了——目标网页的表格是靠JavaScript动态渲染出来的,而你用的XML和RCurl只能抓取页面的静态源码,根本看不到JS加载后的表格内容,所以才会返回NULL。Excel Power Query直接打开链接也是同样的问题,它默认只抓静态内容,不会执行网页里的JS。
一、先搞定R脚本的问题
推荐用支持动态页面抓取的工具,给你两个靠谱的方案:
方案1:用RSelenium模拟真实浏览器
这个方法会真的打开浏览器加载页面,确保所有动态内容都渲染完成,步骤如下:
library(RSelenium) library(rvest) # 启动Chrome浏览器驱动(注意要下载和你Chrome版本匹配的ChromeDriver) driver <- rsDriver(browser = "chrome", chromever = "你的Chrome版本号,比如114.0.5735.90") remDr <- driver[["client"]] # 访问目标页面 remDr$navigate("http://www.cmegroup.com/trading/energy/crude-oil/west-texas-intermediate-wti-crude-oil-calendar-swap-futures_quotes_settlements_futures.html") # 等5秒让页面加载完全(如果页面加载慢可以延长时间) Sys.sleep(5) # 获取渲染后的页面源码,提取表格 page_source <- remDr$getPageSource()[[1]] tables <- read_html(page_source) %>% html_table(fill = TRUE) # 找到行数最多的那个表格(就是你要的结算数据) target_table <- tables[[which.max(sapply(tables, nrow))]] # 用完记得关掉浏览器和驱动 remDr$close() driver$server$stop() # 查看结果 print(target_table)
方案2:直接调用CME的API(更高效)
其实CME的很多数据都有公开的API接口,不用费劲抓页面。你可以自己找一下:打开浏览器的开发者工具(按F12),切换到「Network」标签,刷新页面后筛选「XHR」类型的请求,找到返回结算数据的那个请求,复制它的URL,然后用httr直接请求:
library(httr) library(jsonlite) # 替换成你找到的真实API地址 api_url <- "这里填你在开发者工具里找到的API链接" # 模拟浏览器请求头,避免被拦截 response <- GET(api_url, add_headers("User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")) data <- fromJSON(content(response, "text")) # 把JSON转成数据框 df <- as.data.frame(data) print(df)
二、实现Excel每日自动更新的办法
给你两个可行的思路:
方法1:Power Query + VBA模拟浏览器
Power Query本身不支持JS渲染,但可以用VBA调用Selenium加载页面,把数据导入Excel,再设置定时刷新:
- 先下载Selenium的VBA驱动,添加到Excel的VBA引用里;
- 写VBA脚本模拟浏览器打开页面、提取表格数据到工作表;
- 用Windows任务计划定时触发Excel文件的宏,实现每日自动更新。
方法2:Power Query直接请求API
如果找到了CME的API接口,直接在Power Query里新建「从Web」请求,输入API地址,加载数据后,设置Excel的「刷新全部」定时任务就行,这个方法更高效,不用模拟浏览器。
最后说下你原代码的问题
你用getURL拿到的只是页面的静态HTML源码,而目标页面的表格是页面加载完成后,通过JavaScript从后端拉取数据再渲染出来的,静态源码里根本没有表格内容,所以readHTMLTable找不到任何表格,自然返回NULL啦。
内容的提问来源于stack exchange,提问作者Bunty
相关产品推荐
相关产品推荐

