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

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获取结构化数据,效率更高:

  1. 打开LME官网,刷新页面,在Network标签中筛选XHR/Fetch类型请求,找到返回价格数据的接口(通常包含price、market-data等关键词)。
  2. 复制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:57:38