实用脚本统计SofaScore综合评分?

wen 实用脚本 2

告别手动统计!3个实用脚本,一键搞定SofaScore综合评分(附Python代码)

目录导读

  1. 为什么你需要SofaScore评分自动化脚本?
  2. Python + Requests库(适合新手,无需浏览器)
  3. Selenium模拟登录(解决动态加载与反爬)
  4. API接口直连(进阶玩家的高效选择)
  5. 常见问题QA(Q1-Q5)
  6. 如何选择最适合你的脚本方案?

为什么你需要SofaScore评分自动化脚本?

SofaScore作为全球领先的体育数据平台,其综合评分(由进攻、防守、技术、体能等30+维度加权计算)是球迷、分析师和竞彩玩家判断球员/球队状态的核心指标,手动从网页复制上百名球员评分到Excel,耗时超30分钟/场,且容易漏行错位,本文提供的3个实用脚本,可将此过程压缩到10秒内,并自动生成CSV表格。

实用脚本统计SofaScore综合评分?


Python + Requests库(适合新手,无需浏览器)

核心逻辑:SofaScore的网页数据通过JSON接口异步加载,直接解析https://www.sofascore.com/api/v1/event/{event_id}/lineups即可获取球员评分。

实用脚本(可直接运行)

import requests
import csv
import time
def get_sofascore_ratings(event_id):
    url = f"https://www.sofascore.com/api/v1/event/{event_id}/lineups"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'application/json'
    }
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        data = resp.json()
        players = []
        for team in data.get('lineups', []):
            for player in team.get('players', []):
                if player.get('statistics'):
                    players.append({
                        'team': team.get('name'),
                        'player': player.get('name'),
                        'rating': player['statistics'][0].get('rating', 0)
                    })
        return players
    except Exception as e:
        print(f"请求失败: {e}")
        return []
if __name__ == "__main__":
    event_id = 123456  # 替换为你的比赛ID(浏览器地址栏可查)
    result = get_sofascore_ratings(event_id)
    if result:
        with open('sofascore_ratings.csv', 'w', newline='', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=['team', 'player', 'rating'])
            writer.writeheader()
            writer.writerows(result)
        print(f"已保存 {len(result)} 名球员评分")

注意:比赛结束后,评分会短暂保留在接口中,建议赛后1小时内抓取。


Selenium模拟登录(解决动态加载与反爬)

场景:SofaScore对高频请求会触发人机验证(如Cloudflare),此时需用Selenium模拟真实浏览器滚动页面触发数据加载。

核心代码片段

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无头模式
driver = webdriver.Chrome(options=options)
driver.get(f"https://www.sofascore.com/football/match/{event_id}")
sleep(5)  # 等待JS渲染
# 滚动到底部加载所有球员评分
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
sleep(3)
# 通过CSS选择器抓取评分(需根据页面结构调整)
ratings = driver.find_elements(By.CSS_SELECTOR, ".rating__number")
player_names = driver.find_elements(By.CSS_SELECTOR, ".player-name")

优势:不依赖接口内幕,可处理任何前端改动。劣势:运行速度慢,且需安装ChromeDriver。


API接口直连(进阶玩家的高效选择)

原理:SofaScore虽未公开官方API,但其内部GraphQL接口https://www.sofascore.com/graphql可接受POST请求。

优化脚本(含自动重试)

import requests
import json
def graphql_query(query):
    payload = {"query": query}
    resp = requests.post("https://www.sofascore.com/graphql",
                        json=payload,
                        headers={'Content-Type': 'application/json'})
    return resp.json()
gql = """
query ($eventId: Int!) {
    event(eventId: $eventId) {
        playerStatistics {
            player { name }
            rating
            team { name }
        }
    }
}
"""
# 调用时传入变量
result = graphql_query(gql.replace('$eventId', str(event_id)))

提示:GraphQL接口需要先通过浏览器DevTools的Network面板复制请求头(如x-requested-withcsrf),否则易返回403。


常见问题QA(Q1-Q5)

Q1:脚本返回空列表,怎么排查? A:先检查event_id是否正确(在网页地址栏的/event/后找到纯数字),其次确认比赛是否已结束(未结束的比赛中评分字段为null)。

Q2:运行方案一报SSL证书错误? A:在requests.get()中加入verify=False参数,并引入urllib3.disable_warnings()

Q3:如何批量统计一周所有比赛的评分? A:先调用SofaScore日历API获取比赛ID列表,循环执行方案一,每次间隔1秒避免封IP。

Q4:SofaScore官方会封禁账号吗? A:高频抓取会触发临时封IP(需换代理),但普通频率下不影响账号安全。

Q5:评分数据能否直接导入Excel? A:可以,脚本已生成CSV;或用pandas.read_csv后合并至现有表格。


如何选择最适合你的脚本方案?

方案 适用场景 技术门槛 抓取稳定性
Requests脚本 单场赛后快速抓取 中(需维护URL)
Selenium方案 遇到验证码或动态页面 高(模拟真人)
GraphQL方案 批量、高频数据需求 高(需自建请求头)

行动建议:如果你是数据分析师,建议方案三;如果只是周末看球想存个数据,方案一已足够,无论选哪个,都建议将脚本封装成函数,并加入异常重试机制(如间隔5秒重试3次)。

扩展技巧:SofaScore评分在赛后72小时内可随时抓取,但若需历史比赛数据,请直接使用其公开的/api/v1/event/{id}/statistics接口,无需登录,最后提醒:请遵守网站robots.txt规则,控制请求频率(建议<1次/秒),做文明爬虫。

抱歉,评论功能暂时关闭!