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

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ імпорт java.io.BufferedReader; імпорт java.io.InputStreamReader; імпорт 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 cache robot не дозволяє шукати URL. Протокол Robot встановлює robots.txt файл у кореневій директорії вебсайту, * Вказує, які сторінки сайту доступні для пошуку з обмеженим пошуком. * Пошукова програма повинна пропускати ці ділянки під час пошуку, ось приклад robots.txt: * # robots.txt для http://somehost.com/ User-agent: * Заборонено: /cgi-bin/ * Заборонено: /реєстрація # Заборонити роботів на сторінці реєстрації * Заборони: /login */
private HashMap<String, ArrayList<String>> disallowListCache = новий HashMap<рядок, ArrayList<String>>(); <String> ArrayList errorList = новий ArrayList<String>(); Повідомлення про помилку <String> Результат ArrayList = новий ArrayList<String>(); Результати пошуку 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() { результат повернення;
}
публічний запуск() { // Почати пошукову тему 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; } повернути 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://" + хост + "/robots.txt"); BufferedReader = новий BufferedReader( новий InputStreamReader(robotsFileUrl.openStream()));
Прочитайте файл робота, щоб створити список шляхів, до яких не дозволено звертатися. Струнна лінія; тоді як ((лінія = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Чи містить він "Disallow:" String disallowPath = line.substring("Disallow:" .довжина()); Знайдіть шлях до забороненого доступу
Перевірте наявність анотувань. int commentIndex = disallowPath.indexOf("#"); якщо (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Видалити коментар }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Кеш-шляхи, до яких цей хост не має доступу. disallowListCache.put (host, disallowList); } catch (Виняток e) { Повернення True; У кореневій директорії сайту немає robots.txt файлів, і він повертає true } }
String file = urlToCheck.getFile(); System.out.println("Файл getFile()="+file); для (int i = 0; я < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { повернення хибно; } }
Повернення True;
}
private String downloadPage(URL pageUrl) { try { Відкрийте з'єднання з URL для читання. BufferedReader = новий 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) { повернути 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()) { Зв'язок рядка = m.group(1).trim();
якщо (link.length() < 1) { продовжити; }
Пропустіть посилання на цю сторінку. if (link.charAt(0) == '#') { продовжити; }
if (link.indexOf("mailto:") != -1) { продовжити; }
if (link.toLowerCase().indexOf("javascript") != -1) { продовжити; }
якщо (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, індекс); }
link = removeWwwFromUrl(посилання);
URL verifiedLink = verifyUrl(link); якщо (verifiedLink == null) { продовжити; }
/* Якщо ви обмежуєте хостинг, виключайте ті URL, які не відповідають критеріям */ якщо (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { продовжити; }
Пропускайте ті посилання, які вже оброблені. якщо (crawledList.contains(link)) { продовжити; }
linkList.add(посилання); }
return (linkList);
}
Пошукайте вміст завантаженої веб-сторінки, щоб визначити, чи є на сторінці певний рядок пошуку
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Пошук рядківВміст = сторінкаЗміст; if (!caseSensitive) {// якщо нечутливий до регістру searchContents = pageContents.toLowerCase(); }
Патерн p = Pattern.compile("[\\s]+"); String[] терміни = p.split(searchString); для (int i = 0; I < терміни.довжина; i++) { якщо (caseSensitive) { if (searchContents.indexOf(терміни)) == -1) { повернення хибно; } } else { if (searchContents.indexOf(терміни).toLowerCase()) == -1) { повернення хибно; } } }
Повернення True;
}
Виконайте фактичну операцію пошуку public<String> ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
<String> HashSet crawledList = новий HashSet<String>(); LinkedHashSet<String> toCrawlList = новий <String>LinkedHashSet();
якщо (maxUrls < 1) { errorList.add ("Значення недійсних максимальних URL-адресів."); System.out.println ("Значення недійсних максимальних URL-адресів."); }
якщо (searchString.length() < 1) { errorList.add ("Відсутній рядок пошуку."); System.out.println ("Відсутній рядок пошуку"); }
if (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, якщо роботам заборонено до нього заходити. 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(посилання);
якщо (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(краулер); 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
|