Selenium爬虫无法爬取完整页面 中途报NoSuchElementException异常
问题根因
- 滚动操作未实际执行:
location_once_scrolled_into_view是WebElement的方法,不是属性,原代码没有在末尾加(),根本没有触发滚动到元素的逻辑。该页面是**懒加载(无限滚动)**模式,不在视口内的车辆卡片不会被渲染到DOM树里,自然找不到对应元素。 - 定位逻辑鲁棒性极差:原代码用的是从html根节点开始的绝对XPath,完全依赖DOM层级的固定序号,页面只要插入临时广告、加载提示条、调整布局,div的序号就会偏移,直接导致定位失败;同时
while True死循环没有终止判断,x自增超过当前已渲染的车辆卡片总数时必然抛出NoSuchElementException。 - 初始加载条目数不稳定:页面首屏渲染的车辆数量受网络速度、窗口高度影响,每次运行能拿到的7-9个结果就是首屏刚好渲染完的量,后续内容没加载也没触发滚动就会报错。
修复方案
- 替换绝对XPath为基于元素特征的相对定位,不要硬编码DOM层级序号
- 实现懒加载逻辑:循环滚动到页面底部,直到已加载的车辆总数不再增加,说明所有条目加载完成
- 所有元素加载完成后,批量提取车辆名称,避免逐个下标遍历的不可靠问题
对应修复后的参考代码:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait import time driver.get("https://www.herbchambers.com/used-inventory/index.htm?geoZip=02108&geoRadius=0") wait = WebDriverWait(driver, 10) # 处理懒加载,滚动直到没有新车加载 last_count = 0 while True: # 滚动到页面最底部触发加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载,留1.5秒缓冲 time.sleep(1.5) # 统计当前已加载的所有车辆卡片数量 current_cards = driver.find_elements(By.CSS_SELECTOR, "ul.vehicleList li.vehicle-card") current_count = len(current_cards) # 数量不再增长说明全部加载完成 if current_count == last_count: break last_count = current_count # 所有卡片加载完成后,批量提取车名 car_names = [] for card in current_cards: name_ele = card.find_element(By.CSS_SELECTOR, "h2 a") car_names.append(name_ele.text.strip()) # 打印所有结果 for idx, name in enumerate(car_names, 1): print(f"第{idx}辆车:{name}")
补充说明:如果页面有分页按钮,滚动到底部后需要额外判断下一页按钮是否可点击,逐页跳转加载即可,逻辑和上述滚动判断类似。
内容的提问来源于stack exchange,提问作者from_the_m00n
相关产品推荐
相关产品推荐

