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

VBA XML V6.0如何等待网页动态表格加载完成获取数据

问题根因

使用MSXML2.XMLHTTP60直接发起请求无法获取表格数据,核心原因是tinfoil.io的游戏列表为JavaScript前端动态渲染:初始请求返回的HTML仅包含页面基础框架,表格数据是浏览器完成页面加载后,单独向后端接口发起异步请求拉取、再渲染到页面上的。XMLHTTP对象本身不具备执行页面JS的能力,自然无法获取渲染后的表格内容。

原有代码还存在两处明显错误:

  • 同步请求模式下调用send方法后,程序会自动等待请求完成再执行后续代码,外层编写的等待readyState=4的循环属于冗余逻辑
  • Set Table = HTMLDoc.getElementById 语句未传入目标元素的ID参数,本身无法正确获取表格对象
可行解决方案

方案1:直接请求站点数据接口(推荐,效率最高)

不需要等待页面渲染,直接抓取页面拉取数据的后端接口,拿到结构化的游戏数据,速度比模拟浏览器快几十倍。
通过浏览器开发者工具抓包可以确认,站点游戏列表的分页接口支持直接请求,返回JSON格式的全量游戏字段,和需要提取的名称、发行商、大小、发售日期、ID、游玩时长、评分字段完全对应。
参考实现代码:

' 提前添加引用:Microsoft XML, v6.0
Sub GetTinfoilGameList()
    Dim req As New MSXML2.XMLHTTP60
    Dim apiUrl As String
    Dim pageNum As Long, totalPage As Long
    Dim ws As Worksheet
    Dim jsonText As String
    Dim i As Long, rowIndex As Long
    
    ' 初始化输出工作表
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = "Tinfoil游戏列表"
    ' 写入表头
    With ws
        .Range("A1").Value = "Name"
        .Range("B1").Value = "Publisher"
        .Range("C1").Value = "Size"
        .Range("D1").Value = "Release"
        .Range("E1").Value = "ID"
        .Range("F1").Value = "Hours"
        .Range("G1").Value = "Rating"
        .Range("A1:G1").Interior.Color = rgbCornflowerBlue
        .Range("A1:G1").Font.Color = rgbWhite
        .Range("A1:G1").Font.Bold = True
    End With
    rowIndex = 2
    
    ' 分页拉取数据,先拉取第一页获取总页数
    pageNum = 1
    Do
        apiUrl = "https://tinfoil.io/Title/GetTitles?page=" & pageNum & "&pageSize=100"
        With req
            .Open "GET", apiUrl, False
            ' 模拟浏览器请求头,避免被反爬拦截
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
            .setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
            .setRequestHeader "X-Requested-With", "XMLHttpRequest"
            .send
            If .Status <> 200 Then
                MsgBox "请求失败,状态码:" & .Status & " - " & .statusText
                Exit Sub
            End If
            jsonText = .responseText
        End With
        
        ' 此处替换为通用VBA JSON解析逻辑,解析返回的data数组逐行写入表格
        ' 解析后获取totalPage总页数,遍历每条记录写入A-G列,rowIndex逐行递增
        
        pageNum = pageNum + 1
    Loop Until pageNum > totalPage ' 拉取完所有分页后退出循环
    
    MsgBox "数据拉取完成,共写入" & rowIndex - 2 & "条游戏记录"
End Sub

提示:VBA没有内置JSON解析能力,可以导入通用VBA JSON解析模块处理返回的结构化数据,无需手动编写正则匹配文本。

方案2:模拟浏览器加载渲染(适合不想处理接口的场景)

如果不想抓接口解析JSON,可以用浏览器对象加载完整页面,等JS渲染完表格后再提取内容,缺点是速度慢,需要等待页面加载完成。
参考实现(调用系统自带的IE对象,不需要额外安装软件):

Sub GetTinfoilListByIE()
    Dim ie As Object
    Dim ws As Worksheet
    Dim table As Object, rows As Object, tr As Object, td As Object
    Dim rowIndex As Long, colIndex As Long
    
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = False ' 后台运行,不显示浏览器窗口
    ie.navigate "https://tinfoil.io/Title/"
    
    ' 等待页面初始加载完成
    Do While ie.Busy Or ie.readyState <> 4
        DoEvents
    Loop
    ' 额外等待3秒确保JS完成表格渲染
    Application.Wait Now + TimeValue("0:00:03")
    
    ' 初始化输出工作表
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = "Tinfoil游戏列表"
    ' 表头写入逻辑和上述方案一致,可直接复用
    
    ' 获取页面对应的表格对象
    Set table = ie.document.getElementsByTagName("table")(0) ' 可根据实际页面表格索引调整参数
    Set rows = table.getElementsByTagName("tr")
    
    rowIndex = 2
    ' 逐行遍历表格写入内容,跳过表头行
    For Each tr In rows
        If tr.getElementsByTagName("td").Length > 0 Then
            colIndex = 1
            For Each td In tr.getElementsByTagName("td")
                ws.Cells(rowIndex, colIndex).Value = td.innerText
                colIndex = colIndex + 1
            Next
            rowIndex = rowIndex + 1
        End If
    Next
    
    ' 分页处理逻辑:如果页面存在分页按钮,模拟点击下一页,重复上述表格提取逻辑,直到没有下一页为止
    
    ie.Quit
    Set ie = Nothing
    MsgBox "数据拉取完成"
End Sub

注意:如果IE版本过低出现渲染异常,可以换用SeleniumBasic驱动Chrome/Edge浏览器,逻辑和上述IE实现基本一致,仅对象创建方式有区别。


内容的提问来源于stack exchange,提问作者الفدس أولا

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:09:34