puppeteer使用一些技巧简单说明

puppeteer 是一个nodejs 包提供了方便的基于devtools 协议进行chrome/chromium 控制,puppeteer 默认运行在无头模式
以下是对于puppeteer使用的一些简单总结

一些问题

  • browser && page 对象复用问题

实际上还是结合实际,个人建议减少复用,除非自己对于browser && page 进行了比较明确的资源管理,否则运行可能会有各类
异常信息(有些可能是bug,有些可能是因为安装依赖的问题,有些可能是自己对于这些对象维护问题)

  • 按需配置user-agent

这个实际上再一些场景还是很重要的,尤其一些web 站点可能会基于一些请求头进行重定向以及判断的(一般会基于nginx 等工具)

const page = await browser.newPage();
await page.setUserAgent(
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
);
  • 如果是web 爬虫场景,尽量对于认证信息进行cache

这个可以减少账户被封的问题,对于认证信息的cache,一般就是cookie 以及localstorage 或者sessionstorage 相关的

  • 尽量使用远程支持devtools 协议的服务,比如browserless

基于远程devtools协议服务的好处就很明显了,我们可以基于策略进行灵活的资源路由以及使用云服务提升puppeteer 处理的能力以及稳定性

  • puppeteer 内部的一些请求尽量合并

异步编程模型,对于使用上我们对于异步请求处理的合并可以提升性能,比如使用page.evaluate,对于一些await 进行合并
通过page.evaluate

const buttonText = await page.evaluate(() => {
  const $button = document.querySelector('.buy-now');
  const clicked = $button.click();
 
  return $button.innerText;
});

通过Promise.all

const [response] = await Promise.all([
  page.waitForNavigation(),
  page.click('a.some-link')
]);

说明

以上是一些简单说明,checklyhq 提供了不少实践,很值得学习下

参考资料

https://docs.browserless.io/Libraries/puppeteer-library
https://pptr.dev/
https://docs.browserless.io/Recipes/setting-a-user-agent
https://docs.browserless.io/Hosted-Service/best-practices
https://www.checklyhq.com/learn/headless/basics-puppeteer-intro/
https://www.checklyhq.com/learn/headless/avoiding-hard-waits/
https://www.checklyhq.com/learn/headless/managing-cookies/

posted on 2024-05-18 22:25  荣锋亮  阅读(34)  评论(0编辑  收藏  举报

导航