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 或者sessionstprage 相关的
- 尽量使用远程支持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/