使用Selenium抓取Kaplan课程列表仅获40条共56条同class数据如何解决
问题原因
- 无加载等待逻辑:滚动后立即点击加载按钮,且用
try...except pass吞掉了所有报错,可能出现按钮未渲染完成点击失败、点击后新内容还没加载完成就进入下一轮操作的情况,实际上大部分循环都没有成功触发内容加载。 - 绝对路径XPath稳定性极低:页面DOM结构稍有动态变动(比如临时插入其他元素),你写的长绝对XPath就会定位不到按钮,直接被异常捕获跳过,无法触发加载。
- 未设置加载终止条件:固定循环20次的逻辑不合理,所有内容加载完成后加载按钮会隐藏/置灰,此时继续操作也不会产生新内容,也没有主动终止循环的逻辑。
- 使用已废弃API:
find_element_by_xpath是Selenium 4.0+版本已废弃的接口,部分环境下运行会直接抛出异常,被捕获后直接跳过加载操作。
解决方法
使用显式等待替代硬编码循环,优化元素定位逻辑,每次加载完成后再进行下一轮操作,改后可运行代码参考:
首先导入依赖包:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time
主逻辑部分替换为如下代码:
# 初始化driver、打开目标页面的原有逻辑保留 # 声明显式等待对象,最长等待时间设置为10秒 wait = WebDriverWait(driver, 10) # 记录上一次加载完成的课程数量,初始值为0 last_course_count = 0 while True: # 定位加载更多按钮,使用相对XPath匹配按钮文本,稳定性更高 try: load_more_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(text(),"Load more")]'))) except: # 超时找不到可点击的加载按钮,说明已加载完全部内容,跳出循环 break # 滚动到加载按钮位置,避免页面底部固定元素遮挡导致点击失效 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", load_more_btn) time.sleep(0.5) # 点击加载按钮 load_more_btn.click() # 等待新内容加载完成:直到课程数量大于上一次加载后的数量 try: wait.until(lambda dr: len(dr.find_elements(By.CLASS_NAME, "wrap-result")) > last_course_count) except: # 超时后数量没有变化,说明已无更多内容 break # 更新当前课程数量 current_course_count = len(driver.find_elements(By.CLASS_NAME, "wrap-result")) if current_course_count == last_course_count: break last_course_count = current_course_count # 最终获取所有课程条目 course_list = driver.find_elements(By.CLASS_NAME, "wrap-result") print("Total courses: ", len(course_list))
如果仍然出现抓取不全的情况,可以在每次点击加载按钮后增加1秒左右的延迟,等待所有条目完全渲染后再进行数量判断。
内容的提问来源于stack exchange,提问作者Preethi R
相关产品推荐
相关产品推荐

