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

VBA网页爬取求助:无法获取目标元素数据

VBA爬取足球赛事数据:解决最后一批元素提取失败及点球结果捕获问题

Hey there! 我看你在爬取足球赛事结果时遇到了两个头疼的问题:抓不到最后一批赛事数据,还没法获取点球结果。刚好你选的示例日期(9/8/19和7/8/19)里有带点球的场次,我帮你调整下代码,解决这两个问题。

首先,你的原代码里有几个容易踩的坑:

  • 页面可能是动态加载的,只等IE的readyState不够,最后一批元素可能还没渲染出来
  • 没针对点球结果的专属元素做检测和提取
  • 用Left(Match.className, 12)判断类名太死板,万一类名有变动就会漏掉数据

下面是修改后的完整代码,我加了详细注释,你可以直接用:

Option Explicit
Sub Download_Historical_Data()
    Dim IE As InternetExplorer, doc As HTMLDocument
    Dim All_Matches As Object, Match As Object
    Dim All_Champions As Object, Champion As Object
    Dim matchDate As String, homeTeam As String, awayTeam As String
    Dim fullScore As String, penaltyScore As String
    Dim rowNum As Integer ' 记录Excel写入的行号

    ' 初始化IE浏览器
    Set IE = New InternetExplorer
    With IE
        .Visible = True
        .Navigate "https://www.scorespro.com/soccer/results/"
        ' 等待页面基础加载完成
        While .Busy Or .readyState < 4: DoEvents: Wend
        ' 额外等待2秒,确保动态渲染的赛事数据完全加载(解决最后一批元素抓不到的问题)
        Application.Wait Now + TimeValue("00:00:02")
        Set doc = .document
    End With

    ' 定位页面中所有的赛事分组(按日期/联赛划分)
    Set All_Champions = doc.getElementById("matches-data").getElementsByClassName("compgrp")
    
    ' 初始化Excel写入的起始行(假设用Sheet1,第1行放表头)
    rowNum = 2
    ' 写入表头
    Sheet1.Cells(1, 1).Value = "日期"
    Sheet1.Cells(1, 2).Value = "主队"
    Sheet1.Cells(1, 3).Value = "客队"
    Sheet1.Cells(1, 4).Value = "常规比分"
    Sheet1.Cells(1, 5).Value = "点球结果"

    ' 遍历每个赛事分组
    For Each Champion In All_Champions
        ' 获取当前分组的日期(每个compgrp下的.date标签)
        matchDate = Champion.getElementsByClassName("date").Item(0).innerText
        
        ' 获取分组内的所有赛事表格
        Set All_Matches = Champion.getElementsByTagName("table")
        For Each Match In All_Matches
            ' 用InStr判断类名,避免类名长度变化导致匹配失败
            If InStr(Match.className, "blocks gteam") > 0 Then
                With Match
                    ' 提取主队名称
                    homeTeam = .getElementsByClassName("tname-home").Item(0).innerText
                    ' 提取客队名称
                    awayTeam = .getElementsByClassName("tname-away").Item(0).innerText
                    ' 提取常规比分
                    fullScore = .getElementsByClassName("sc").Item(0).innerText
                    
                    ' 检查是否存在点球结果(页面中.pens标签存储点球数据)
                    penaltyScore = ""
                    If .getElementsByClassName("pens").Length > 0 Then
                        penaltyScore = "点球: " & .getElementsByClassName("pens").Item(0).innerText
                    End If

                    ' 将数据写入Excel
                    Sheet1.Cells(rowNum, 1).Value = matchDate
                    Sheet1.Cells(rowNum, 2).Value = homeTeam
                    Sheet1.Cells(rowNum, 3).Value = awayTeam
                    Sheet1.Cells(rowNum, 4).Value = fullScore
                    Sheet1.Cells(rowNum, 5).Value = penaltyScore

                    rowNum = rowNum + 1
                End With
            End If
        Next Match
    Next Champion

    ' 关闭IE并释放资源
    IE.Quit
    Set IE = Nothing
    MsgBox "数据爬取完成!已写入Sheet1", vbInformation
End Sub

关键修改说明:

  1. 解决最后一批元素提取失败:添加了Application.Wait额外等待2秒,确保页面动态加载的赛事数据完全渲染完成——很多动态页面不会在readyState=4时就加载完所有内容,这一步很关键
  2. 捕获点球结果:通过检测.getElementsByClassName("pens")的长度,判断是否有点球结果,并提取对应的文本
  3. 优化类名匹配:用InStr替代Left函数,避免类名长度变化导致的匹配失败,兼容性更好
  4. 增加Excel写入逻辑:直接把爬取的数据写入Excel,方便你查看结果

注意事项:

  • 确保你在VBA编辑器中已经引用了Microsoft Internet Controls和Microsoft HTML Object Library(路径:工具 -> 引用)
  • 如果后续需要爬取指定日期(比如你说的9/8/19和7/8/19)的数据,可以扩展代码,模拟点击页面上的日期选择器
  • 如果遇到反爬限制,可以尝试增加更多等待时间,或者模拟滚动页面的操作

内容的提问来源于stack exchange,提问作者Error 1004

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:54:02