VBA网页爬取问题:无法获取Crate&Barrel沙发页面产品信息
问题原因
你遇到的问题是因为目标网站属于动态渲染的单页应用:直接用MSXML2.XMLHTTP请求获取的是页面的初始静态HTML,产品数据并没有包含在其中,而是页面加载完成后通过JavaScript调用后端API动态加载的。所以你解析初始HTML自然找不到任何产品相关的元素。
解决方案
要正确获取数据,需要:
- 找到网站加载产品数据的真实API接口;
- 直接请求该API获取JSON格式的原始数据;
- 解析JSON数据提取所需字段。
步骤1:定位API接口
用浏览器打开目标页面,按F12打开开发者工具,切换到Network标签页,刷新页面后,在XHR/Fetch请求中查找包含产品数据的请求。你会发现类似这样的API接口(实际以抓包结果为准):https://www.crateandbarrel.me/en-ae/api/search/products?query=sofas&page=1&pageSize=48&sort=featured
这个接口返回的是JSON格式的产品列表,包含你需要的名称、SKU、价格等所有字段。
步骤2:使用VBA请求API并解析JSON
首先需要导入VBA-JSON库(下载后导入到VBA项目即可),然后编写以下代码:
Sub ScrapeSofaData() Dim http As New MSXML2.XMLHTTP60 Dim jsonObject As Object Dim products As Variant Dim product As Variant Dim r As Integer ' API接口(以实际抓包结果为准,可调整分页、排序参数) Dim apiUrl As String apiUrl = "https://www.crateandbarrel.me/en-ae/api/search/products?query=sofas&page=1&pageSize=48&sort=featured" ' 发送请求,模拟浏览器请求头 With http .Open "GET", apiUrl, 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 End With ' 解析JSON Set jsonObject = JsonConverter.ParseJson(http.responseText) Set products = jsonObject("products") ' 写入Excel r = 2 ' 表头 Range("A1").Value = "产品名称" Range("B1").Value = "SKU编号" Range("C1").Value = "新价格" Range("D1").Value = "旧价格" For Each product In products ' 提取产品名称 Range("A" & r).Value = product("name") ' 提取SKU Range("B" & r).Value = product("sku") ' 提取新价格(当前售价) Range("C" & r).Value = product("price")("current") ' 提取旧价格(原价,仅促销产品存在) If product("price").Exists("original") Then Range("D" & r).Value = product("price")("original") Else Range("D" & r).Value = "" End If r = r + 1 Next product MsgBox "数据抓取完成!" End Sub
注意事项
- 不同页面的API参数(如分页
page、每页数量pageSize)可能不同,需根据需求调整; - 部分网站会限制请求频率,避免短时间内发送大量请求;
- 如果API需要验证信息(如Token),需在请求头中添加对应字段(可通过抓包获取)。
内容的提问来源于stack exchange,提问作者Nooh_Noah
相关产品推荐
相关产品推荐

