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

求助:无法抓取Sofascore球队页面下拉菜单切换选项后的数据

解决Sofascore下拉切换后卡片数据抓取失败的问题

核心问题分析

下拉切换后卡片数据抓不到,本质是动态内容加载/ DOM 重渲染导致的:要么是切换时通过AJAX拉取新数据,要么是前端切换显示已加载的内容但原元素引用失效,且你没有等待内容更新完成就开始抓取。


具体解决办法

1. 先搞清楚切换的交互逻辑

打开浏览器开发者工具(F12)切到「Network」面板,手动切换下拉选项:

  • 如果看到XHR/fetch请求:直接抓这个接口数据,比模拟点击稳定10倍,接口返回的JSON里会包含所有选项的统计数据。
  • 如果没有新请求:说明数据已经在页面里,只是前端切换了显示状态,这时候要检查卡片元素的选择器是否变化,或者需要等待DOM更新。

2. 模拟点击后必须等内容加载完成

如果你用Selenium/Puppeteer这类工具,点击后不能立刻抓取,必须加等待逻辑:

Selenium示例(Python)
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 点击下拉按钮
toggle_btn = driver.find_element(By.XPATH, '//*[@id="downshift-5-toggle-button"]/div/span/span')
toggle_btn.click()

# 等待目标选项可点击并选择(比如选第二个选项)
target_option = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//div[@role="option"][2]'))
)
target_option.click()

# 等待卡片数据更新(比如等某个场次数据元素的文本变化)
WebDriverWait(driver, 10).until(
    EC.text_to_be_present_in_element((By.XPATH, '//你的卡片场次元素XPath'), '预期的场次文本')
)

# 重新查找卡片元素(不能复用之前的元素引用)
cards = driver.find_elements(By.XPATH, '//卡片容器的XPath')
for card in cards:
    matches = card.find_element(By.XPATH, './div[contains(text(), "场次")]/following-sibling::div').text
    goals = card.find_element(By.XPATH, './div[contains(text(), "进球")]/following-sibling::div').text
    assists = card.find_element(By.XPATH, './div[contains(text(), "助攻")]/following-sibling::div').text
    # 处理并存储数据
Puppeteer示例(JS)
await page.click('//*[@id="downshift-5-toggle-button"]/div/span/span');
await page.click('div[role="option"]:nth-child(2)');

// 等待卡片数据更新,通过判断特征文本是否出现
await page.waitForFunction(() => {
    const targetCard = document.querySelector('你的卡片选择器');
    return targetCard && targetCard.textContent.includes('更新后的标识文本');
});

// 抓取数据
const statsData = await page.evaluate(() => {
    const cards = document.querySelectorAll('卡片容器选择器');
    return Array.from(cards).map(card => ({
        matches: card.querySelector('.场次类选择器').textContent,
        goals: card.querySelector('.进球类选择器').textContent,
        assists: card.querySelector('.助攻类选择器').textContent
    }));
});

3. 避开「失效元素引用」坑

切换选项后,页面里的卡片元素大概率会被销毁重建,所以绝对不能复用点击前获取的卡片元素对象,必须在点击并等待后重新查找元素。

4. 直接抓接口(最推荐)

Sofascore的所有数据都是通过API接口返回的,切换下拉选项时,Network面板里会出现带筛选参数的GET请求(比如包含season、filter这类参数)。复制请求的URL和Headers,直接用requests(Python)或fetch(JS)调用,返回的JSON里会包含所有选项的统计数据,完全不用模拟前端点击,效率和稳定性都拉满。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:01:25