VBA网页抓取压缩弹簧表格仅读取首行(表头)问题求助
解决VBA抓取Lee Spring压缩弹簧表格仅获取表头的问题
你当前代码用MSXML2.XMLHTTP获取的是页面静态HTML,但该网站的表格数据是动态加载的——静态源码里只有表头,数据行是页面加载后通过JavaScript异步拉取并渲染的,所以只能读到首行表头。以下是两种可行的解决方案:
方案1:模拟浏览器加载页面(适合新手)
使用InternetExplorer.Application对象模拟浏览器完整加载页面,等待数据渲染完成后再抓取表格内容,代码如下:
Sub GetLeeSpringData() Const URL = "https://www.leespring.com/compression-springs" Dim IE As Object Dim HTMLDoc As Object Dim tbl As Object Dim tr As Object, td As Object Dim r As Long, c As Long ' 创建IE对象 Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True ' 调试时可设为True显示浏览器,完成后改为False隐藏 IE.Navigate URL ' 等待页面加载完成(包括动态数据) Do While IE.Busy Or IE.ReadyState <> 4 DoEvents Loop ' 额外等待3秒确保数据完全渲染(可根据网速调整时长) Application.Wait Now + TimeValue("00:00:03") Set HTMLDoc = IE.Document ' 定位目标表格 Set tbl = HTMLDoc.getElementsByClassName("cols-27") If tbl.Length = 0 Then MsgBox "未找到目标表格", vbExclamation IE.Quit Set IE = Nothing Exit Sub End If ' 写入Excel工作表 r = 1 For Each tr In tbl(0).Rows c = 1 For Each td In tr.Cells ThisWorkbook.ActiveSheet.Cells(r, c).Value = td.innerText c = c + 1 Next td r = r + 1 Next tr ' 清理资源 IE.Quit Set IE = Nothing Set HTMLDoc = Nothing Set tbl = Nothing MsgBox "数据抓取完成", vbInformation End Sub
代码说明:
IE.Visible:控制浏览器是否显示,调试时开启方便观察加载状态Application.Wait:额外等待确保动态数据渲染完毕,可根据实际网速调整时长- 明确指定
ThisWorkbook.ActiveSheet写入数据,避免默认引用错误
方案2:直接调用数据API(高效推荐)
通过浏览器开发者工具找到网站加载表格数据的API接口,直接请求JSON格式数据并解析,无需模拟浏览器,速度更快。
操作步骤:
- 打开目标页面,按F12打开开发者工具
- 切换到「网络」标签,刷新页面,筛选「XHR」类型请求
- 找到返回表格数据的API请求(URL通常包含
api、data等关键词) - 复制该API的请求URL,替换到下面的示例代码中
示例代码(需替换为实际API地址):
Sub GetLeeSpringDataViaAPI() Const API_URL = "替换为实际找到的API接口地址" Dim http As Object Dim jsonObj As Object Dim dataArr As Variant Dim i As Long, j As Long Dim headers As Variant Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", API_URL, False http.send ' 解析JSON(需先导入VBA-JSON库,可在GitHub下载) Set jsonObj = JsonConverter.ParseJson(http.responseText) ' 以下需根据API返回的JSON结构调整,示例为通用结构 headers = jsonObj("headers") dataArr = jsonObj("data") ' 写入表头 For j = LBound(headers) To UBound(headers) ThisWorkbook.ActiveSheet.Cells(1, j + 1).Value = headers(j) Next j ' 写入数据行 For i = LBound(dataArr) To UBound(dataArr) For j = LBound(dataArr(i)) To UBound(dataArr(i)) ThisWorkbook.ActiveSheet.Cells(i + 2, j + 1).Value = dataArr(i)(j) Next j Next i ' 清理资源 Set http = Nothing Set jsonObj = Nothing MsgBox "API数据抓取完成", vbInformation End Sub
注意:
- 解析JSON需要安装VBA-JSON库,或手动编写JSON解析逻辑
- API接口可能存在请求头、参数或分页限制,需根据实际请求情况调整代码
内容的提问来源于stack exchange,提问作者User123
相关产品推荐
相关产品推荐

