|
|
Opublikowano 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;
Wyszukiwanie wyszukiwarek internetowych public class SearchCrawler implementuje Runnable {
/* * robot cache disallowListCache nie pozwala na wyszukiwanie adresów URL. Protokół Robot ustawia plik robots.txt w katalogu głównym strony internetowej, * Określa, które strony na stronie są przeszukiwalne dla ograniczonego wyszukiwania. * Program wyszukiwania powinien pominąć te obszary podczas poszukiwań, oto przykład robots.txt: * # robots.txt dla http://somehost.com/ User-agent: * Wyłącz: /cgi-bin/ * Zakaz: /rejestracji # Zakaz robotów na stronie rejestracji * Wyłącz: /login */
private HashMap<String, ArrayList<String>> disallowListCache = nowy HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = nowy ArrayList<String>(); Komunikat o błędzie Wynik ArrayList<String> = nowy ArrayList<String>(); Przeszukane wyniki String startUrl; Punkt wyjścia do rozpoczęcia poszukiwań int maxUrl; Maksymalna liczba przetworzonych adresów URL Wyszukiwanie ciągu znakówString; Ciągi do wyszukiwania przypadek boole'aSensitive = fałsz; Czy należy być wrażliwym na wielka a wielka litera granica boole'aHost = fałsz; Czy szukać w obrębie ograniczonego hosta
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { Zwróć wynik;
}
public void run() { // Rozpocznij wątek wyszukiwania crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Detect formatting URL private URL verifyUrl(String url) { Przetwarzane są tylko adresy HTTP URL. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nowy URL(url); } catch (Wyjątek e) { return null; } return verified URL;
}
Wykrywa, czy robot pozwala na dostęp do danego adresu URL. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Znajdź hosta, który daje RUL System.out.println("host="+host);
Zdobądź pamięć podręczną URL, której Twój host nie pozwala na wyszukiwanie ArrayList<String> disallowList = disallowListCache.get(host);
Jeśli jeszcze nie masz pamięci podręcznej, pobierz ją i zapisz. if (disallowList == null) { disallowList = nowy ArrayList<String>(); try { URL robotsFileUrl = nowy adres URL ("http://" + host + "/robots.txt"); BufferedReader = nowy BufferedReader( nowy InputStreamReader(robotsFileUrl.openStream()));
Przeczytaj plik robota, aby stworzyć listę ścieżek, do których nie ma dostępu. Struna; while ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Czy zawiera "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Znajdź ścieżkę do niedozwolonego dostępu
Sprawdź adnotacje. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Usuń komentarz }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Ścieżki pamięci podręcznej, do których ten host nie ma dostępu do środka. disallowListCache.put(host, disallowList); } catch (Wyjątek e) { return true; W katalogu głównym strony nie ma plików robots.txt i zwraca się prawdziwe } }
String file = urlToCheck.getFile(); System.out.println("File getFile()="+file); dla (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { return false; } }
return true;
}
private String downloadPage(URL pageUrl) { try { Otwórz połączenie z adresem URL do czytania. BufferedReader reader = nowy BufferedReader(nowy InputStreamReader( pageUrl.openStream()));
Czytaj stronę do bufora. Struna; StringBuffer pageBuffer = nowy StringBuffer(); while ((line = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } catch (Wyjątek e) { }
return null;
}
Usuń "www" z adresu URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Przeanalizuj stronę i znajdź link private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Skompiluj wzorzec dopasowania linku za pomocą wyrażeń regularnych. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = nowy ArrayList<String>(); while (m.find()) { String link = m.group(1).trim();
if (link.length() < 1) { kontynuacja; }
Pomiń link do tej strony. if (link.charAt(0) == '#') { kontynuacja; }
if (link.indexOf("mailto:") != -1) { kontynuacja; }
if (link.toLowerCase().indexOf("javascript") != -1) { kontynuacja; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// obsługuje absolutnie link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } else { String file = pageUrl.getFile(); jeśli (file.indexOf('/') == -1) {// obsługuje względne adresy link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } else { Ścieżka ciągu = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + path + link; } } }
int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, indeks); }
link = removeWwwFromUrl(link);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { kontynuacja; }
/* Jeśli ograniczasz hosty, wyklucz te URL, które nie spełniają kryteriów */ if (limitHost && !pageUrl.getHost().toLowerCase().równa się( verifiedLink.getHost().toLowerCase())) { kontynuacja; }
Pomiń linki, które już zostały przetworzone. if (crawledList.contains(link)) { kontynuacja; }
linkList.add(link); }
return (linkList);
}
Przeszukaj zawartość pobranej strony internetowej, aby sprawdzić, czy na niej znajduje się określony ciąg wyszukiwania
prywatne wyszukiwanie booleanStringMatches(Strona ciągu ciągów, Spryt, String searchString, boolean caseSensitive) { Wyszukiwanie w ciągu znakówZawartość = stronSaSa; jeśli (!caseSensitive) {// jeśli nie ma znaczenia na wielka litera searchContents = pageContents.toLowerCase(); }
Wzorzec p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); dla (int i = 0; i < terminy.length; i++) { jeśli (caseSensitive) { if (searchContents.indexOf(terms)) == -1) { return false; } } else { if (searchContents.indexOf(terms).toLowerCase()) == -1) { return false; } } }
return true;
}
Wykonaj faktyczną operację wyszukiwania <String> public ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = nowy HashSet<String>(); LinkedHashSet<String> toCrawlList = nowy LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Nieprawidłowa wartość Max URL."); System.out.println("Nieprawidłowe wartości Max URL."); }
if (searchString.length() < 1) { errorList.add("Brakujący ciąg wyszukiwania."); System.out.println("Brakujący ciąg wyszukiwania"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Przenieś www poza adres URL startowy startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { przerwę; } }
Pobierz adres URL na dole listy. String url = toCrawlList.iterator().next();
Usuń adres URL z listy do indeksowania. toCrawlList.remove(url);
Przekonwertuj URL ciągu na obiekt URL. URL verifiedUrl = verifyUrl(url);
Pomiń URL, jeśli roboty nie mają do niego dostępu. if (!isRobotAllowed(verifiedUrl)) { kontynuacja; }
Dodaj przetworzone adresy URL do crawledList crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null & pageContents.length() > 0) { Uzyskaj ważny link ze strony <String> ArrayList links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(links);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} Zwróć wynik;
}
Główna funkcja public static void main(String[] args) { Crawler SearchCrawler = nowy SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Wyszukiwanie wątków = nowy wątek (crawler); System.out.println("Zacznij wyszukiwać..."); System.out.println("result:"); search.start(); try { search.join(); } catch (InterruptedException e) { Automatycznie generowany blok chwytu TODO e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Liczba pobranych plików: 591)
-
2.png
(72.18 KB, Liczba pobranych plików: 596)
-
3.png
(188.46 KB, Liczba pobranych plików: 606)
Poprzedni:PHP stanowi 82,2% największych 100W stron internetowychNastępny:Przeglądarka kodu źródłowego Java Edition
|