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

使用Selenium爬取Eurobet.it的ChanceMix页面时赛事列表不全求助

解决Eurobet ChanceMix页面多日期赛事列表不完整的问题

我帮你分析下这个问题——你遇到的赛事列表只显示前1-2个日期的情况,几乎可以肯定是页面动态加载机制导致的:后续日期的赛事内容并没有在页面初始化时就全部渲染到DOM里,而是需要触发滚动、点击日期标签等操作,才会加载更多内容。你的现有代码只等待了初始可见的元素,自然拿不到后续的赛事。

下面给你一套针对性的解决方案,结合代码修改来实现完整的赛事抓取:

核心问题分析

Eurobet这类博彩网站的赛事列表通常会做两种动态加载:

  1. 滚动加载:把后续日期的赛事放在页面下方,只有当用户滚动到对应位置时才会请求并渲染内容;
  2. 日期标签切换加载:页面顶部有日期切换栏(比如“今天”“明天”“后天”),默认只加载当前/最近1天的赛事,点击其他标签才会加载对应日期的内容。

你的代码没有处理这两种加载逻辑,所以只能拿到初始渲染的少量赛事。

修改后的完整代码

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
from selenium.webdriver.common.action_chains import ActionChains
import time

link = 'https://www.eurobet.it/it/scommesse/#!/calcio/eu-champions-league/'
driver = webdriver.Chrome()
driver.get(link)

# 等待ChanceMix按钮可点击后再点击(避免元素未加载完成导致报错)
chance_mix_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'ChanceMix')]"))
)
chance_mix_btn.click()

# 1. 循环滚动页面,触发滚动加载的赛事内容
last_page_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到当前页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待2秒让内容加载(可根据网络速度调整)
    time.sleep(2)
    # 获取新的页面高度,判断是否还有新内容加载
    new_page_height = driver.execute_script("return document.body.scrollHeight")
    if new_page_height == last_page_height:
        break  # 高度不变,说明没有更多内容了
    last_page_height = new_page_height

# 2. 处理日期标签切换(如果页面有日期栏的话)
try:
    # 找到所有日期切换标签
    date_tabs = WebDriverWait(driver, 10).until(
        EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.date-selector a"))
    )
    for tab in date_tabs:
        # 先滚动到标签位置,避免被页面元素遮挡导致点击失败
        ActionChains(driver).move_to_element(tab).perform()
        tab.click()
        time.sleep(2)  # 等待该日期的赛事加载完成
        # 再次滚动该日期的页面,确保所有赛事都被渲染
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1)
except Exception as e:
    print(f"未检测到日期切换标签,跳过该步骤:{str(e)}")

# 3. 等待所有赛事元素加载完成
all_games = WebDriverWait(driver, 15).until(
    EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.box-sport"))
)

# 输出所有赛事内容
for game in all_games:
    print(game.text)

driver.quit()

关键修改点说明

  • 替换直接查找元素为等待可点击:用element_to_be_clickable替代find_element_by_xpath,避免页面未加载完成时点击失败;
  • 滚动加载逻辑:通过循环滚动并比较页面高度,确保所有滚动触发的赛事内容都被加载;
  • 日期标签处理:如果页面有日期切换栏,逐个点击加载对应日期的赛事,避免遗漏;
  • 优化等待时长:给每个加载步骤留足够的等待时间,确保内容完全渲染。

额外注意事项

  1. 网站的DOM结构可能会更新,要定期检查你的CSS选择器/XPATH是否依然有效;
  2. 如果遇到反爬限制,可以给Chrome添加参数(比如--disable-blink-features=AutomationControlled)来规避Selenium检测;
  3. 固定的time.sleep可以替换为更智能的等待(比如等待某个特定的赛事元素出现),提升效率。

内容的提问来源于stack exchange,提问作者Mark.Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:13:03