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

Posted

技术标签:

【中文标题】始终打开 puppeteer 浏览器作为全局实例与为每个请求使用新的浏览器实例【英文标题】:having puppeteer browser as global instance open at all time vs using new browser instance for each request 【发布时间】:2022-01-20 16:08:42 【问题描述】:

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

这是我的代码的简化版本,我有两个功能

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(); 

我觉得为每个地址打开和关闭浏览器非常耗费时间/资源,所以我想也许我可以一直打开一个全局浏览器,然后在浏览器中打开和关闭选项卡,或者甚至使用同一个选项卡...类似的东西

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 方面的经验非常有限,我希望得到对长期运行 puppeteer 应用程序有更多经验和知识的人的一些意见

【问题讨论】:

是的,我会保持相同的 puppeteer 实例继续运行。您可以使用const page = await browser.newPage(); 在同一实例中创建新页面,也可以使用await page.goto('https://example.com'); 转到现有页面上的新网址。您显然不想在不关闭页面或重用它们的情况下放弃页面,因为这会累积越来越多的内存使用量。 @jfriend00 thanx ,您如何看待在它的父函数 try/catch 中运行 puppeteer 函数......而不是在 puppeteer 函数中使用单独的 try/catch ......甚至可能有第二次尝试/捕获第一个(不同的功能)?我在想,如果出现导航错误或类似情况,我最终可能会在浏览器中打开很多标签页 我不太明白你在问什么try/catch。您将try/catch 放在您想要或需要处理错误的任何级别。在某些情况下,您可以拥有多个级别的try/catch 【参考方案1】:

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

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

await page.close();

【讨论】:

以上是关于始终打开 puppeteer 浏览器作为全局实例与为每个请求使用新的浏览器实例的主要内容,如果未能解决你的问题,请参考以下文章

爬虫应用示例--puppeteer数据抓取的实现方法(续2)

puppeteer自动化测试

pgAdmin 4 始终在浏览器中打开,而不是作为独立的桌面应用程序

在第二页上通过 puppeteer 运行灯塔时浏览器实例被杀死

Puppeteer 无法打开 chrome(出现错误)

Puppeteer:如何存储会话(包括 cookie、页面状态、本地存储等)并稍后继续?