首页 > 解决方案 > 如果时间过长或连接超时问题,如何跳过按 URL 导航

问题描述

我正在抓取一个网站以收集 URL 列表,然后浏览这些 URL 并再次收集一些数据。在我浏览一个死亡的 URL 之前,一切都很完美。我的整个抓取过程都被破坏并丢失了收集的数据。当需要很长时间或连接超时时,他们是否有任何方法可以跳过导航该页面,例如这样的问题

 for (let i = 0, n= listURL.length; i < n; i++) {
    await page.goto(listURL[i], { waitUntil: 'networkidle2' }); //<--- crash here 
    console.log(`navigate ${URLS[i]}`);
    //collect data
    address = await page.url() // <-- here also crashed
  }

标签: puppeteer

解决方案


您可以使用超时

在此处输入图像描述

for (let i = 0, n= listURL.length; i < n; i++) {
    try {
        await page.goto(listURL[i], { waitUntil: 'networkidle2', timeout: 100 }); //<--- crash here 
    } catch (err) {
        if(err.name === 'TimeoutError') {
            continue; // or do some thing
        } else {
            throw err; // or do some thing
        }
    }
    console.log(`navigate ${URLS[i]}`);
  }

更新 1

对于你的例子。这个问题在这里是因为你处理了一种类型的错误,所以如果page.goto()抛出另一个类型的错误你将不会处理它,所以应用程序将跳过address = await page.url();并去throw err处理它,你将捕获任何类型的错误。

try {
    await page.goto(websiteTempUrl, {
        waitUntil: 'networkidle2',
        timeout: 70000,
    });
    address = await page.url();
} catch (err) {
    address = 'dead linked';
}

推荐阅读