求助:无法抓取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
相关产品推荐
相关产品推荐

