使用VBA获取Axie网站网页元素无法返回正确结果求助
VBA抓取Axie网站基因数据代码问题排查及修正
原代码核心问题
- 异步请求未等待响应完成:
WinHttpRequest.Open第三个参数设为True代表异步发送请求,代码执行到send后不会等待服务器返回结果,直接读取responseText只能拿到空值或不完整内容 - 调用了不存在的DOM方法:
MSHTML.HTMLDocument对象没有FindElementByClass方法,该方法属于Selenium类库,原生HTML文档查询类名元素要使用getElementsByClassName - 返回值逻辑错误:原代码最后返回的是整个HTML文档的文本,而非指定类名元素内的目标内容
- 缺少必要的状态校验:没有校验HTTP请求响应状态,请求出错的情况下无法定位问题
修正后的代码
Function scrape2(id As String) As String On Error GoTo ErrHandler Dim objhttp1 As WinHttp.WinHttpRequest Dim doc1 As MSHTML.HTMLDocument Dim targetNodes As Object, node As Object, resultText As String ' 初始化请求对象,使用同步请求 Set objhttp1 = New WinHttp.WinHttpRequest objhttp1.Open "GET", "https://www.axie.tech/axie-pricing/" & id, False ' 第三个参数设为False启用同步 objhttp1.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" objhttp1.send ' 校验请求是否成功 If objhttp1.Status <> 200 Then scrape2 = "请求失败,状态码:" & objhttp1.Status Exit Function End If ' 解析HTML Set doc1 = New MSHTML.HTMLDocument doc1.body.innerHTML = objhttp1.responseText ' 查询目标类名元素 Set targetNodes = doc1.getElementsByClassName("axie-pricing_decodedGenesCapsule__m9R-C") If targetNodes.Length = 0 Then scrape2 = "未找到目标元素" Exit Function End If ' 拼接元素内的文本内容 For Each node In targetNodes resultText = resultText & node.innerText & vbCrLf Next ' 去掉末尾多余换行 scrape2 = Left(resultText, Len(resultText) - 2) Exit Function ErrHandler: scrape2 = "运行出错:" & Err.Description End Function
使用说明
调用时传入参数373595即可返回你预期的基因列表内容,使用前请确保你已经在VBA编辑器的「工具-引用」中勾选了「Microsoft WinHTTP Services, version 5.1」和「Microsoft HTML Object Library」两个依赖。
内容的提问来源于stack exchange,提问作者Benjamin Paraski
相关产品推荐
相关产品推荐

