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

使用VBA+MSXML2.XMLHTTP60抓取联想服务器保修到期日失败求助

解决联想服务器保修信息抓取的VBA方案

问题原因

你用MSXML2.XMLHTTP60无法获取目标元素,核心原因是该页面的保修信息是JavaScript动态渲染的。XMLHTTP只能获取服务器返回的静态原始HTML,而动态加载的内容不会出现在原始响应里,导致getElementsByTagName等方法找不到目标节点。

可行解决方案

方案1:使用Internet Explorer对象(兼容动态渲染)

通过IE加载页面,等待JS执行完成后再抓取元素,这是最直接的兼容方案:

Sub GetLenovoWarranty()
    Dim IE As Object
    Dim doc As Object
    Dim warrantyRows As Object
    Dim rowElement As Object
    
    ' 初始化IE对象
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = False ' 设为True可查看加载过程
    
    ' 导航到目标页面
    IE.Navigate "https://datacentersupport.lenovo.com/kr/en/products/servers/thinksystem/sr650/7x06/7x06cto1ww/j30a7xlg/warranty"
    
    ' 等待页面完全加载(包括JS渲染)
    Do While IE.Busy Or IE.ReadyState <> 4
        DoEvents
    Loop
    
    Set doc = IE.Document
    
    ' 获取所有包含保修项的行元素
    Set warrantyRows = doc.querySelectorAll(".content-placeholder-line.content-placeholder-line--block")
    
    ' 遍历行元素,匹配保修到期日
    For Each rowElement In warrantyRows
        Dim leftArea As Object, rightArea As Object
        Set leftArea = rowElement.querySelector(".left-area")
        Set rightArea = rowElement.querySelector(".right-area")
        
        If Not leftArea Is Nothing And Not rightArea Is Nothing Then
            If Trim(leftArea.innerText) = "保修到期日" Then
                Debug.Print "保修到期日: " & Trim(rightArea.innerText)
                Exit For
            End If
        End If
    Next rowElement
    
    ' 清理资源
    IE.Quit
    Set IE = Nothing
    Set doc = Nothing
End Sub

方案2:直接抓取AJAX接口(更高效)

通过浏览器开发者工具(F12→网络→XHR)找到加载保修信息的API接口,直接请求接口获取数据,无需加载整个页面:

  1. 打开目标页面,F12切换到「网络」标签,刷新页面,筛选「XHR」类型请求
  2. 找到返回保修数据的接口(通常包含warranty、service等关键词)
  3. 复制接口URL和必要的请求头,用XMLHTTP直接请求

示例代码(需替换为实际接口信息):

Sub GetWarrantyViaAPI()
    Dim xhr As Object
    Dim jsonResponse As String
    
    Set xhr = CreateObject("MSXML2.XMLHTTP.6.0")
    ' 替换为实际的API接口URL
    xhr.Open "GET", "https://example-api.lenovo.com/warranty/query?sn=xxx", False
    
    ' 添加必要请求头,模拟浏览器请求(可从开发者工具复制)
    xhr.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"
    xhr.setRequestHeader "Referer", "https://datacentersupport.lenovo.com/kr/en/products/servers/thinksystem/sr650/7x06/7x06cto1ww/j30a7xlg/warranty"
    
    xhr.send
    
    If xhr.Status = 200 Then
        jsonResponse = xhr.responseText
        ' 推荐使用VBA-JSON库解析JSON(需导入)
        ' Dim jsonObj As Object
        ' Set jsonObj = JsonConverter.ParseJson(jsonResponse)
        ' Debug.Print "保修到期日: " & jsonObj("warrantyDetails")("endDate")
        Debug.Print "接口返回原始数据:" & jsonResponse
    Else
        Debug.Print "请求失败,状态码: " & xhr.Status
    End If
    
    Set xhr = Nothing
End Sub

额外建议

  • 如果使用方案2,需注意接口可能需要认证或携带特定参数(如设备序列号),可从浏览器请求中提取
  • 若页面结构更新,需调整方案1中的CSS选择器(.content-placeholder-line.content-placeholder-line--block等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:52:41