Python Selenium爬取Freshbet赛事页面:内部滚动条滚动失效求助
解决Selenium无法滚动Freshbet赛事区域的问题
问题原因
你原代码中定位的div.custom-scrollbar-btn是滚动条的按钮控件,不是承载赛事内容的可滚动容器,修改它的scrollTop自然不会触发内容区域的滚动。
解决方案
核心是找到实际的可滚动内容容器,再通过JavaScript操作它的滚动属性,或者用ActionChains模拟滚轮滚动。
方法1:定位正确容器并修改scrollTop
先通过浏览器开发者工具(F12)找到赛事列表的父容器:右键点击赛事区域→检查元素,找带有overflow-y: scroll/auto样式的容器(通常类名包含custom-scrollbar-content或类似标识)。修改后的代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep url = 'https://freshbet.com/en/sportsbook/prematch' driver = webdriver.Chrome() driver.get(url) sleep(10) # 切换到iframe,用find_element避免索引定位的不稳定 iframe = driver.find_element(By.TAG_NAME,'iframe') driver.switch_to.frame(iframe) # 点击目标元素 driver.find_element(By.XPATH,'//*[@id="prematch-events"]/div[1]/div/div[2]/div[2]').click() sleep(3) # 定位实际可滚动容器(根据页面实际元素调整选择器) scroll_container = driver.find_element(By.CSS_SELECTOR, 'div.custom-scrollbar-content') # 循环滚动3次 scroll_count = 0 while scroll_count < 3: # 每次滚动容器高度的距离 driver.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;', scroll_container) # 或者用scrollBy方法: # driver.execute_script('arguments[0].scrollBy(0, arguments[0].offsetHeight);', scroll_container) scroll_count += 1 sleep(3)
方法2:模拟鼠标滚轮滚动
如果方法1不生效,可以尝试用ActionChains模拟鼠标滚轮滚动,更贴近用户操作逻辑:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.actions.wheel_input import ScrollOrigin from time import sleep url = 'https://freshbet.com/en/sportsbook/prematch' driver = webdriver.Chrome() driver.get(url) sleep(10) iframe = driver.find_element(By.TAG_NAME,'iframe') driver.switch_to.frame(iframe) driver.find_element(By.XPATH,'//*[@id="prematch-events"]/div[1]/div/div[2]/div[2]').click() sleep(3) scroll_container = driver.find_element(By.CSS_SELECTOR, 'div.custom-scrollbar-content') scroll_count = 0 while scroll_count < 3: # 从容器位置开始向下滚动对应高度 scroll_origin = ScrollOrigin.from_element(scroll_container) ActionChains(driver)\ .scroll_from_origin(scroll_origin, 0, scroll_container.size['height'])\ .perform() scroll_count += 1 sleep(3)
注意事项
- 避免用
find_elements加索引(如[2])定位元素,页面结构变化会导致定位失效,尽量用精准的ID、类名或XPath。 - 滚动前确保容器已完全加载,可适当调整
sleep时间,或改用显式等待(WebDriverWait)替代固定休眠,提升稳定性。
内容的提问来源于stack exchange,提问作者Star Lizard
相关产品推荐
相关产品推荐

