You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Chrome版Selenium WebDriver执行get请求后出现内存膨胀问题

问题分析与调试建议

针对你遇到的特定网站在Selenium非Headless模式下内存暴涨、页面无法加载的问题,结合你的环境和现象,我整理了以下可能的原因和调试步骤:

一、可能的原因

  • 反爬机制的资源消耗攻击:部分网站会针对带UI的自动化工具(比如你的Selenium实例)设计针对性反爬逻辑,比如无限生成DOM元素、触发循环动画或重复发起网络请求,以此消耗自动化进程的资源,迫使工具崩溃。而Headless模式下页面渲染逻辑简化,可能未触发这类检测。
  • Chrome版本与Win7的渲染兼容性bug:你使用的Chrome 88.0.4324.146属于较旧版本,Win7系统上的Chrome渲染引擎可能与该网站的某些页面元素(如复杂WebGL动画、动态渲染组件)存在兼容性问题,导致内存泄漏或无限渲染循环。
  • UI模式下的自动化特征残留:虽然你添加了隐藏navigator.webdriver的参数,但非Headless模式下浏览器可能还存在其他UI层面的自动化特征(如窗口尺寸、渲染参数),被网站识别后触发了恶意资源消耗逻辑。
  • 浏览器配置/扩展干扰:非Headless模式下Selenium可能加载了本地Chrome的默认配置或扩展,这些内容与网站脚本冲突,引发内存异常增长。

二、具体调试步骤

1. 监控页面动态行为与内存占用

  • 手动打开Selenium启动的Chrome浏览器,按F12打开DevTools:
    • 切换到Performance面板,点击录制按钮开始记录页面加载过程,观察是否存在无限循环的JS任务、持续增长的DOM节点数,或是异常的渲染任务。
    • 切换到Memory面板,选择“实时内存”监控,查看内存增长的类型(是JS堆内存还是渲染进程内存),并通过堆快照定位内存占用的核心来源(比如某个重复创建的元素、未释放的事件监听)。
  • 执行driver.get_log('browser')获取浏览器的控制台日志,对比Headless与非Headless模式下的日志差异,查找非Headless模式下独有的报错或警告信息。

2. 排查浏览器参数与配置差异

  • 逐步添加渲染禁用参数,验证问题来源:
    # 禁用GPU渲染、动画、图片,逐步排查
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-animations')
    options.add_argument('--disable-images')
    # 先禁用JS,看内存是否还暴涨,判断是否由JS逻辑导致
    options.add_argument('--disable-javascript')
    
  • 使用干净的临时浏览器配置,排除本地扩展干扰:
    options.add_argument('--user-data-dir=C:\\temp\\selenium_chrome_profile')
    
  • 尝试升级Chrome与ChromeDriver版本:Win7系统最高支持Chrome 114版本,升级到较新的兼容版本,看是否修复了旧版本的渲染bug。

3. 对比正常用户与Selenium的访问差异

  • 用正常Chrome浏览器访问该网站,记录网络请求、页面渲染流程(可通过DevTools的Network和Performance面板),与Selenium访问的情况逐一对比,查看是否存在异常的重复请求、额外加载的资源。
  • 检查UI模式下浏览器的暴露特征:在DevTools控制台执行navigator.webdriverwindow.chrome等命令,确认是否还有未隐藏的自动化标识;同时对比正常浏览器与Selenium浏览器的屏幕分辨率、navigator属性差异,看网站是否在检测这些内容。

4. 添加合理的页面等待逻辑

  • 避免页面无限加载,添加显式等待逻辑,观察内存变化:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    driver.get('website-URL')
    # 等待页面核心元素加载完成
    try:
        WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
    except:
        # 超时后强制停止加载
        driver.execute_script("window.stop();")
    

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

火山引擎 最新活动