You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Excel VBA+XML爬取Newegg商品价格时遇运行时错误91求助

解决XMLHTTP爬取Newegg时的运行时错误91

问题根源

你遇到的运行时错误91,本质是HTMLDoc.getElementsByClassName("price-current")(0)返回了Nothing——也就是XMLHTTP请求获取到的页面内容里,根本没有这个类名的元素。这是因为Newegg的服务器会检测请求来源:IE会自动带上浏览器专属的请求头,被识别为正常用户;而XMLHTTP默认的请求头非常简单,会被服务器判定为自动化爬虫,返回的是经过反爬处理的页面(比如缺失核心商品内容的页面),自然找不到目标价格元素。

修复方案

我们需要给XMLHTTP请求添加模拟浏览器的请求头,让服务器返回正常的商品页面,同时修正HTML文档的加载方式。下面是修改后的可运行代码:

Sub testxml()
    Dim XMLPage As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    
    ' 初始化请求并添加浏览器伪装请求头
    XMLPage.Open "GET", "https://www.newegg.com/Product/Product.aspx?item=1TS-000E-083F2", False
    ' 模拟Chrome浏览器的User-Agent(可根据当前浏览器版本更新)
    XMLPage.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"
    ' 补充常见请求头,增强伪装度
    XMLPage.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    XMLPage.setRequestHeader "Accept-Language", "en-US,en;q=0.5"
    
    XMLPage.send
    
    ' 正确加载响应内容到HTML文档(比直接赋值body.innerHTML更可靠)
    HTMLDoc.Open
    HTMLDoc.Write XMLPage.responseText
    HTMLDoc.Close
    
    ' 增加元素存在性检查,避免再次触发错误91
    Dim priceContainer As Object
    Set priceContainer = HTMLDoc.getElementsByClassName("price-current")(0)
    
    If Not priceContainer Is Nothing Then
        If priceContainer.Children.Length > 1 Then
            Debug.Print priceContainer.Children(1).innerText
        Else
            Debug.Print "未找到价格子元素"
        End If
    Else
        Debug.Print "未找到price-current容器元素"
    End If
End Sub

关键修改说明

  • 添加请求头:通过setRequestHeader添加User-Agent等字段,让服务器认为这是浏览器发起的正常请求,从而返回完整的商品页面。
  • 优化HTML加载方式:使用HTMLDoc.Open+Write+Close的流程加载响应内容,能确保HTML结构被正确解析,避免直接赋值body.innerHTML可能导致的结构异常。
  • 增加安全检查:在访问元素属性前先判断元素是否存在,既避免报错,也方便调试定位问题。

额外注意事项

  • Newegg的反爬策略可能会更新,如果后续再次出现类似问题,可以尝试更新User-Agent为最新的浏览器标识,或者添加Referer等更多请求头。
  • 不要短时间内频繁发送请求,避免被服务器封禁IP。

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

火山引擎 最新活动