Как правильно обработать страницу 404 не найдена - PullRequest
0 голосов
/ 22 апреля 2019

Я строю веб-скребок, используя 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 ]

2 голосов
/ 22 апреля 2019

Похоже, что API сгенерирует исключение FailingHttpStatusCodeException, если вы настроите его правильно.

если сервер возвращает неверный код состояния И свойство WebClientOptions.setThrowExceptionOnFailingStatusCode (логический) установлен к истине.

Вы также можете получить WebResponse со страницы и вызвать getStatusCode () , чтобы получить код состояния HTTP .

1 голос
/ 22 апреля 2019

Учебник, который вы добавили, содержит следующий код:

.....
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), как в учебном пособии, но использовать специальные блоки catch для IOException, FailingHttpStatusCodeException и MalformedURLException из метода getPage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...