为何.click()仅在手动滚动时生效?如何自动展开容器爬取数据?
解决爬虫中无需手动滚动展开'resulted'容器的问题
针对你遇到的必须手动滚动才能展开容器的问题,可通过以下调整实现自动展开:
- 滚动到目标容器而非固定位置:放弃固定像素值的滚动,直接定位
resulted容器,用JS将其滚动到视口内,确保页面加载该区域的动态内容。 - 等待元素可交互后再点击:仅等待元素存在不足以保证能点击,需等待元素满足「可见且可交互」的状态。
- 备用JS点击方案:若直接点击失效,用JS触发点击操作,绕过前端可能的交互限制。
修改后的代码如下:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC target_url = "https://www.racenet.com.au/form-guide/horse-racing/the-valley-20231006/breast-cancer-network-australia-handicap-race-5/overview" driver.get(target_url) driver.maximize_window() # 定位resulted容器并滚动到视口中央,触发动态加载 resulted_container = WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CLASS_NAME, 'resulted')) ) driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", resulted_container) # 等待event-header元素可点击后执行点击 event_header = WebDriverWait(driver, 30).until( EC.element_to_be_clickable((By.CLASS_NAME, 'event-header')) ) try: event_header.click() except: # 直接点击失效时用JS触发点击 driver.execute_script("arguments[0].click();", event_header) # 等待展开后的目标内容加载完成(替换成你实际要爬取的内容选择器) WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.resulted .target-content')) )
关键说明:
scrollIntoView会自适应屏幕尺寸将元素滚动到视口内,比固定滚动值更稳定,确保页面加载该区域的动态资源。element_to_be_clickable同时验证元素的存在性、可见性和可交互状态,避免因元素未完全加载导致的点击失败。- 加入异常处理的JS点击,可应对前端事件绑定特殊、元素被遮挡等场景,提升代码鲁棒性。
内容的提问来源于stack exchange,提问作者Ben G
相关产品推荐
相关产品推荐

