|
|
Опубликовано 30.11.2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.regex.Matcher; import java.util.regex.Pattern;
Поиск веб-краулеров публичный класс SearchCrawler реализует Runnable {
/* * disallowCache robot cache ListCache не позволяет использовать поисковые URL. Протокол Robot устанавливает robots.txt-файл в корневой директории сайта, * Указывает, какие страницы сайта доступны для поиска с ограниченным поиском. * Программа поиска должна пропускать эти области во время поиска, вот пример robots.txt: * # robots.txt для http://somehost.com/ User-agent: * Запрещено: /cgi-bin/ * Запретить: /регистрацию # Запретить роботов на странице регистрации * Запрет: /login */
private HashMap<String, ArrayList<String>> disallowListCache = новый HashMap<String, ArrayList<String>>(); <String> ArrayList errorList = новый ArrayList<String>(); Сообщение об ошибке <String> Результат ArrayList = новый ArrayList<String>(); Результаты поиска Строка startUrl; Отправная точка для поиска int maxUrl; Максимальное количество обработанных URL String searchString; Строки для поиска булев падеж Чувствительный = ложный; Стоит ли учитывать регистры булевой пределHost = ложный; Стоит ли искать внутри ограниченного хостинга
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public<String> ArrayList getResult() { результат возврата;
}
Public Void run() { // Запустить поисковую тему crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Определить форматирование URL private URL verifyUrl(String url) { Обрабатываются только HTTP-адреса. if (!url.toLowerCase().startsWith("http://")) возврат нуля; URL verifiedUrl = null; попробовать { verifiedURL = новый URL(url); } catch (Исключение e) { возврат нуля; } вернуть проверенный URL;
}
Определяет, позволяет ли робот получить доступ к указанному URL. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Возьмите хоста, который даёт RUL System.out.println("host="+host);
Получите кэш с URL-адресами, которые ваш хост не разрешает искать <String> ArrayList disallowList = disallowListCache.get(host);
Если у вас ещё нет кэша, скачайте и кэшируйте его. если (disallowList == null) { disallowList = новый <String>ArrayList(); попробовать { URL robotsFileUrl = новый URL("http://" + хост + "/robots.txt"); BufferedReader = новый BufferedReader( новый InputStreamReader(robotsFileUrl.openStream()));
Прочитайте файл робота, чтобы создать список путей, к которым нельзя обращаться. Струнная линия; в то время как ((строка = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Содержит ли оно "Disallow:" Строка disallowPath = line.substring("Disallow:" .length()); Найдите путь к запрету доступа
Проверьте наличие примечаний. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Удалить комментарий }
disallowPath = disallowPath.trim(); disallowList.add (disallowPath); } }
Пути кэша, к которым этот хост не имеет доступа. disallowListCache.put (host, disallowList); } catch (Исключение e) { вернитесь на истину; В корневой папке сайта нет robots.txt-файлов, и он возвращает true } }
String file = urlToCheck.getFile(); System.out.println("Файл getFile()="+file); для (int i = 0; I < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { возврат ложным; } }
вернитесь на истину;
}
private String downloadPage(URL pageUrl) { попробовать { Откройте подключение к URL для чтения. BufferedReader = новый BufferedReader(новый InputStreamReader( pageUrl.openStream()));
Прочитайте страницу в буфер. Струнная линия; StringBuffer pageBuffer = новый StringBuffer(); в то время как ((строка = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } catch (Исключение e) { }
возврат нуля;
}
Удалите «www» из URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); если (индекс != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
Return (url);
}
Проанализируйте страницу и найдите ссылку private<String> ArrayList retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Скомпилируйте шаблон совпадения связи с регулярными выражениями. Шаблон p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
<String> ArrayList linkList = новый ArrayList<String>(); в то время как (m.find()) { String link = m.group(1).trim();
если (link.length() < 1) { продолжить; }
Пропустите ссылку на эту страницу. if (link.charAt(0) == '#') { продолжить; }
if (link.indexOf("mailto:") != -1) { продолжить; }
if (link.toLowerCase().indexOf("javascript") != -1) { продолжить; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// обрабатывает абсолютно ссылка = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + ссылка; } else { String file = pageUrl.getFile(); if (file.indexOf('/') == -1) {// обрабатывает относительные адреса ссылка = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + ссылка; } else { Путь строки = file.substring(0, file.lastIndexOf('/') + 1); ссылка = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + путь + ссылка; } } }
int index = link.indexOf('#'); если (индекс != -1) { link = link.substring(0, index); }
link = удалитьWwwFromUrl(ссылка);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { продолжить; }
/* Если вы ограничиваете количество хостов, исключайте те URL, которые не соответствуют критериям */ если (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { продолжить; }
Пропустите те ссылки, которые уже были обработаны. if (crawledList.contains(link)) { продолжить; }
linkList.add(ссылка); }
return (linkList);
}
Ищите содержимое загруженной веб-страницы, чтобы определить, есть ли на ней определённая поисковая строка
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Поиск по строкамСодержание = pageContents; if (!caseSensitive) {// если нечувствительный к регистру searchContents = pageContents.toLowerCase(); }
Шаблон p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); для (int i = 0; I < термины. Длина; i++) { если (caseSensitive) { if (searchContents.indexOf(термины)) == -1) { возврат ложным; } } else { if (searchContents.indexOf(термины).toLowerCase()) == -1) { возврат ложным; } } }
вернитесь на истину;
}
Выполните фактическую операцию поиска public<String> ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
<String> HashSet crawledList = новый HashSet<String>(); LinkedHashSet<String> toCrawlList = новый <String>LinkedHashSet();
if (maxUrls < 1) { errorList.add («Значение недопустимого максимального значения URL.»); System.out.println («Значение Invalid Max URLs.»); }
if (searchString.length() < 1) { errorList.add («Отсутствующая строка поиска.»); System.out.println («Отсутствующая строка поиска»); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Уберите www из стартового URL startUrl = удалитьWwwFromUrl(startUrl);
toCrawlList.add(startUrl); в то время как (toCrawlList.size() > 0) {
если (maxUrls != -1) { if (crawledList.size() == maxUrls) { перерыв; } }
Найдите URL внизу списка. String url = toCrawlList.iterator().next();
Удалите URL из списка для сканирования. toCrawlList.remove(url);
Преобразовать строковый url в объект URL. URL verifiedUrl = verifyUrl(url);
Пропускайте URL, если роботам нельзя к нему заходить. if (!isRobotAllowed(verifiedUrl)) { продолжить; }
Добавляйте обработанные URL в crawledList crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
если (pageContents != null && pageContents.length() > 0) { Получите действительную ссылку со страницы <String> ArrayList links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(ссылки);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} результат возврата;
}
Основная функция public static void main(String[] args) { SearchCrawler crawler = новый SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = новый Thread(crawler); System.out.println («Начать поиск...»); System.out.println("результат:"); search.start(); попробовать { search.join(); } catch (InterruptedException e) { TODO Автоматически сгенерированный блок ловли e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Количество скачиваний: 591)
-
2.png
(72.18 KB, Количество скачиваний: 596)
-
3.png
(188.46 KB, Количество скачиваний: 606)
Предыдущий:PHP занимает 82,2% топ-100W сайтовСледующий:Веб-просмотрщик исходного кода Java Edition
|