Проверить наличие битых ссылок

Я пытаюсь найти все неработающие ссылки на веб-странице с помощью Java. Вот код:

   private static boolean isLive(String link){

    HttpURLConnection urlconn = null;
    int res = -1;
    String msg = null;
    try{

        URL url = new URL(link);
        urlconn = (HttpURLConnection)url.openConnection();
        urlconn.setConnectTimeout(10000);
        urlconn.setRequestMethod("GET");
        urlconn.connect();
        String redirlink = urlconn.getHeaderField("Location");
        System.out.println(urlconn.getHeaderFields());
        if(redirlink != null && !url.toExternalForm().equals(redirlink))
            return isLive(redirlink);
        else
            return urlconn.getResponseCode()==HttpURLConnection.HTTP_OK;

    }catch(Exception e){

      System.out.println(e.getMessage());
      return false;

    }finally{

        if(urlconn != null)
            urlconn.disconnect();

    }


}

public static void main(String[] s){

    String link = "http://www.somefakesite.net";
    System.out.println(isLive(link));

}

Код, указанный с http://nscraps.com/Java/146-program-code-broken-link-checker.htm.

Этот код дает статус HTTP 200 для всех веб-страниц, включая неработающие. Например, http://www.somefakesite.net/ дает следующие поля заголовка:

{null=[HTTP/1.1 200 OK], Date=[Sun, 15 May 2011 18:51:29 GMT], Transfer-Encoding=[chunked], Keep-Alive=[timeout=4, max=100], Connection =[Keep-Alive], Content-Type=[text/html], Server=[Apache/2.2.15 (Win32) PHP/5.2.12], X-Powered-By=[PHP/5.2.9-1] }

Даже если таких сайтов не существует, как классифицировать ссылку как битую?


person user754740    schedule 15.05.2011    source источник
comment
вы на 100% уверены, какие сайты тестируете? попробуйте добавить System.out.println(link); вверху этого метода.   -  person Mat    schedule 15.05.2011
comment
@Mat: Да, я добавил оператор печати, и он проверяет правильную ссылку, которая передается из основного   -  person user754740    schedule 16.05.2011


Ответы (1)


Возможно, проблема в том, что в настоящее время многие поставщики веб-серверов и DNS обнаруживают эти «битые» ссылки и перенаправляют вас на свои «ненайденные» страницы.

Проверьте его на URL-адресе, который, как вы знаете, отправляет код 404 (он показывает исходное сообщение браузера).


РЕДАКТИРОВАТЬ, чтобы ответить на комментарий автора (поскольку он слишком длинный, чтобы поместиться в комментарий): я не вижу простого ответа на вашу проблему, но есть несколько разных типов сбоев:

  • Для сбоев DNS, которые перенаправляются (URL-адрес, который не может быть найден DNS, и вы перенаправляетесь на другую страницу). Все перенаправления (если вас перенаправляют), скорее всего, будут вести на одну и ту же страницу (предоставленную вашим интернет-провайдером/DNS-провайдером), вы можете это проверить. Конечно, если вы попытаетесь подключиться к другому провайдеру ISP/DNS, страница может быть другой. Если вас не перенаправляют, вы получите ошибку подключения.
  • Для сервера с действующими DNS, но не работающего (например, google.com выходит из строя), должна быть ошибка подключения.
  • Для ресурса («страницы»), отсутствующего на сервере, это сложнее. 404 означает, что он неисправен, но если сервер его не отправляет, то больше ничего не нужно делать. Перенаправление может быть полезно, чтобы пометить ссылку как сомнительную, но позже ее следует проверить вручную, потому что она используется не только для захвата отсутствующих ссылок (например, www.google.com перенаправляет меня на www.google.es).
person SJuan76    schedule 15.05.2011
comment
Кроме того, если бы это было не так, somefakesite.com вернул бы ошибку соединения, а не статус 404 (поскольку отсутствующий ресурс на работающем сервере — это не то же самое, что отсутствующий сервер). - person SJuan76; 15.05.2011
comment
Я протестировал 2 неработающие ссылки, и обе они отображали разный статус. 1. Статус legacy.ncsu.edu/ECE566 {null=[HTTP/1.1 404 Not Found] — 404 2. somefakewebsite.net {null=[HTTP/1.1 200 OK] статус - 200 Теперь вопрос в том, должен ли я иметь проверить заголовок домена на наличие перенаправленных битых ссылок? Ценю вашу помощь. - person user754740; 16.05.2011
comment
@user754740 user754740 Я попытался ответить, отредактировав свой пост; к сожалению, я не знаю простого решения. - person SJuan76; 17.05.2011