如何在Excel Selenium中自动循环使用CSS选择器爬取Sofascore赛事数据
解决方案
以下是优化后的VBA Selenium脚本,解决了手动编写CSS选择器的问题,通过批量获取赛事URL实现自动循环:
Sub sofascore() Dim x As New Selenium.ChromeDriver Dim i, sonsat, j, outputRow As Integer Dim matchElements As Selenium.WebElements Dim matchUrls() As String Dim ks As New Selenium.Keys ' 初始化输出行(根据你的表头位置调整) outputRow = 2 ' 配置Chrome驱动 x.SetProfile "C:\Users\Oğuzhan\AppData\Local\Google\Chrome\User Data" x.AddArgument "user-data-dir=C:\Users\xyz\AppData\Local\Google\Chrome\User Data\System Profile" x.Start "chrome", "https://www.sofascore.com/" x.Window.Maximize ' 获取A列中最后一个有链接的行 sonsat = Sheets("veri").Range("A10000").End(xlUp).Row ' 循环处理每个日期页面链接 For i = 2 To sonsat On Error Resume Next ' 导航到当前日期页面 x.Get Sheets("veri").Range("A" & i).Value If Err.Number <> 0 Then Err.Clear GoTo NextDate End If On Error GoTo 0 ' 点击"显示所有赛事"按钮(使用更简洁的选择器,若失效可替换为你原有的长选择器) On Error Resume Next x.FindElementByCss("div.hryjgv > button").Click If Err.Number <> 0 Then Err.Clear GoTo NextDate End If On Error GoTo 0 x.SendKeys ks.Home x.Wait 300 ' 等待赛事列表加载 ' 获取所有赛事链接元素 On Error Resume Next Set matchElements = x.FindElementsByCss("div.sc-hLBbgP.tYcjv.sc-cabffeca-2.loALSf > div > div:nth-child(2) > div > div > div > a") If matchElements.Count = 0 Then GoTo NextDate End If On Error GoTo 0 ' 存储所有赛事URL到数组 ReDim matchUrls(1 To matchElements.Count) For j = 1 To matchElements.Count matchUrls(j) = matchElements(j).Attribute("href") Next j ' 循环处理每个赛事页面 For j = 1 To UBound(matchUrls) x.Get matchUrls(j) x.Wait 1500 ' 等待赛事页面加载完成 ' -------------------------- ' 在这里添加你的赛事信息提取代码 ' 示例: ' Sheets("veri").Range("B" & outputRow).Value = x.FindElementByCss("赛事标题选择器").Text ' Sheets("veri").Range("C" & outputRow).Value = x.FindElementByCss("赛事比分选择器").Text ' -------------------------- ' 输出行自增 outputRow = outputRow + 1 Next j NextDate: Next i ' 清理资源 x.Quit Set x = Nothing Set ks = Nothing Set matchElements = Nothing End Sub
关键改进说明:
- 批量获取赛事URL:通过
FindElementsByCss获取所有赛事链接元素,提取它们的href属性存储到数组,避免了手动编写每个赛事的CSS选择器。 - 避免往返导航:直接通过存储的URL访问每个赛事页面,无需返回日期页面,提升了脚本效率和稳定性。
- 简化选择器:将冗长的CSS选择器替换为更简洁的版本(如
div.hryjgv > button),降低页面结构变化导致的失效风险。 - 错误处理:添加了基础错误处理,跳过无法访问的链接或加载失败的页面。
- 明确工作表引用:所有单元格操作都指定了
Sheets("veri"),避免当前工作表切换导致的错误。
注意事项:
- 若Sofascore页面结构发生变化,需要调整对应的CSS选择器。
- 数据提取部分需要根据你要获取的具体信息(如赛事名称、比分、时间等)编写对应的元素定位代码。
- 可以将固定等待时间(
x.Wait)替换为x.WaitUntil,等待特定元素加载完成,进一步提升稳定性。
内容的提问来源于stack exchange,提问作者hugomare
相关产品推荐
相关产品推荐

