使用Selenium爬取Eurobet.it的ChanceMix页面时赛事列表不全求助
解决Eurobet ChanceMix页面多日期赛事列表不完整的问题
我帮你分析下这个问题——你遇到的赛事列表只显示前1-2个日期的情况,几乎可以肯定是页面动态加载机制导致的:后续日期的赛事内容并没有在页面初始化时就全部渲染到DOM里,而是需要触发滚动、点击日期标签等操作,才会加载更多内容。你的现有代码只等待了初始可见的元素,自然拿不到后续的赛事。
下面给你一套针对性的解决方案,结合代码修改来实现完整的赛事抓取:
核心问题分析
Eurobet这类博彩网站的赛事列表通常会做两种动态加载:
- 滚动加载:把后续日期的赛事放在页面下方,只有当用户滚动到对应位置时才会请求并渲染内容;
- 日期标签切换加载:页面顶部有日期切换栏(比如“今天”“明天”“后天”),默认只加载当前/最近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,避免页面未加载完成时点击失败; - 滚动加载逻辑:通过循环滚动并比较页面高度,确保所有滚动触发的赛事内容都被加载;
- 日期标签处理:如果页面有日期切换栏,逐个点击加载对应日期的赛事,避免遗漏;
- 优化等待时长:给每个加载步骤留足够的等待时间,确保内容完全渲染。
额外注意事项
- 网站的DOM结构可能会更新,要定期检查你的CSS选择器/XPATH是否依然有效;
- 如果遇到反爬限制,可以给Chrome添加参数(比如
--disable-blink-features=AutomationControlled)来规避Selenium检测; - 固定的
time.sleep可以替换为更智能的等待(比如等待某个特定的赛事元素出现),提升效率。
内容的提问来源于stack exchange,提问作者Mark.Doe
相关产品推荐
相关产品推荐

