使用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
相关产品推荐
相关产品推荐

