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

循环满足条件时如何释放内存?解决YouTube爬取内存溢出问题

解决YouTube评论爬取的内存堆积问题

问题描述

运行以下爬取YouTube评论的代码一段时间后,出现「内存不足」错误。原本期望通过gc.collect()清理内存但未生效,且每次保存的文件体积持续增大,需要解决内存堆积、在保存文件时释放内存的问题:

i=0
while True:

    load_more_comments=driver.find_element(By.CSS_SELECTOR,'main[class="container-xl"] button[id="showMoreBtn"]')
    driver.execute_script("arguments[0].click();", load_more_comments)
    driver.execute_script("arguments[0].scrollIntoView(true);", load_more_comments)

    if i % 50 == 0 and i != 0:
        html = driver.page_source
        joblib.dump(html,open(f'html_{i}.pickle','wb'))
        del html
        gc.collect()
        
    print(i,end='\r')
    i+=1
    time.sleep(1)

解决方案

1. 清理Selenium Driver的页面缓存

Selenium Driver会持续缓存页面资源,单纯删除html变量和调用gc.collect()无法释放这部分内存。可以每隔固定次数循环后刷新页面,强制Driver丢弃旧页面资源:

from selenium.common.exceptions import NoSuchElementException

i=0
while True:
    try:
        load_more_comments = driver.find_element(By.CSS_SELECTOR,'main[class="container-xl"] button[id="showMoreBtn"]')
        driver.execute_script("arguments[0].click();", load_more_comments)
        driver.execute_script("arguments[0].scrollIntoView(true);", load_more_comments)
    except NoSuchElementException:
        # 无更多评论时退出循环
        break

    if i % 50 == 0 and i != 0:
        # 保存页面源码
        html = driver.page_source
        with open(f'html_{i}.pickle','wb') as f:
            joblib.dump(html, f)
        # 清理变量
        del html
        # 刷新页面释放Driver内存
        driver.refresh()
        # 刷新后重新定位评论区并滚动到位
        time.sleep(2)
        comment_section = driver.find_element(By.CSS_SELECTOR, "section.ytd-comments")
        driver.execute_script("arguments[0].scrollIntoView(true);", comment_section)
        
    print(i, end='\r')
    i+=1
    time.sleep(1)

2. 改用更轻量的文件保存方式

joblib.dump会为序列化数据添加额外元数据,导致文件体积增大。直接将页面源码写入文本文件,既能减少保存时的内存开销,也能缩小文件体积:

# 替换原保存代码块
if i % 50 == 0 and i != 0:
    with open(f'html_{i}.txt', 'w', encoding='utf-8') as f:
        f.write(driver.page_source)
    # 无需额外保留html变量,直接跳过del和gc步骤

3. 启用Chrome的强制内存回收

针对Chrome Driver,可以通过启动参数开启JS内存回收权限,在每次保存后强制清理页面内存:
首先修改Driver启动代码:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--js-flags=--expose-gc")  # 暴露JS垃圾回收接口
driver = webdriver.Chrome(options=chrome_options)

然后在保存文件后执行:

if i % 50 == 0 and i != 0:
    # 保存逻辑...
    driver.execute_script("window.gc();")  # 触发JS层面的内存回收

4. 定期重启Driver

如果以上方法仍无法控制内存增长,可以每隔固定次数循环完全重启Driver,彻底释放所有占用的内存:

i=0
restart_interval = 500  # 每500次循环重启一次Driver
target_url = "你的目标YouTube视频URL"

while True:
    # 定期重启Driver
    if i % restart_interval == 0 and i != 0:
        driver.quit()
        # 重新初始化Driver
        driver = webdriver.Chrome(options=chrome_options)
        driver.get(target_url)
        time.sleep(3)
        # 重新滚动到评论区
        comment_section = driver.find_element(By.CSS_SELECTOR, "section.ytd-comments")
        driver.execute_script("arguments[0].scrollIntoView(true);", comment_section)
    
    # 加载评论的逻辑...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:10:30