VBA网页抓取问题:无法从class获取innerText,LME网站返回{{price}}而非铜价
问题原因及解决方案:LME官网抓取铜价返回{{price}}
原因分析
你遇到的{{price}}是前端模板占位符,本质原因是:
- LME官网采用JavaScript动态渲染页面,服务器返回的原始HTML仅包含页面框架和模板变量,真实价格数据是页面加载后通过AJAX请求从后端API获取,再由JS替换占位符显示。
- 你当前使用的
WinHttp.WinHttpRequest仅能获取服务器返回的静态HTML,不会执行页面中的JavaScript,因此无法得到渲染后的真实价格。
解决方法
方法1:使用IE自动化模拟浏览器渲染
通过InternetExplorer.Application控件模拟浏览器打开页面,等待JS执行完成后再提取价格,这是VBA环境下最直接的方案:
Option Explicit Sub GetLMECopperPrice() Const URL As String = "https://www.lme.com/" Const PriceClassName As String = "metal-block__price" Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") With ie .Visible = True ' 设为False可隐藏浏览器窗口 .Navigate URL ' 等待页面基础加载完成 Do While .Busy Or .ReadyState <> 4 DoEvents Loop ' 额外等待3秒确保JS完成价格渲染(可根据网络情况调整时长) Application.Wait Now + TimeValue("00:00:03") Dim priceElements As Object Set priceElements = .Document.getElementsByClassName(PriceClassName) With priceElements If .Length > 0 Then MsgBox "LME铜价:" & .Item(0).innerText Else MsgBox "未找到价格元素" End If End With .Quit End With Set ie = Nothing End Sub
方法2:直接调用LME数据API
通过浏览器开发者工具(F12 → Network标签)查找加载价格的API接口,直接请求API获取结构化数据,效率更高:
- 打开LME官网,刷新页面,在Network标签中筛选
XHR/Fetch类型请求,找到返回价格数据的接口(通常包含price、market-data等关键词)。 - 复制API地址,用WinHTTP请求接口并解析返回的JSON数据。示例代码(需先导入VBA-JSON库处理JSON):
Option Explicit Sub GetLMECopperPriceViaAPI() ' 替换为实际找到的LME价格API地址 Const API_URL As String = "https://api.lme.com/market-data/latest-prices" Dim whr As Object Set whr = CreateObject("WinHttp.WinHttpRequest.5.1") With whr .Open "GET", API_URL, False ' 添加请求头模拟浏览器,避免被拦截 .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" .send ' 解析JSON数据(需导入VBA-JSON库) Dim jsonResp As Object Set jsonResp = JsonConverter.ParseJson(.responseText) ' 根据API返回的JSON结构提取铜价,示例路径需根据实际调整 Dim copperPrice As String copperPrice = jsonResp("metals")("copper")("last") MsgBox "LME铜价:" & copperPrice End With Set whr = Nothing End Sub
注意事项
- IE自动化方式可能因浏览器版本、网站反爬策略失效,且执行速度较慢。
- API接口可能随时变更,需定期验证有效性;部分API可能需要特定请求头或身份验证,需根据实际情况调整。
- 请严格遵守LME官网的使用条款,避免高频抓取触发反爬机制。
内容的提问来源于stack exchange,提问作者Piotr Połetek
相关产品推荐
相关产品推荐

