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

同一URL对应两个页面,Python+Selenium爬取Sofascore赛事数据遇阻

解决Sofascore赛事URL跳转问题,爬取指定历史赛事数据

问题核心

Sofascore的短格式对阵URL(比如https://www.sofascore.com/arsenal-tottenham-hotspur/IsR)是动态匹配机制,会优先指向最新或未来的同对阵赛事,所以直接访问会跳转到非目标的历史场次。

可行解决方法

  1. 用赛事唯一ID构建固定URL
    Sofascore每一场赛事都有唯一数字ID,这个ID对应的URL不会跳转。你可以从日期页面的元素里提取这个ID:

    • 先通过Selenium访问目标日期页面https://www.sofascore.com/football/2022-05-12
    • 定位到热刺对阵阿森纳的赛事卡片,提取卡片上的data-event-id属性值(这就是该场赛事的唯一ID)
    • 用ID拼接成固定URL:https://www.sofascore.com/event/{赛事ID},访问这个地址就能直接进入目标历史赛事页面
  2. 保留会话上下文跳转
    不要直接输入短URL,而是模拟正常用户操作流程:

    • 先打开日期页面,再用Selenium模拟点击赛事卡片进入详情页,这样网站会话会记录你是从历史日期入口进入的,不会跳转到未来赛事
  3. 添加页面日期验证
    不管用哪种方式进入页面,都可以加一步验证:

    • 提取页面上的赛事日期文本,和目标日期2022-05-12对比
    • 如果不匹配,说明页面跳转了,重新通过日期页面入口进入即可

代码示例(基于Selenium)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

# 1. 访问日期页面获取赛事唯一ID
driver.get("https://www.sofascore.com/football/2022-05-12")
# 等待赛事卡片加载,定位热刺vs阿森纳的赛事卡片
event_card = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//div[contains(text(), 'Tottenham Hotspur') and contains(text(), 'Arsenal')]/ancestor::div[@data-event-id]"))
)
event_id = event_card.get_attribute("data-event-id")

# 2. 用唯一ID访问固定URL
fixed_url = f"https://www.sofascore.com/event/{event_id}"
driver.get(fixed_url)

# 可选:验证页面日期是否正确
match_date = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "sc-12foipm-0"))
).text
if "12 May 2022" in match_date:
    print("成功进入目标赛事页面")
    # 此处编写爬取数据的逻辑
else:
    print("页面跳转,重新获取赛事ID")

driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:48:38