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
关键修改说明:
- 解决最后一批元素提取失败:添加了
Application.Wait额外等待2秒,确保页面动态加载的赛事数据完全渲染完成——很多动态页面不会在readyState=4时就加载完所有内容,这一步很关键 - 捕获点球结果:通过检测
.getElementsByClassName("pens")的长度,判断是否有点球结果,并提取对应的文本 - 优化类名匹配:用
InStr替代Left函数,避免类名长度变化导致的匹配失败,兼容性更好 - 增加Excel写入逻辑:直接把爬取的数据写入Excel,方便你查看结果
注意事项:
- 确保你在VBA编辑器中已经引用了Microsoft Internet Controls和Microsoft HTML Object Library(路径:工具 -> 引用)
- 如果后续需要爬取指定日期(比如你说的9/8/19和7/8/19)的数据,可以扩展代码,模拟点击页面上的日期选择器
- 如果遇到反爬限制,可以尝试增加更多等待时间,或者模拟滚动页面的操作
内容的提问来源于stack exchange,提问作者Error 1004
相关产品推荐
相关产品推荐

