使用WINHTTP抓取Google Finance公司名至Excel失败,求技术支持
解决VBA调用WINHTTP抓取Google Finance公司名称失败的问题
嘿,我来帮你搞定这个问题!你的VBA代码没法正常抓取Google Finance的公司名称,大概率是踩了几个常见的坑——比如Google的页面结构变了、请求被反爬机制拦截,或者错误处理没做好。咱们一步步来修复:
先说说你的代码为啥失效
- 页面结构变了:你用的
appbar-snippet-primary类名早就被Google换掉了,现在的Finance页面元素结构和旧版完全不一样; - 请求被拦截:直接裸发WINHTTP请求,没带任何浏览器标识,Google会把它当成机器人,返回的内容要么不对,要么直接拒绝;
- 没做错误处理:只要某一个股票代码请求失败,或者找不到目标元素,整个循环直接崩掉,后面的都没法执行;
- URL过时了:旧的
https://finance.google.com/finance?q=XXX已经重定向到新的格式,直接用旧URL可能拿不到正确页面。
修正后的可用代码
Sub get_company_name() Dim oHtml As HTMLDocument Dim oElement As Object Dim i As Integer Dim httpReq As Object Dim targetUrl As String Dim responseText As String ' 初始化HTML文档对象 Set oHtml = New HTMLDocument ' 初始化WINHTTP请求对象 Set httpReq = CreateObject("WINHTTP.WinHTTPRequest.5.1") For i = 0 To 29 On Error Resume Next ' 临时开启错误处理,避免单个请求失败中断整个循环 Dim ticker As String ticker = Trim(Range("A32").Offset(i, 0).Value) ' 跳过空的股票代码单元格 If ticker = "" Then Range("H32").Offset(i, 0).Value = "无股票代码" On Error GoTo 0 Continue For End If ' 使用Google Finance当前的标准URL格式 targetUrl = "https://www.google.com/finance/quote/" & ticker With httpReq ' 添加请求头模拟浏览器,避免被反爬拦截 .Open "GET", targetUrl, False .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" .SetRequestHeader "Accept-Language", "en-US,en;q=0.9" .send ' 检查请求是否成功 If .Status <> 200 Then Range("H32").Offset(i, 0).Value = "请求失败,状态码:" & .Status On Error GoTo 0 Continue For End If responseText = .responseText End With ' 将响应内容加载到HTML文档中解析 oHtml.body.innerHTML = responseText ' 用当前页面的元素选择器获取公司名称(h1标签带data-testid="quote-name"属性) Set oElement = oHtml.querySelector("h1[data-testid=""quote-name""]") If Not oElement Is Nothing Then Range("H32").Offset(i, 0).Value = oElement.innerText Else ' 找不到元素时标记提示 Range("H32").Offset(i, 0).Value = "未找到公司名称" End If ' 关闭错误处理 On Error GoTo 0 ' 加1秒延迟,避免请求太频繁被限制 Application.Wait Now + TimeValue("00:00:01") Next i ' 释放对象,避免内存占用 Set httpReq = Nothing Set oHtml = Nothing MsgBox "抓取完成!" End Sub
代码改进的关键点
- 更新了URL:换成Google Finance现在在用的
https://www.google.com/finance/quote/[股票代码],确保请求到正确页面; - 添加了请求头:通过
User-Agent模拟Chrome浏览器请求,让Google认为这是正常用户访问; - 完善了错误处理:跳过空单元格、捕获请求失败、处理元素找不到的情况,保证循环能完整执行;
- 更新了元素选择器:用当前页面中对应公司名称的选择器
h1[data-testid="quote-name"],替代过时的类名; - 加了请求延迟:每次请求后等1秒,降低被Google限制访问的概率;
- 释放了对象:最后清空HTTP和HTML对象,避免内存泄漏。
额外注意事项
- 记得在VBA编辑器里引用
Microsoft HTML Object Library(路径:工具 → 引用 → 勾选这个选项),不然HTMLDocument对象没法用; - Google的页面结构可能随时变,如果以后代码又失效了,需要重新用浏览器的开发者工具查看元素选择器;
- 如果要抓大量股票,建议延长延迟时间或者分批次抓取,别一次性发太多请求;
- 有些股票代码需要加交易所后缀(比如
AAPL:NASDAQ),才能准确找到对应公司。
内容的提问来源于stack exchange,提问作者Daniel karlsson
相关产品推荐
相关产品推荐

