让 puppeteer 浏览器作为全局实例始终打开与为每个请求使用新的浏览器实例

having puppeteer browser as global instance open at all time vs using new browser instance for each request

我的数据库中有一些网址,我需要检查这些地址,并相应地在数据库中更新它们……我需要一遍又一遍地这样做

这是我的代码的简化版本,我有两个函数

1 - init -> 从 db 读取地址行,将地址传递给第二个函数以检查并更新 db 中该地址的结果

2 - check_address -> 在浏览器中检查该地址并返回结果

这是我的代码的简化版本

async function init()
{
    try
    {
        let address = 'select * from addressess order by updated_at asc limit 1';
        let result = await check_address(address);
        await address.update({result : result });

    }
    catch(e){}

    setTimeout( ()=> init() , 5000 );
}


async function check_address( address )
{
    var browser = await puppeteer.launch();
    let result = await 'open a tab  , go to the address and cehck';
    // close the browser
    return result ;
}

init(); 

我觉得为每个地址打开和关闭浏览器非常 time/resource 消耗,所以我想也许我可以一直打开一个全局浏览器,只打开和关闭浏览器中的选项卡,甚至可能使用相同的选项卡...类似

let globalBrowser = false ;
async function check_address( address )
{
    if(!globalBrowser)
    {
        globalBrowser = await puppeteer.launch();
        globalBrowser._process.once('close', () => {
            globalBrowser = false;
        });
    }

    let result = await 'open a tab  , go to the address and cehck';
    return result ;
}

但我不确定让浏览器一直打开是否可以,或者这个流程通常是个好主意

我对 puppeteer 的经验非常有限,我希望能从对 long 运行 puppeteer app

有更多经验和知识的人那里得到一些意见

确实,打开和关闭浏览器性能很重。如果您的脚本是 运行 在服务器上,您可以首先打开浏览器并每隔 X 小时在 check_adress 函数上执行一次 cron 作业 (@package node-cron)。

您可以通过以下方式关闭当前页面,而不是关闭浏览器:

await page.close();