Mac端Excel VBA获取Yahoo Finance数据WebQuery报错及406问题咨询
问题解答
问题1:Mac端Excel WebQuery方案不稳定报1004错误
- 首先确认:Mac版Excel的原生WebQuery功能不支持自定义请求头、Cookie参数,你的猜测是正确的,报错的核心原因就是请求未携带雅虎接口要求的有效cookie和crumb参数。
- 时好时坏的原因是:如果你的本地浏览器近期访问过雅虎财经,系统临时缓存的Cookie可能会被WebQuery复用,此时请求可正常通过,缓存过期后就会触发1004错误。
- 结论:WebQuery没有添加自定义Cookie的官方支持,无法通过该方案彻底规避报错,建议直接使用VBA-Web工具实现请求。
问题2:VBA-Web请求返回406错误
- 406错误的本质是服务端无法匹配请求头中
Accept字段指定的返回格式,你的代码有三处错误触发了该问题:- 你设置了
request.Format = PlainText,VBA-Web会自动给请求添加Accept: text/plain的头,但雅虎财经下载接口返回的是CSV格式,不接受text/plain的格式要求。 - Cookie设置方法错误:VBA-Web的
AddCookie方法第一个参数是单条Cookie的键名,你直接传入"Cookie"作为键名相当于添加了一个名为Cookie的无效Cookie,没有正确把完整Cookie字符串放到请求头中。 - 用法错误:你把完整带参数的请求URL赋值给了
client.BaseUrl,不符合VBA-Web的使用规范,可能导致URL解析异常。
- 你设置了
修复后的Mac端代码片段
#If Mac Then Dim client As New WebClient Dim response As WebResponse Dim request As New WebRequest ' 完整请求URL直接赋值给Resource,不要放BaseUrl request.Resource = tickerURL request.Method = HttpGet ' 手动指定Accept头,兼容CSV返回格式 request.AddHeader "Accept", "text/csv, */*;q=0.9" ' 用AddHeader方法添加完整Cookie字符串,不要用AddCookie request.AddHeader "Cookie", cookie ' 替换为Mac平台的UA,降低被拦截概率 request.AddHeader "User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" Set response = client.Execute(request) DoEvents If response.StatusCode = Ok Then resultFromYahoo = response.Content Else MsgBox "获取" & stockTicker & "数据时出错,错误码:" & response.StatusCode, vbInformation Exit Sub End If #End If
额外注意事项
- 每次批量拉取数据前,先重新获取最新的Cookie和Crumb,避免参数过期导致请求失败
- 不要高频发送请求,雅虎接口有频率限制,连续请求过多会触发临时封禁。
内容的提问来源于stack exchange,提问作者Andrey Ampilogov
相关产品推荐
相关产品推荐

