如何实现Puppeteer脚本遇页面错误时自动重定向至目标URL
解决Puppeteer页面错误/连接问题时自动重试加载的方案
嘿,我清楚你的需求——当页面碰到连接失败、Chrome的"Aw Snap!"这类崩溃错误时,自动重新加载目标URL。你现在已经能在catch里打日志了,接下来咱们把重试逻辑补上,还要覆盖几种常见的错误场景:
核心实现思路
- 封装一个带重试次数控制的导航函数,避免无限循环重试
- 监听页面的崩溃/严重错误事件,触发时自动重新加载
- 在
page.goto()的catch块中处理加载失败的情况
完整代码示例
const puppeteer = require('puppeteer'); // 封装带重试逻辑的导航函数 async function navigateWithRetry(page, targetUrl, maxRetries = 3) { let retryCount = 0; while (retryCount < maxRetries) { try { console.log(`尝试加载页面(第 ${retryCount + 1} 次)`); await page.goto(targetUrl, { waitUntil: 'networkidle2', // 等待网络空闲,确保页面加载完成 timeout: 30000 // 设置30秒超时,避免长时间卡住 }); console.log('页面加载成功!'); return true; // 加载成功,退出循环 } catch (error) { retryCount++; console.error(`第 ${retryCount} 次加载失败:`, error.message); if (retryCount >= maxRetries) { console.error('已达到最大重试次数,加载最终失败'); return false; } // 重试前短暂延迟2秒,避免频繁请求 await new Promise(resolve => setTimeout(resolve, 2000)); } } } (async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); // 监听页面崩溃/严重错误事件(比如"Aw Snap!") page.on('error', async (error) => { console.error('页面发生崩溃或严重错误:', error.message); console.log('准备重新加载页面...'); await navigateWithRetry(page, page.url()); // 重新加载当前页面 }); // 可选:监听页面内部的JavaScript错误,按需处理 page.on('pageerror', (error) => { console.warn('页面内部出现JS错误:', error.message); // 如果需要,这里也可以触发重试逻辑 }); // 替换成你的目标URL const targetUrl = 'https://your-target-url.com'; // 启动带重试的导航 const loadSuccess = await navigateWithRetry(page, targetUrl); if (!loadSuccess) { // 最终加载失败时的处理,比如关闭浏览器 await browser.close(); } // 这里可以添加你后续的页面操作逻辑 // ... })();
关键细节说明
navigateWithRetry函数:你可以通过maxRetries参数自定义最大重试次数,默认3次。每次失败后会延迟2秒再重试,避免给目标服务器造成过多请求压力。page.on('error')事件:这个事件会在页面崩溃、连接中断等严重错误时触发,比如Chrome显示"Aw Snap!"的时候,我们在这里调用重试函数重新加载页面。waitUntil与timeout:waitUntil: 'networkidle2'确保页面基本加载完成后才判定成功;timeout设置加载超时时间,防止脚本长时间卡在加载状态。- 错误边界处理:当达到最大重试次数后,脚本会返回失败状态,你可以根据需求做后续处理(比如关闭浏览器)。
这样修改后,你的脚本就能在遇到页面错误或连接问题时自动尝试重新加载了。
内容的提问来源于stack exchange,提问作者putu oka warma k
相关产品推荐
相关产品推荐

