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

如何用Microsoft.XMLHTTP结合VBA实现页面滚动并抓取全部事件?

解决滚动加载页面的VBA全量数据抓取问题

你当前使用Microsoft.XMLHTTP的方式只能获取页面初始渲染的静态HTML,而目标网页的事件是通过滚动触发JavaScript动态加载的,因此必须借助浏览器自动化来模拟手动滚动的行为,才能抓取全部30余条事件。以下是具体实现方案:

核心思路

  1. 使用系统自带的Internet Explorer对象模拟浏览器操作,支持执行JS和滚动页面
  2. 循环滚动至页面底部,等待新内容加载完成
  3. 检测页面滚动高度是否不再变化,判断是否已加载全部内容
  4. 抓取所有事件元素并输出到本地文件

完整VBA代码

Sub ScrapeAllEvents()
    Dim ie As Object
    Dim lastScrollHeight As Long
    Dim currentScrollHeight As Long
    Dim eventItems As Object
    Dim i As Integer
    Dim outputFile As Integer
    
    ' 初始化IE浏览器(Visible设为False可后台运行)
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.Navigate "https://www.meetup.com/cflfreethought/events/"
    
    ' 等待页面初始加载完成
    Do While ie.Busy Or ie.ReadyState <> 4
        DoEvents
    Loop
    
    ' 循环滚动加载所有内容
    lastScrollHeight = ie.document.body.scrollHeight
    Do
        ' 滚动到当前页面底部
        ie.document.parentWindow.scrollTo 0, ie.document.body.scrollHeight
        ' 等待新内容加载(可根据网络速度调整等待时长)
        Application.Wait Now + TimeValue("00:00:02")
        ' 获取最新的页面滚动高度
        currentScrollHeight = ie.document.body.scrollHeight
        
        ' 滚动高度不再变化,说明已加载全部内容,退出循环
        If currentScrollHeight = lastScrollHeight Then
            Exit Do
        End If
        lastScrollHeight = currentScrollHeight
    Loop
    
    ' 获取所有事件元素(请根据页面实际元素结构调整选择器)
    Set eventItems = ie.document.getElementsByClassName("eventCard--link")
    
    ' 写入事件内容到本地文件
    outputFile = FreeFile
    Open "C:\Users\Brooks\Desktop\All_Events.txt" For Output As #outputFile
    For i = 0 To eventItems.Length - 1
        Print #outputFile, "事件" & i + 1 & vbCrLf & eventItems(i).innerText & vbCrLf & "-------------------------"
    Next i
    
    ' 清理资源
    Close #outputFile
    ie.Quit
    Set ie = Nothing
    Set eventItems = Nothing
    
    MsgBox "所有事件抓取完成!"
End Sub

关键说明

  • 元素选择器调整:代码中使用getElementsByClassName("eventCard--link")获取事件元素,你需要打开目标网页的开发者工具(F12),确认实际事件容器的类名或标签名,替换成对应的值
  • 等待时长调整:Application.Wait的等待时间可根据网络速度修改,比如加载较慢时改为00:00:03
  • 后台运行:将ie.Visible = True改为False即可实现后台抓取,无需显示浏览器窗口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:40:07