nodejs puppeteer打开一个页面后,在点击跳转到另一个页面 怎么判断这么页面是不是所有的元素都已加载完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs puppeteer打开一个页面后,在点击跳转到另一个页面 怎么判断这么页面是不是所有的元素都已加载完成相关的知识,希望对你有一定的参考价值。

打开一个页面后,在点击跳转到另一个页面 怎么判断这么页面是否所有的元素都已加载完成

$(window).on("load",function()
//页面属性,图片,内容完全加载完,执行

$(document).ready(function()
//页面DOM结构加载完执行
参考技术A page.waitForNavigation( waitUntil: "networkidle0" )
不再有网络连接时触发(至少500毫秒后)

Chrome Headless puppeteer CPU 过多

【中文标题】Chrome Headless puppeteer CPU 过多【英文标题】:Chrome Headless puppeteer too much CPU 【发布时间】:2018-08-07 01:27:29 【问题描述】:

我在 nodejs 中有一个带有 puppeteer 的抓取算法,它同时抓取 5 个页面,当它完成一个页面时,它会从队列中拉下一个 url 并在同一页面中打开它。 CPU 始终处于 100% 状态。如何让 puppeteer 使用更少的 cpu?

此进程在具有 4gb RAM 和 2 个 vCPU 的 digitaloceans 液滴上运行。

我用一些 args 启动了 puppeteer 实例,试图让它更轻,但什么也没发生

 puppeteer.launch(
    args: ['--no-sandbox', "--disable-accelerated-2d-canvas","--disable-gpu"],
    headless: true,
  );

我可以提供任何其他参数来减少 CPU 占用率吗?

我也阻止了图片加载

await page.setRequestInterception(true);
page.on('request', request => 
  if (request.resourceType().toUpperCase() === 'IMAGE')
    request.abort();
  else
    request.continue();
);

【问题讨论】:

这是我现在遇到的同样问题,也在 DigitalOcean 上。你有没有发现什么技巧来照顾它? 【参考方案1】:

我的默认参数,请测试并告诉我这是否运行顺利。

  const options = 
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-accelerated-2d-canvas',
      '--no-first-run',
      '--no-zygote',
      '--single-process', // <- this one doesn't works in Windows
      '--disable-gpu'
    ],
    headless: true
  

  return await puppeteer.launch(options)

【讨论】:

似乎有很大帮助!谢谢! P.S.可用 args 及其含义的列表位于:peter.sh/experiments/chromium-command-line-switches 感谢@drmrbrewer 提供这个广泛的列表 谢谢,但是使用--no-sandbox会不会很危险? 还有其他人认为会有帮助的标志吗?【参考方案2】:

为了避免导致 CPU 使用率高的并行执行,我不得不使用顺序执行作业

p 迭代 NPM 包。就我而言,这不是问题,因为我的工作不会花费太多时间。

您可以根据具体情况使用 forEachSeriesma​​pSeries 函数。

【讨论】:

【参考方案3】:

有几个因素可以影响这一点。首先,检查您访问的站点是否使用大量 CPU。像画布和其他脚本这样的东西很容易消耗你的 CPU,尤其是在使用画布时。

如果您使用 docker 进行部署,请确保使用 dumb-init。 There's a nice repo here that goes into why you'd use such a thing,但本质上,在您的 docker 映像中分配的进程 ID 在处理终止时会出现一些问题:

EXPOSE 8080

ENTRYPOINT ["dumb-init", "--"]
CMD ["yarn", "start"]

这是我在 browserless.io 上看到并修复的,因为我使用 docker 来处理部署,CPU 使用率就是其中之一。

【讨论】:

我正在使用带有哑初始化的 docker,但它仍然占用了所有 4 个内核的 50%。没有使用画布,只打开了 1 个页面。 @LaurynasMališauskas 你的 dockerfile 有没有公开的?

以上是关于nodejs puppeteer打开一个页面后,在点击跳转到另一个页面 怎么判断这么页面是不是所有的元素都已加载完成的主要内容,如果未能解决你的问题,请参考以下文章

Puppeteer + Nodejs 通用全屏网页截图方案常用参数实现

如何使用 puppeteer 和 Node js 为 pdf 页面生成屏幕截图

puppeteer + nodejs 抓取网页内容

Puppeteer爬取Youtube列表页面

Puppeteer,保存网页和图像

Nodejs中分析web前端性能(window.performance)