首页 > web前端 > js教程 > 正文

解决Heroku上Puppeteer运行次数受限问题:内存泄漏排查与优化

心靈之曲
发布: 2025-09-15 21:02:01
原创
640人浏览过

解决heroku上puppeteer运行次数受限问题:内存泄漏排查与优化

本文旨在帮助开发者解决在使用Puppeteer在Heroku上进行网页数据抓取时,程序运行次数受限的问题。通过分析常见原因,特别是内存泄漏问题,并提供相应的解决方案,确保Puppeteer应用在Heroku环境下稳定可靠地运行。

问题分析

在Heroku上部署Puppeteer应用时,经常会遇到程序只能运行几次就停止的情况,这通常与Heroku的资源限制有关。一个常见的原因是内存泄漏,导致Dyno内存耗尽,程序崩溃。

内存泄漏排查

Puppeteer在运行过程中会占用大量内存,如果每次抓取数据后没有正确释放资源,就会造成内存泄漏。以下是一些排查内存泄漏的方法:

  1. 日志分析: 仔细查看Heroku的日志,寻找与内存相关的错误信息,例如TimeoutError。

  2. 代码审查: 检查Puppeteer代码,特别是循环抓取数据的部分,确保每次操作后都正确关闭了Browser和Page实例。

解决方案:显式关闭Browser实例

最常见的解决方案是在每次抓取数据后,显式地关闭Browser实例,释放占用的内存。

const puppeteer = require('puppeteer');

async function scrapeData(code) {
    const browser = await puppeteer.launch({
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    });
    const page = await browser.newPage();

    await page.goto("website url");
    await page.type('#crit-keyword', code);
    await page.click('#search-button');

    await page.waitForSelector(".result__headline");

    await page.click(".result__headline");

    await page.waitForSelector("div.text:nth-child(2)");

    let data = await page.evaluate(() => {
        let classTitle = document.querySelector("div.text:nth-child(2)").textContent
            .toLowerCase().split(' ')
            .map((s) => s.charAt(0).toUpperCase() + s.substring(1)).join(' ').replace('Ii', "II");
        let classDesc = document.querySelector(".section--description > div:nth-child(2)").textContent.replace('Lec/lab/rec.', '').trim();

        return {
            title: classTitle,
            desc: classDesc
        };
    });

    console.log(`== Finished grabbing ${code}`);

    // 确保关闭browser实例,释放内存
    await browser.close();

    return data;
}

module.exports = { scrapeData };
登录后复制

注意事项:

简篇AI排版
简篇AI排版

AI排版工具,上传图文素材,秒出专业效果!

简篇AI排版 554
查看详情 简篇AI排版
  • 确保在scrapeData()函数的return语句之前调用await browser.close()。
  • 如果代码中存在其他资源,例如文件句柄、数据库连接等,也需要确保在使用完毕后及时释放。

其他优化方案

除了关闭Browser实例外,还可以考虑以下优化方案:

  1. headless模式: 使用headless模式运行Puppeteer可以减少内存占用

    const browser = await puppeteer.launch({
        headless: true, // 启用headless模式
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    });
    登录后复制
  2. 资源限制: 如果内存仍然不足,可以考虑升级Heroku Dyno的配置,增加内存。

  3. 请求队列: 如果抓取任务数量很多,可以考虑使用请求队列,限制并发请求数量,避免瞬间占用过多内存。

  4. 超时设置: 适当调整page.goto()和page.waitForSelector()等函数的超时时间,避免因网络问题导致程序长时间等待,占用内存。

总结

在使用Puppeteer在Heroku上进行网页数据抓取时,内存泄漏是一个常见的问题。通过显式关闭Browser实例,以及其他优化方案,可以有效解决该问题,确保程序稳定可靠地运行。务必仔细审查代码,排查潜在的内存泄漏点,并根据实际情况调整配置,以达到最佳性能。

以上就是解决Heroku上Puppeteer运行次数受限问题:内存泄漏排查与优化的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号