|
|
Публикувано в 30.11.2014 г. 16:56:56 ч.
|
|
|
|

[mw_shl_code=java, вярно]/** * @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;
Търсене на уеб краулъри public class SearchCrawler реализира Runnable {
/* * disallowListCache робот за кеширане не позволява търсени 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 = нов <String>ArrayList(); Съобщение за грешка <String> ArrayList резултат = нов ArrayList<String>(); Търсени резултати String startUrl; Отправна точка, в която да започнете търсенето си int maxUrl; Максималният брой обработени URL адреси String searchString; Низове за търсене булев падежЧувствителен = невярно; Дали да бъде чувствителен към регистри булево ограничениеHost = false; Дали да търсите в рамките на ограничен хост
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 URL адреси. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedURL = нов URL(url); } catch (Изключение e) { return null; } return verifiedUrl;
}
Открива дали роботът позволява достъп до дадения 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(); try { URL robotsFileUrl = нов URL("http://" + host + "/robots.txt"); Четец на BufferedReader = нов BufferedReader( нов InputStreamReader(robotsFileUrl.openStream()));
Прочетете файла на робота, за да създадете списък с пътища, които не са разрешени за достъп. Струнна линия; докато ((линия = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Съдържа ли "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Намери пътя към забранения достъп
Проверете за анотации. int commentIndex = disallowPath.indexOf("#"); ако (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; < disallowList.size(); i++) { String disallow = disallowList.get(i); ако (file.startsWith(disallow)) { отговорът е фалшив; } }
върни се истински;
}
private String downloadPage(URL pageUrl) { try { Отворете връзка към URL за четене. BufferedReader reader = нов BufferedReader(нов InputStreamReader( pageUrl.openStream()));
Прочети страницата в буфера. Струнна линия; StringBuffer pageBuffer = нов StringBuffer(); докато ((линия = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } catch (Изключение e) { }
return null;
}
Премахнете "www" от URL адреса private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); ако (индекс != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
връщане (url);
}
Анализирай страницата и намери линка private<String> ArrayList retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Компилирайте модела на съвпадение на връзката с регулярни изрази. Pattern 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) { продължете; }
Пропуснете линка към тази страница. ако (link.charAt(0) == '#') { продължете; }
ако (link.indexOf("mailto:") != -1) { продължете; }
ако (link.toLowerCase().indexOf("javascript") != -1) { продължете; }
ако (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// се обработва абсолютно линк = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + линк; } else { String file = pageUrl.getFile(); ако (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 = removeWwwFromUrl(линк);
URL verifiedLink = verifyUrl(link); ако (verifiedLink == null) { продължете; }
/* Ако ограничавате хостовете, изключвайте тези URL адреси, които не отговарят на критериите */ ако (limitHost && !pageUrl.getHost().toLowerSign().equals( verifiedLink.getHost().toLowerCase())) { продължете; }
Пропуснете тези връзки, които вече са обработени. ако (crawledList.contains(link)) { продължете; }
linkList.add(линк); }
return (linkList);
}
Търсете съдържанието на изтеглена уеб страница, за да определите дали има определен низ за търсене на страницата
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Низово търсенеСъдържание = страницаСъдържание; ако (!caseSensitive) {// ако е нечувствителен към регистри searchContents = pageContents.toLowerCase(); }
Шаблон p = Pattern.compile("[\\s]+"); String[] термини = p.split(searchString); за (int i = 0; I < термини.Дължина; i++) { ако (caseSensitive) { ако (searchContents.indexOf(термини)) == -1) { отговорът е фалшив; } } else { ако (searchContents.indexOf(термини).toLowerCase()) == -1) { отговорът е фалшив; } } }
върни се истински;
}
Извърши действителната операция за търсене public<String> ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
<String> HashSet crawledList = нов HashSet<String>(); <String> LinkedHashSet toCrawlList = нов <String>LinkedHashSet();
ако (maxUrls < 1) { errorList.add ("Стойност на Invalid Max URLs."); System.out.println ("Стойност на невалидни максимални URL адреси."); }
ако (searchString.length() < 1) { errorList.add ("Липсващ низ за търсене."); System.out.println ("Липсващ низ за търсене"); }
ако (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Преместете www от началния URL startUrl = removeWwwFromUrl(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, ако роботите нямат достъп до него. ако (!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(връзки);
ако (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(crawler); System.out.println ("Започнете търсенето..."); System.out.println("резултат:"); search.start(); try { 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 Уеб прегледач на изходен код
|