使用VBA将亚马逊网页提取数据导出为JSON格式的实现问题
亚马逊抓取VBA导出JSON格式修改方案
前置修复说明
你现有代码存在两个基础问题需要先修正,避免运行报错:
- 缺失IE页面加载等待逻辑,会大概率出现页面未渲染完成就抓取数据的异常
- 代码中
html1变量未定义,属于笔误
实现方案
VBA原生没有内置JSON处理能力,简单场景下可以直接手动拼接JSON字符串,无需额外引用第三方库,适配性最高,修改后的完整代码如下:
Function EscapeJson(str As String) As String ' 转义JSON特殊字符,避免格式错误 EscapeJson = Replace(Replace(str, "\", "\\"), """", "\""") End Function Sub 亚马逊数据导出JSON() Dim Ie As Object, html As Object, fso As Object, Fileout As Object Dim pagen As String, endpage As String, jsonStr As String Set Ie = CreateObject("InternetExplorer.Application") Ie.Visible = True Ie.navigate "https://www.amazon.com/s?crid=AQO8JFH64H82&i=merchant-items&k=socks&me=A29M0OOY4LPNOT&qid=1635324852&ref=glow_cls&refresh=1&sprefix=socks%2Caps%2C315&low-price=0.1&high-price=5" ' 等待页面完全加载 Do While Ie.Busy Or Ie.readyState <> 4: DoEvents: Loop Set html = Ie.Document ' 提取数据逻辑 If html.body.innerHTML Like "*a-section a-spacing-small a-spacing-top-small*" _ And html.body.innerHTML Like "*a-pagination*" Then pagen = html.getElementsByClassName("a-section a-spacing-small a-spacing-top-small")(0).innerText pagen = Replace(pagen, "'", "") endpage = html.getElementsByClassName("a-pagination")(0).innerText ' 拼接JSON字符串 jsonStr = "{" & vbCrLf & _ " ""page_info"": """ & EscapeJson(pagen) & """," & vbCrLf & _ " ""pagination_total"": """ & EscapeJson(endpage) & """," & vbCrLf & _ " ""crawl_time"": """ & Format(Now(), "yyyy-mm-dd hh:mm:ss") & """" & vbCrLf & _ "}" End If ' 导出为JSON文件 Set fso = CreateObject("Scripting.FileSystemObject") ' 输出路径和原逻辑一致,仅修改后缀为json Set Fileout = fso.CreateTextFile("C:\Data\test" & Format(Now(), "_yyyy-mm-dd_hh-mm") & ".json", True, True) Fileout.Write jsonStr Fileout.Close ' 清理资源 Ie.Quit Set Ie = Nothing Set html = Nothing Set fso = Nothing Set Fileout = Nothing End Sub
修改点说明
- 新增了
EscapeJson工具函数,处理字符串中的特殊字符,保证生成的JSON格式合法 - 新增了页面加载等待逻辑,避免空值报错
- 把提取到的字段统一封装为标准JSON结构,你后续需要新增其他提取字段(比如商品标题、价格、ASIN等),只需要按照
""键名"": ""值""的格式补充到JSON拼接逻辑中即可 - 输出文件后缀修改为
.json,符合JSON文件规范 - 新增了资源释放逻辑,避免IE进程后台残留
内容的提问来源于stack exchange,提问作者Satti22
相关产品推荐
相关产品推荐

