Puppeteer循环调用goto时抛出ERR_ABORTED异常的解决咨询
Puppeteer循环打开URL抛出ERR_ABORTED异常的解决方案
问题描述
单个URL使用Puppeteer可正常打开,但通过jQuery的each循环批量处理目标为_blank的链接时,每个请求都抛出ERR_ABORTED异常,代码如下:
$("a").each(async (index,element)=>{ if($(element).attr("target") == "_blank"){ // urls are valid let url = "https:"+$(element).attr("href"); let page = await browserPage.goto(url).then((response)=>{ console.log(response.status()) },(error)=>{ console.log(error) }) } })
问题原因
- jQuery each不兼容异步逻辑:
each方法不会等待内部的await执行完成,导致所有goto请求几乎同时发起,浏览器会中断未完成的请求以处理新请求,从而抛出ERR_ABORTED。 - 重复复用单页面实例:多次调用同一个
browserPage的goto方法,后一次导航会直接中断前一次未完成的请求,这是异常出现的核心原因。
解决方案
方案1:串行执行(推荐)
改用for...of循环替代jQueryeach,确保每个请求完成后再执行下一个,从根源避免请求冲突:
// 先把符合条件的链接转为数组 const targetLinks = $("a[target='_blank']").toArray(); for (const element of targetLinks) { const url = "https:" + $(element).attr("href"); try { const response = await browserPage.goto(url); console.log(`URL: ${url} 状态码: ${response.status()}`); // 可选:添加500-2000ms的随机延迟,模拟正常用户浏览节奏 await new Promise(resolve => setTimeout(resolve, Math.random() * 1500 + 500)); } catch (error) { console.log(`URL: ${url} 请求失败:`, error); } }
方案2:控制并发数(适合批量处理)
如果需要同时处理多个请求,可通过限制并发数避免资源耗尽,同时为每个请求创建独立页面实例:
const targetLinks = $("a[target='_blank']").toArray(); const maxConcurrency = 3; // 同时运行的请求数 let currentIndex = 0; let activeTasks = 0; async function processNextLink() { if (currentIndex >= targetLinks.length) return; activeTasks++; const element = targetLinks[currentIndex++]; const url = "https:" + $(element).attr("href"); try { // 为每个请求新建独立页面 const newPage = await browser.newPage(); const response = await newPage.goto(url); console.log(`URL: ${url} 状态码: ${response.status()}`); await newPage.close(); // 处理完成后关闭页面释放资源 } catch (error) { console.log(`URL: ${url} 请求失败:`, error); } finally { activeTasks--; processNextLink(); // 当前任务完成后,启动下一个任务 } } // 初始化并发任务 for (let i = 0; i < maxConcurrency; i++) { processNextLink(); }
额外注意事项
- 如果后续遇到目标网站的速率限制(如返回429状态码),可进一步调整延迟时间、随机化请求间隔,或配置浏览器的
user-agent、viewport等参数模拟正常用户行为。 - 避免无限制并发,防止浏览器内存占用过高或触发网站反爬机制。
内容的提问来源于stack exchange,提问作者Noble Eugene
相关产品推荐
相关产品推荐

