使用VBA导入Yahoo Finance股票数据失效问题求助
Yahoo Finance股票价格导入Excel的VBA失效解决方案
问题分析
原代码依赖的Crumb验证机制在2024年9月24日失效,请求返回内容为不完整的HTML片段(如e html> <ht),导致无法提取有效Crumb,后续数据处理环节触发报错。核心原因是Yahoo Finance更新了反爬策略或页面结构,原有的固定位置截取11位Crumb的逻辑已不再适用。
修改后的解决方案代码
Sub getCookieCrumb(crumb As String, cookie As String, validCookieCrumb As Boolean) Dim i As Integer Dim objRequest As Object Dim regex As Object Dim matches As Object validCookieCrumb = False Set regex = CreateObject("VBScript.RegExp") regex.Pattern = """crumb"":""([^""]+)""" ' 正则匹配Crumb字段 regex.Global = False For i = 0 To 5 Set objRequest = CreateObject("WinHttp.WinHttpRequest.5.1") With objRequest .Open "GET", "https://finance.yahoo.com/quote/AAPL/history?period1=1503558000&period2=1535094000&interval=1wk&filter=history&frequency=1wk", False ' 添加模拟浏览器的请求头,规避反爬拦截 .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" .SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8" .SetRequestHeader "Accept-Language", "zh-CN,zh;q=0.9" .SetRequestHeader "Upgrade-Insecure-Requests", "1" .send .WaitForResponse 10 ' 从响应头提取Cookie cookie = .GetResponseHeader("Set-Cookie") ' 用正则表达式匹配页面中的Crumb Set matches = regex.Execute(.ResponseText) If matches.Count > 0 Then crumb = matches(0).SubMatches(0) ' 验证Crumb有效性(当前Yahoo的Crumb长度不再固定为11位) If Len(crumb) > 0 Then validCookieCrumb = True Exit For End If End If End With Next i ' 释放对象 Set objRequest = Nothing Set regex = Nothing Set matches = Nothing End Sub
关键修改点说明
- 模拟浏览器请求:添加
User-Agent等请求头,避免被Yahoo的反爬系统识别为非浏览器请求,解决返回不完整HTML的问题。 - 正则匹配Crumb:改用正则表达式匹配
"crumb":"..."格式的字段,相比固定位置截取,更适配页面结构的变化。 - Cookie提取:完善Cookie的获取逻辑,确保后续请求能携带有效验证信息。
注意事项
- 若仍出现拦截,可更新
User-Agent为当前主流浏览器的最新标识(可通过浏览器开发者工具查看)。 - Yahoo Finance的反爬策略可能持续更新,若此方法再次失效,需重新分析页面结构或考虑使用官方API(需注意官方API可能需要申请密钥)。
- 确保VBA编辑器中已启用
WinHttp.WinHttpRequest.5.1组件(路径:工具→引用→勾选对应组件)。
内容的提问来源于stack exchange,提问作者MaxF
相关产品推荐
相关产品推荐

