You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:10:58