如何检查或避免ERR_TIMED_OUT错误?网页抓取时偶发该错误的捕获与循环重试方案
捕获Puppeteer中的ERR_TIMED_OUT错误并实现重试逻辑
我来帮你解决这个问题——你遇到的ERR_TIMED_OUT是Puppeteer在等待响应超时后抛出的异常,我们可以通过try/catch捕获它,再配合循环实现自动重试的逻辑。下面是具体的解决方案:
核心思路
page.waitForResponse在超时未匹配到目标响应时会抛出TimeoutError,我们可以用try/catch块捕获这个错误,然后在循环中重复执行请求逻辑,直到成功或达到最大重试次数。
修改后的完整代码示例
把你的响应等待逻辑封装成一个带重试的异步函数,这样更易复用和维护:
async function waitForCloudfrontResponse(page, maxRetries = 3) { let retryCount = 0; while (retryCount < maxRetries) { try { console.log(`Waiting for cloudfront response (attempt ${retryCount + 1})...`); // 显式设置超时时间(默认30000ms,可根据需求调整) const response = await page.waitForResponse( (response) => response.url().includes('cloudfront.net'), { timeout: 30000 } ); console.log(`Response received: ${response.status()}`); return response; } catch (error) { // 判断是否是超时相关错误 const isTimeoutError = error.name === 'TimeoutError' || error.message.includes('ERR_TIMED_OUT'); if (isTimeoutError) { retryCount++; console.log(`Request timed out (ERR_TIMED_OUT), retrying... (${retryCount}/${maxRetries})`); // 重试前短暂延迟,避免频繁请求给服务器造成压力 await new Promise(resolve => setTimeout(resolve, 2000)); } else { // 非超时错误直接抛出,不重试(比如网络连接错误等) throw error; } } } // 所有重试都失败时抛出最终错误 throw new Error(`Failed to get cloudfront response after ${maxRetries} attempts`); } // 使用示例(替换你原来的响应等待代码) // const response = await waitForCloudfrontResponse(page);
关键细节说明
- 重试次数控制:通过
maxRetries参数设置最大重试次数,避免无限循环 - 超时时间自定义:在
page.waitForResponse中显式设置timeout,比默认值更灵活 - 精准捕获错误:只针对超时类错误进行重试,其他异常(如网络断开)直接抛出,避免无效重试
- 延迟重试:加入短暂的延迟,防止短时间内重复请求触发网站反爬机制
关于crbug日志的说明
你看到的crbug/1173575, non-JS module files deprecated是Chrome内核的警告信息,不是功能错误,不会影响你的爬虫流程。如果觉得日志太冗余,可以在启动Puppeteer时调整日志级别来屏蔽:
const browser = await puppeteer.launch({ args: ['--disable-dev-shm-usage'], defaultViewport: null, // 只输出警告及以上级别的日志 logLevel: 'warn', // 关闭标准输出/错误流的打印 dumpio: false });
内容的提问来源于stack exchange,提问作者regan
相关产品推荐
相关产品推荐

