You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
        })
    }
})

问题原因

  1. jQuery each不兼容异步逻辑:each方法不会等待内部的await执行完成,导致所有goto请求几乎同时发起,浏览器会中断未完成的请求以处理新请求,从而抛出ERR_ABORTED。
  2. 重复复用单页面实例:多次调用同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:35:53