Как я могу искать неработающие ссылки на сайте, используя Java? - PullRequest
2 голосов
/ 14 июля 2011

Я хотел бы сканировать некоторые веб-сайты в поисках битых ссылок, желательно с использованием Java. Любой намек, как я могу начать делать это?

(я знаю, что некоторые веб-сайты делают это, но я хочу создать свой собственный персонализированный лог-файл)

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

Написание веб-сканера не так просто, как простое чтение статического HTML, если страница использует JavaScript для изменения DOM, это становится сложным.Вам также нужно будет искать страницы, которые вы уже посетили, ака Spider Traps?Если сайт представляет собой чистый статический HTML, то используйте его ... Но если сайт использует Jquery и он большой, ожидайте, что он будет сложным.

Если ваш сайт статичен, мал и почти не содержит JS, используйте ответы, которые уже перечислены.

Или

Вы можете использовать Heritrix а затем позже проанализировал его crawl.log для 404-х годов. Heritrix doc на crawl.log

или Если вы больше всего пишете свои собственные:

Вы можете использовать что-то вроде HTMLUnit (у него есть движок JavaScript), чтобы загрузить страницу, а затем запросить объект DOM для ссылок.Затем поместите каждую ссылку в «непосещенную» очередь, затем извлеките ссылки из невидимой очереди, чтобы получить следующий URL для загрузки. Если страница не загружается, сообщите об этом.

Чтобы избежать дублирования страниц (ловушек для пауков), вы можете хэшировать каждую ссылку и сохранять таблицу хеш-адресов посещенных страниц (см. CityHash ).Перед помещением ссылки в очередь, которая не посещалась, проверьте ее по посещаемой хэш-таблице.

Чтобы не покидать свой сайт, убедитесь, что URL-адрес находится в списке безопасных доменов, прежде чем добавлять его в очередь для непосещенных пользователей.Если вы хотите убедиться, что ссылки вне домена хороши, сохраните их в очереди offDomain.Затем позже загрузите каждую ссылку из этой очереди, используя URL.getContent (url), чтобы увидеть, работают ли они (быстрее, чем с помощью HTMLUnit, и вам все равно не нужно анализировать страницу.).

0 голосов
/ 14 июля 2011
  1. Загрузка главной страницы сайта с использованием HTTP-клиента для Java
  2. Разбор HTML (так как это не правильно сформированный XML, вам может понадобиться сначала его очистить. С помощью что-то вроде tagsoup)
  3. Для каждого тега <a> получите его содержимое и попытайтесь подключиться к нему.

Если необходимо, повторите рекурсивно, если URL с <a> принадлежит вашему сайту. Обязательно храните URL-адреса, которые вы уже обработали, на карте, чтобы вы не делали это более одного раза.

0 голосов
/ 14 июля 2011

Напишите функцию, которая рекурсивно проверяет ссылки.Псевдокод:

function checklinks(String url){
     try{
         content=HTTP.getContents(url);
         String[] links=content.getAllRegexMatches('href="(http://.*?)"');
         foreach(links as String link)
              checklinks(link)
     } catch (Exception e) {
         System.out.println("Link "+url" failed");
     }
}

В зависимости от ссылок, вы должны завершить ссылку, переданную на следующую рекурсию, добавив URL относительно текущего URL.

...