Excel VBA通过CreateObject无法获取Yahoo Finance股价求助
解决Yahoo Finance VBA爬虫返回内容不可用的问题
核心原因
Yahoo Finance目前会拦截无真实浏览器标识的请求,MSXML2.XMLHTTP默认发送的请求头未模拟人类浏览器特征,被判定为非正常访问,因此返回拦截页面。
具体修复方案
1. 补充模拟浏览器的请求头
在发送请求前添加符合真实浏览器的请求头,核心是User-Agent,可额外补充其他常见头信息,让请求更贴近正常访问:
Dim xmlHttp As Object Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0") '推荐使用6.0版本,兼容性更佳 xmlHttp.Open "GET", "你的Yahoo Finance目标URL", False '添加关键请求头 xmlHttp.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" xmlHttp.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" xmlHttp.setRequestHeader "Accept-Language", "en-GB,en;q=0.5" '匹配英国地区访问特征 xmlHttp.send
2. 替换为WinHTTP组件
若MSXML2.XMLHTTP仍被拦截,可尝试使用WinHttp.WinHttpRequest.5.1,它的请求特征与前者不同,可能绕过拦截:
Dim winHttp As Object Set winHttp = CreateObject("WinHttp.WinHttpRequest.5.1") winHttp.Open "GET", "你的Yahoo Finance目标URL", False winHttp.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" winHttp.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" winHttp.send '获取响应内容 Dim responseHtml As String responseHtml = winHttp.responseText
3. 添加浏览器Cookie
手动访问Yahoo Finance时,浏览器会保存对应Cookie,可抓取一次浏览器请求的Cookie值,添加到请求头中:
xmlHttp.setRequestHeader "Cookie", "此处填入你手动抓取的Cookie内容"
注意Cookie存在过期时间,需要定期更新。
4. 控制请求频率
如果是批量爬取数据,添加随机延迟避免被判定为爬虫:
'随机延迟2-5秒 Application.Wait Now + TimeSerial(0, 0, Int((5 - 2 + 1) * Rnd + 2))
验证方式
发送请求后,先输出responseText的前几百字符,确认是否返回正常页面内容,再进行股价、分析师评级等数据的解析。
内容的提问来源于stack exchange,提问作者TheTerribleProgrammer
相关产品推荐
相关产品推荐

