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

使用Selenium WebDriver时Chrome内存过载问题的排查与解决

为什么关闭标签页后内存仍占用?

Chrome采用多进程架构,每个标签页对应独立的渲染进程。关闭标签页后,Chrome不会立刻销毁这些进程——它会保留进程池用于后续新标签页快速复用,避免重复初始化的开销。另外,Selenium的Driver会话会维护页面上下文的引用,加上Chrome的缓存、未回收的JS堆内存,都会导致内存无法及时释放,累积到一定程度就会过载。

解决方案

1. 避免频繁创建新标签页,复用现有标签页

你当前的逻辑是反复创建新标签、加载、关闭,完全可以改成复用单个额外标签页,不用每次都新建:

from selenium import webdriver
import time

driver = webdriver.Chrome()
url = 'https://edition.cnn.com/'

driver.get(url)
# 仅创建一次额外标签页
driver.execute_script("window.open();")
main_handle = driver.window_handles[0]
extra_handle = driver.window_handles[1]

for i in range(25):
    time.sleep(0.5)
    driver.switch_to.window(extra_handle)
    driver.get(url)
    # 这里执行你的数据采集操作
    driver.switch_to.window(main_handle)

# 任务完成后再关闭额外标签页
driver.switch_to.window(extra_handle)
driver.close()
driver.switch_to.window(main_handle)

2. 添加Chrome启动参数优化内存

启动Chrome时带上这些参数,禁用不必要的功能、强制限制内存占用:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 禁用缓存
chrome_options.add_argument("--disable-cache")
chrome_options.add_argument("--disable-application-cache")
# 启用内存节省模式
chrome_options.add_argument("--enable-features=MemorySaverMode")
# 限制渲染进程数量
chrome_options.add_argument("--max-render-processes=4")
# 禁用扩展和插件
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-plugins")
# 无头模式(可选,内存占用比正常模式低30%左右)
chrome_options.add_argument("--headless=new")

driver = webdriver.Chrome(options=chrome_options)

3. 手动触发Chrome内存回收

在关闭标签页后,强制JS垃圾回收,但需要先给Chrome开启对应的权限:
首先添加启动参数:

chrome_options.add_argument("--js-flags=--expose-gc")

然后在代码中执行回收:

# 关闭标签页切回主标签后,触发垃圾回收
driver.switch_to.window(main_handle)
driver.execute_script("window.gc();")

4. 分批次重启Driver

如果必须处理600个页面,把任务分成若干批次(比如每100个一批),每批处理完彻底销毁Driver再重建,能完全释放内存:

from selenium import webdriver
import time

batch_size = 100
total_tasks = 600
url = 'https://edition.cnn.com/'

for _ in range(total_tasks // batch_size):
    driver = webdriver.Chrome()
    driver.get(url)
    for _ in range(batch_size):
        time.sleep(0.5)
        driver.get(url)
        # 执行数据采集操作
    driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:07:39