始终打开 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)
pgAdmin 4 始终在浏览器中打开,而不是作为独立的桌面应用程序