Puppeteer 是一个 Node.js 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chrome 或 Chromium。它可以用于网页自动化、爬虫、测试等场景。
在循环内使用 Puppeteer 创建新选项卡时,可能会导致导航超时。这是因为每个新选项卡的创建和初始化都需要一定的时间,而循环内的操作可能会并发执行,导致资源竞争和超时问题。
可以通过设置 page.setDefaultNavigationTimeout
来增加导航超时时间。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// 增加导航超时时间
page.setDefaultNavigationTimeout(60000); // 60秒
for (let i = 0; i < 10; i++) {
const newPage = await browser.newPage();
await newPage.goto('https://example.com');
// 处理新页面
await newPage.close();
}
await browser.close();
})();
可以通过使用队列或限制并发数量来避免资源竞争。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const maxConcurrent = 3; // 最大并发数量
let currentConcurrent = 0;
const queue = [];
for (let i = 0; i < 10; i++) {
queue.push(async () => {
const newPage = await browser.newPage();
await newPage.goto('https://example.com');
// 处理新页面
await newPage.close();
});
if (currentConcurrent < maxConcurrent) {
currentConcurrent++;
const task = queue.shift();
task().finally(() => {
currentConcurrent--;
});
}
}
await Promise.all(queue.map(task => task()));
await browser.close();
})();
browser.newTab()
Puppeteer 还提供了 browser.newTab()
方法来创建新选项卡,这可能会更高效一些。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
for (let i = 0; i < 10; i++) {
const newTab = await browser.newTab();
await newTab.goto('https://example.com');
// 处理新页面
await newTab.close();
}
await browser.close();
})();
通过以上方法,可以有效解决在循环内使用 Puppeteer 创建新选项卡时导致的导航超时问题。
领取专属 10元无门槛券
手把手带您无忧上云