如何用Python的Selenium点击Flashscore的“显示更多比赛”按钮爬取隐藏数据
Flashscore隐藏赛事加载按钮点击失效解决方案
前置注意点
你提到的按钮包含两个class属性,使用Selenium定位时不要使用By.CLASS_NAME方法(该方法仅支持单个class参数),正确的定位方式是使用CSS选择器:
from selenium.webdriver.common.by import By load_more_btn = driver.find_element(By.CSS_SELECTOR, '.event__more.event__more--static')
方案1:JavaScript强制触发点击(最高兼容性)
Selenium原生点击方法容易被页面事件监听、元素遮挡、未激活等情况拦截,直接调用页面原生JS点击方法稳定性更高:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.flashscore.com/football/albania/superliga-2019-2020/results/") time.sleep(3) # 等待页面初始加载完成 # 循环点击直到所有赛事加载完成 while True: try: load_more_btn = driver.find_element(By.CSS_SELECTOR, '.event__more.event__more--static') # 执行JS点击 driver.execute_script("arguments[0].click();", load_more_btn) time.sleep(2) # 等待新赛事渲染完成 except: # 按钮不存在说明已加载完全部赛事 break
方案2:滚动到可视区域后点击
部分网站的交互逻辑要求元素完全出现在视口才会响应点击事件,操作前先滚动按钮到可视区域:
from selenium.webdriver.common.action_chains import ActionChains load_more_btn = driver.find_element(By.CSS_SELECTOR, '.event__more.event__more--static') # 滚动到按钮居中显示 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", load_more_btn) time.sleep(0.5) # 模拟用户鼠标移动后点击 ActionChains(driver).move_to_element(load_more_btn).click().perform()
方案3:直接调用数据接口(推荐)
模拟浏览器点击效率低且容易受页面渲染影响,你可以直接抓包获取结构化数据:
- 打开浏览器开发者工具的「网络」面板,筛选「Fetch/XHR」类型请求
- 手动点击一次「Show more matches」按钮,观察新发起的请求,请求参数会包含赛季、赛事类型标识,返回值为JSON格式的赛事数据
- 直接构造该请求用
requests库调用即可拿到所有隐藏赛事信息,不需要操作浏览器
优化提示
可以用显式等待替代固定time.sleep提升执行效率,示例:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等待10秒直到按钮可点击 load_more_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.event__more.event__more--static')) )
内容的提问来源于stack exchange,提问作者Om Prakash Panda
相关产品推荐
相关产品推荐

