如何正确处理404页面未找到错误

时间:2019-04-22 16:01:43

标签: java gradle javafx web-scraping

我正在使用Java和JavaFx构建网络抓取工具。我已经有一个使用JavaFx运行的应用程序。

我正在按照与此博客类似的步骤来构建网络抓取工具:https://ksah.in/introduction-to-web-scraping-with-java/

但是,我不想输入固定的URL,而是要输入任何URL和废话。为此,当找不到URL时,我需要处理错误。因此,当找不到URL时,我需要在应用程序控制台中显示“找不到页面”。

我对Java和XPath有非常基本的了解。因此,请尽量保持清晰。

这是我获得URL的那部分的代码:

    void search() {
            List<Course> v = scraper.scrape(textfieldURL.getText(), textfieldTerm.getText(),textfieldSubject.getText());
...
    }

然后我做

    try {
                HtmlPage page = client.getPage(baseurl + "/" + term + "/subject/" + sub);
    ...
    }catch (Exception e) {
            System.out.println(e);
}

在抓取文件中。

2 个答案:

答案 0 :(得分:2)

如果正确设置API,似乎WebResponse会抛出FailingHttpStatusCodeException。

  

如果服务器返回失败的状态代码和属性   WebClientOptions.setThrowExceptionOnFailingStatusCode(boolean)已设置   真实。

您还可以从Page获取getStatusCode(),然后致电HTTP status code获取http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/WebClient.html#getPage-java.lang.String-

答案 1 :(得分:1)

您添加的教程包含以下代码:

.....
WebClient client = new WebClient();  
client.getOptions().setCssEnabled(false);  
client.getOptions().setJavaScriptEnabled(false);  
try {  
  String searchUrl = "https://newyork.craigslist.org/search/sss?sort=rel&query=" + URLEncoder.encode(searchQuery, "UTF-8");
  HtmlPage page = client.getPage(searchUrl);
}catch(Exception e){
  e.printStackTrace();
}
.....

使用此代码,当client.getPage抛出任何错误(例如404)时,它将被捕获并打印到控制台。

正如您所说,您要打印“找不到页面”,这意味着我们必须捕获特定的异常并记录消息。本教程中使用的库是net.sourceforge.htmlunit,如您在此处(http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/FailingHttpStatusCodeException.html所见),getPage方法抛出FailingHttpStatusCodeException,其中包含HttpResponse中的状态代码。 (this htaccess testing tool

这意味着我们必须捕获FailingHttpStatusCodeException并检查状态代码是否为404。如果是,则记录该消息,如果不是,则记录例如堆栈跟踪信息。
仅出于简洁代码的原因,请尝试不要像本教程中那样捕获它们(就像在pokemon中一样),而应使用getPage方法中的IOException,FailingHttpStatusCodeException和MalformedURLException特定的捕获块。