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

Python Selenium Firefox脚本滚动加载时内存不足,系统内存仍有剩余

解决Selenium+Firefox长页面滚动加载的内存溢出问题

针对你遇到的JavaScript内存溢出错误,结合你的两个假设,给出具体的排查和解决办法:

一、验证并调整Firefox的内存配额限制

你猜的没错,Firefox会给JavaScript引擎单独分配内存配额,这个配额和系统总RAM是分开的——哪怕系统还有剩余内存,JS堆耗尽也会触发OOM错误。

调整方法:

在初始化Firefox浏览器时,通过FirefoxOptions设置相关偏好参数,提升JS堆内存限制并减少不必要的内存占用:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
# 设置JavaScript最大堆内存为4GB(字节单位,可根据需求调整)
options.set_preference("javascript.options.mem.max", 4294967296)
# 禁用磁盘缓存,仅保留小容量内存缓存
options.set_preference("browser.cache.disk.enable", False)
options.set_preference("browser.cache.memory.capacity", 10485760)  # 10MB
# 禁用通知、自动播放等非必要功能,减少内存消耗
options.set_preference("dom.webnotifications.enabled", False)
options.set_preference("media.autoplay.default", 2)

driver = webdriver.Firefox(options=options)

也可以手动打开Firefox的about:config页面,搜索javascript.options.mem.max确认当前值,默认值通常在1GB以内,长页面场景下确实不够用。

二、验证内存暴涨后进程被回收的情况

要确认是否出现过内存耗尽被系统终止的情况,可以实时监控Firefox进程的内存变化:

1. 用系统工具实时监控

找到Firefox的PID(可以通过ps aux | grep firefox获取),然后用top -p <PID>或者htop盯着内存占用,看是否出现突然飙升后骤降的情况——如果有,说明进程被系统的OOM Killer回收过。

2. 在脚本中添加内存监控代码

用psutil库实时打印Firefox的内存占用,方便后台运行时查看日志:

import psutil
import time
import threading
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

def monitor_firefox_memory(pid):
    proc = psutil.Process(pid)
    while True:
        mem_rss = proc.memory_info().rss / 1024 / 1024
        print(f"[监控] Firefox内存占用: {mem_rss:.2f} MB")
        time.sleep(60)  # 每分钟打印一次

# 初始化浏览器
options = Options()
# 这里加上之前的内存配置参数
driver = webdriver.Firefox(options=options)

# 启动后台监控线程
monitor_thread = threading.Thread(target=monitor_firefox_memory, args=(driver.service.process.pid,), daemon=True)
monitor_thread.start()

# 你的滚动加载脚本...

三、额外优化方案(减少内存积累)

除了调整配额,还可以从脚本逻辑入手,减少长时间运行的内存占用:

  • 定期清理DOM节点:每次加载新内容后,用JS移除页面上方不再需要的旧元素,减少DOM树的大小:
    # 示例:移除页面中class为old-item的元素
    driver.execute_script("""
        const oldElements = document.querySelectorAll('.old-item');
        oldElements.forEach(el => el.remove());
    """)
    
  • 使用无头模式:无头模式的Firefox比普通GUI模式内存占用低30%以上,添加options.add_argument("--headless")即可开启。
  • 分段刷新页面:每加载一定数量的内容后,刷新页面并定位到当前加载的位置(比如记录最后一个元素的ID或页码),避免单页面DOM无限膨胀。
  • 更新Firefox和geckodriver:旧版本可能存在内存泄漏bug,更新到最新稳定版能修复不少问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:44:55