【问题标题】:How to handle 404 page not found error properly?如何正确处理 404 page not found 错误?
【发布时间】:2019-09-11 19:35:05
【问题描述】:

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

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

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

这是我获取 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);
}

在刮板文件中。

【问题讨论】:

    标签: java gradle javafx web-scraping


    【解决方案1】:

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

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

    您也可以从Page 获取WebResponse 并调用getStatusCode() 以获取HTTP status code

    【讨论】:

    • 值得一提的是,如果仅禁用抛出异常选项,则可以在此处使用第二个选项。
    【解决方案2】:

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

    .....
    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/WebClient.html#getPage-java.lang.String-),getPage 方法会引发 FailingHttpStatusCodeException,其中包含来自 HttpResponse 的状态代码。 (http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/FailingHttpStatusCodeException.html)

    这意味着我们必须捕获 FailingHttpStatusCodeException 并检查状态码是否为 404。如果是,则记录消息,如果不是,则打印堆栈跟踪。
    只是为了干净的代码,尽量不要像教程中那样全部捕获它们(如在 pokemon 中),而是使用 getPage 方法中的 IOException、FailingHttpStatusCodeException 和 MalformedURLException 的特定捕获块。

    【讨论】:

    • 感谢您的及时回复。我只是想问一下“打印堆栈跟踪”是什么意思?
    • @user13 你看到了 e.printStackTrace();在教程的示例代码中?从异常中打印堆栈跟踪。另见:stackoverflow.com/questions/2560368/…
    • 感谢您的帮助!我知道现在该做什么了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多