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

如何在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

关键改进说明:

  1. 批量获取赛事URL:通过FindElementsByCss获取所有赛事链接元素,提取它们的href属性存储到数组,避免了手动编写每个赛事的CSS选择器。
  2. 避免往返导航:直接通过存储的URL访问每个赛事页面,无需返回日期页面,提升了脚本效率和稳定性。
  3. 简化选择器:将冗长的CSS选择器替换为更简洁的版本(如div.hryjgv > button),降低页面结构变化导致的失效风险。
  4. 错误处理:添加了基础错误处理,跳过无法访问的链接或加载失败的页面。
  5. 明确工作表引用:所有单元格操作都指定了Sheets("veri"),避免当前工作表切换导致的错误。

注意事项:

  • 若Sofascore页面结构发生变化,需要调整对应的CSS选择器。
  • 数据提取部分需要根据你要获取的具体信息(如赛事名称、比分、时间等)编写对应的元素定位代码。
  • 可以将固定等待时间(x.Wait)替换为x.WaitUntil,等待特定元素加载完成,进一步提升稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:32:17