0

0

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

心靈之曲

心靈之曲

发布时间:2025-09-15 21:02:01

|

650人浏览过

|

来源于php中文网

原创

解决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 };

注意事项:

Civitai
Civitai

AI艺术分享平台!海量SD资源和开源模型。

下载
  • 确保在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实例,以及其他优化方案,可以有效解决该问题,确保程序稳定可靠地运行。务必仔细审查代码,排查潜在的内存泄漏点,并根据实际情况调整配置,以达到最佳性能。

相关专题

更多
go语言goto的用法
go语言goto的用法

本专题整合了go语言goto的用法,阅读专题下面的文章了解更多详细内容。

136

2025.09.05

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

356

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2076

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

348

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

411

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

408

2023.10.16

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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