使用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




