Javascript Apify-如何在数据集中包含失败的结果

Javascript Apify-如何在数据集中包含失败的结果,javascript,node.js,web-scraping,apify,Javascript,Node.js,Web Scraping,Apify,我们使用Apify Web Scraper actor创建URL验证任务,该任务返回输入URL、页面标题和HTTP响应状态代码。我们使用了一组5个测试URL:4个有效,1个不存在。成功的结果始终包含在数据集中,但从不包含失败的URL 日志记录表明失败的URL甚至无法访问pageFunction: 2021-05-05T14:50:08.489Z ERROR PuppeteerCrawler: handleRequestFunction failed, reclaiming failed requ

我们使用Apify Web Scraper actor创建URL验证任务,该任务返回输入URL、页面标题和HTTP响应状态代码。我们使用了一组5个测试URL:4个有效,1个不存在。成功的结果始终包含在数据集中,但从不包含失败的URL

日志记录表明失败的URL甚至无法访问pageFunction:

2021-05-05T14:50:08.489Z ERROR PuppeteerCrawler: handleRequestFunction failed, reclaiming failed request back to the list or queue {"url":"http://www.invalidurl.com","retryCount":1,"id":"XS9JTk8dYRM8bpM"}
2021-05-05T14:50:08.490Z   Error: gotoFunction timed out after 30 seconds.
2021-05-05T14:50:08.490Z       at PuppeteerCrawler._handleRequestTimeout (/home/myuser/node_modules/apify/build/crawlers/puppeteer_crawler.js:387:15)
2021-05-05T14:50:08.496Z       at PuppeteerCrawler._handleRequestFunction (/home/myuser/node_modules/apify/build/crawlers/puppeteer_crawler.js:329:26)
根据我们的设置,它最终会超时:

2021-05-05T14:50:42.052Z ERROR Request http://www.invalidurl.com failed and will not be retried anymore. Marking as failed.
2021-05-05T14:50:42.052Z Last Error Message: Error: gotoFunction timed out after 30 seconds.
我尝试将pageFunction中的代码包装在一个try/catch块中,但同样,由于无法访问无效URL的pageFunction,因此无法解决问题。是否仍有方法将失败结果包含在硬编码响应状态代码为“000”的数据集中?(请参阅下面的pageFunction代码。)如果我能提供任何其他信息,请告诉我,并提前感谢

async function pageFunction(context) {
    context.log.info("Starting pageFunction");
    // use jQuery as $
    const { request, jQuery: $ } = context;
    const { url } = request;
    context.log.info("Trying " + url);
    let title = null;
    let responseCode = null;

    try {
        context.log.info("In try block for " + url);
        title = $('title').first().text().trim();
        responseCode = context.response.status;

    } catch (error) {
        context.log.info("EXCEPTION for " + url);
        title = "";
        responseCode = "000";
    
    } 

    return {
        url,
        title,
        responseCode
    };
    
}
    
您可以使用:

然后,当所有重试失败时,您可以将其推送到:

handleFailedRequestFunction:async({request})=>{
//所有重试均失败
等待Apify.pushData({url:request.url,responseCode:'000'});
}

感谢您的及时回复。另外两个问题:(1)HandleFailedRequest功能是否仅在傀儡刮板中可用?(2) 上面的代码去哪里了。。。在pageFunction文本区域?@DanHelfman中,这实际上是需要直接使用SDK完成的代码,您将无法使用Puppeter scraper获得此功能,因为它是SDK的高级抽象。这将直接进入scraper实例化,如
new Apify.puppetercrawler({handleFailedRequestFunction:…})
在我发布了这个后续问题后,我意识到我需要使用SDK来满足我们的需求。谢谢你提供的信息。我会把你的答案记为正确答案。