循环满足条件时如何释放内存?解决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
相关产品推荐
相关产品推荐

