告别手动统计!3个实用脚本,一键搞定SofaScore综合评分(附Python代码)
目录导读
- 为什么你需要SofaScore评分自动化脚本?
- Python + Requests库(适合新手,无需浏览器)
- Selenium模拟登录(解决动态加载与反爬)
- API接口直连(进阶玩家的高效选择)
- 常见问题QA(Q1-Q5)
- 如何选择最适合你的脚本方案?
为什么你需要SofaScore评分自动化脚本?
SofaScore作为全球领先的体育数据平台,其综合评分(由进攻、防守、技术、体能等30+维度加权计算)是球迷、分析师和竞彩玩家判断球员/球队状态的核心指标,手动从网页复制上百名球员评分到Excel,耗时超30分钟/场,且容易漏行错位,本文提供的3个实用脚本,可将此过程压缩到10秒内,并自动生成CSV表格。

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-with、csrf),否则易返回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次/秒),做文明爬虫。