You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium爬虫无法爬取完整页面 中途报NoSuchElementException异常

问题根因
  • 滚动操作未实际执行:location_once_scrolled_into_view是WebElement的方法,不是属性,原代码没有在末尾加(),根本没有触发滚动到元素的逻辑。该页面是**懒加载(无限滚动)**模式,不在视口内的车辆卡片不会被渲染到DOM树里,自然找不到对应元素。
  • 定位逻辑鲁棒性极差:原代码用的是从html根节点开始的绝对XPath,完全依赖DOM层级的固定序号,页面只要插入临时广告、加载提示条、调整布局,div的序号就会偏移,直接导致定位失败;同时while True死循环没有终止判断,x自增超过当前已渲染的车辆卡片总数时必然抛出NoSuchElementException。
  • 初始加载条目数不稳定:页面首屏渲染的车辆数量受网络速度、窗口高度影响,每次运行能拿到的7-9个结果就是首屏刚好渲染完的量,后续内容没加载也没触发滚动就会报错。
修复方案
  1. 替换绝对XPath为基于元素特征的相对定位,不要硬编码DOM层级序号
  2. 实现懒加载逻辑:循环滚动到页面底部,直到已加载的车辆总数不再增加,说明所有条目加载完成
  3. 所有元素加载完成后,批量提取车辆名称,避免逐个下标遍历的不可靠问题

对应修复后的参考代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:39:26