puppeteer - 如果时间过长或连接超时问题,如何跳过按 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
}
解决方案
您可以使用超时。
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';
}
推荐阅读
- django - DRF - 在动作响应中将自定义数据添加到序列化程序
- python - 将集群与基本事实进行比较
- python - 当我使用 threading.Lock 锁定线程操作时,为什么它的输出没有 0?
- swiftui - 为什么 SwiftUI 代码在 iPhone 而不是 iPad 上运行/重新加载?
- python - Scipy中的拟合分布
- cordova - 离子电容器 404 错误 - inappbrowser 不在 npm 注册表中
- sql-server - 从 SQL 中的链接服务器错误获取数据的问题
- java - JAX-WS 客户端:无法创建服务对象(org.apache.cxf.jaxws.spi.ProviderImpl 不是子类型)
- powershell - Powershell IIS 审计脚本
- reactjs - 如何将其他依赖项传递给 React 自定义挂钩