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

Python爬取香水网站时随机出现WebDriverException错误的解决咨询

解决WebDriver随机抛出"cannot determine loading status"错误的方案

核心修复手段

这个错误多是ChromeDriver与页面渲染不同步导致的,尤其在循环爬取动态页面时容易随机触发,以下是针对性的解决方法:

1. 用显式等待替代固定sleep

不要依赖time.sleep(),改用WebDriverWait配合预期条件,确保元素加载完成后再执行操作:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待香水列表容器加载完成,可根据实际页面元素调整定位器
wait = WebDriverWait(driver, 15)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".search-results .perfume-item")))

每次循环爬取前都执行等待逻辑,避免页面未就绪时触发操作。

2. 捕获异常并实现重试机制

针对随机出现的错误,在循环中加入异常捕获,遇到目标错误时刷新页面重试:

from selenium.common.exceptions import WebDriverException

max_retries = 3
for target_url in perfume_urls:
    retries = 0
    while retries < max_retries:
        try:
            driver.get(target_url)
            # 执行爬取逻辑(提取数据等)
            break
        except WebDriverException as e:
            if "cannot determine loading status" in str(e):
                retries += 1
                driver.refresh()
            else:
                raise  # 非目标异常直接抛出
    if retries == max_retries:
        print(f"重试3次仍无法处理链接: {target_url}")

3. 禁用Chrome冗余渲染特性

启动Chrome时添加以下参数,降低页面渲染复杂度,减少冲突:

from selenium import webdriver

options = webdriver.ChromeOptions()
# 禁用GPU加速
options.add_argument("--disable-gpu")
# 禁用图片加载(无需爬取图片时使用)
options.add_argument("--blink-settings=imagesEnabled=false")
# 无沙盒模式
options.add_argument("--no-sandbox")
# 禁用自动扩展
options.add_argument("--disable-extensions")

driver = webdriver.Chrome(options=options)

4. 切换到undetected-chromedriver

普通ChromeDriver存在兼容和检测问题,改用undetected-chromedriver库,它会自动处理Driver与浏览器的适配,减少异常:

import undetected_chromedriver as uc

# 初始化Driver,自动适配当前Chrome版本
driver = uc.Chrome()

安装命令:pip install undetected-chromedriver

5. 设置页面加载超时

限制页面加载时间,避免长时间未响应导致的异常:

driver.set_page_load_timeout(30)  # 设置30秒超时

额外优化建议

  • 加入随机延迟,避免频繁触发反爬,同时给页面足够渲染时间:
import random
import time

# 每次操作后随机等待1-3秒
time.sleep(random.uniform(1, 3))
  • 定期重启Driver,长时间运行后Chrome进程可能出现内存泄漏,每爬取50-100个链接后重启一次:
if crawl_count % 50 == 0:
    driver.quit()
    driver = webdriver.Chrome(options=options)  # 或重新初始化undetected-chromedriver

内容的提问来源于stack exchange,提问作者Armonia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:18:13