|
|
Opslået på 30/11/2014 16.56.56
|
|
|
|

[mw_shl_code=java, sandt]/** * @author Jack.Wang
* */ import java.io.BufferedReader; import java.io.InputStreamReader; importere 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;
Søg efter webcrawlere offentlig klasse SearchCrawler implementerer Runnable {
/* * disallowListCache cache-robotten tillader ikke søgning i URL'er. Robot-protokollen sætter en robots.txt-fil i rodmappen på hjemmesiden, * Specificerer, hvilke sider på siden der kan søges i begrænset søge. * Søgeprogrammet bør springe disse områder over under søgningen, her er et eksempel på robots.txt: * # robots.txt for http://somehost.com/ User-agent: * Disallow: /cgi-bin/ * Afvis: /registrering # Forbyder robotter på registreringssiden * Ikke tilladt: /log ind */
privat HashMap<String, ArrayList<String>> disallowListCache = ny HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = ny ArrayList<String>(); Fejlmeddelelse ArrayList-resultat<String> = ny ArrayList<String>(); Søgte resultater String startUrl; Et udgangspunkt for at starte din søgning int maxUrl; Det maksimale antal URL'er, der er behandlet, String searchString; Strenge at søge efter boolsk kasusSensitiv = falsk; Om man skal være case-sensitiv eller ej boolean limitHost = falsk; Om man skal søge inden for en begrænset vært
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { returneringsresultat;
}
public void run() { // Start søgetråden crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Detekter URL-formatering private URL verifyUrl(String url) { Kun HTTP-URL'er behandles. hvis (!url.toLowerCase().startsWith("http://")) returner null; URL verifiedUrl = null; try { verifiedUrl = ny URL(url); } catch (Undtagelse e) { returner null; } returneretUrl;
}
Registrerer om robotten tillader adgang til den givne URL. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Få den vært, der giver RUL System.out.println("host="+host);
Få en cache af URL'er, som din vært ikke tillader søgning i ArrayList<String> disallowList = disallowListCache.get(host);
Hvis du ikke allerede har en cache, så download og cache den. hvis (disallowList == null) { disallowList = ny ArrayList<String>(); try { URL robotsFileUrl = ny URL ("http://" + host + "/robots.txt"); BufferedReader reader = ny BufferedReader( ny InputStreamReader(robotsFileUrl.openStream()));
Læs robotfilen for at oprette en liste over stier, der ikke må tilgås. Strenglinje; mens ((linje = reader.readLine()) != null) { hvis (line.indexOf("Disallow:") == 0) {// Indeholder det "Disallow:" Streng disallowPath = line.substring("Disallow:" .længde()); Få stien til afvist adgang
Tjek for kommentarer. int commentIndex = disallowPath.indexOf("#"); hvis (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Fjern kommentaren }
disallowPath = disallowPath.trim(); disallowList.add (disallowPath); } }
Cachestier, som denne vært ikke har adgang til. disallowListCache.put(host, disallowList); } catch (Undtagelse e) { returner sand; Der er ingen robots.txt filer i rodmappen på hjemmesiden, og den returnerer true } }
Strengfil = urlToCheck.getFile(); System.out.println("Fil getFile()="+file); for (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); hvis (file.startsWith(disallow)) { return false; } }
returner sand;
}
privat String downloadPage(URL pageUrl) { try { Åbn forbindelse til URL for læsning. BufferedReader reader = ny BufferedReader(ny InputStreamReader( pageUrl.openStream()));
Læs siden ind i bufferen. Strenglinje; StringBuffer pageBuffer = ny StringBuffer(); mens ((linje = reader.readLine()) != null) { pageBuffer.append(linje); }
return pageBuffer.toString(); } catch (Undtagelse e) { }
returner null;
}
Fjern "www" fra URL'en privat String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); hvis (indeks != -1) { returner url.substring(0, indeks + 3) + url.substring(index + 7); }
return (URL);
}
Parse siden og find linket privat ArrayList<String> henteLinks(URL pageUrl, Streng pageIndhold, HashSet crawledList, boolean limitHost) { Kompiler matchningsmønsteret for linket med regulære udtryk. Mønster p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = ny ArrayList<String>(); mens (m.find()) { Strenglink = m.group(1).trim();
hvis (link.length() < 1) { fortsæt; }
Spring linket til denne side over. hvis (link.charAt(0) == '#') { fortsæt; }
hvis (link.indexOf("mailto:") != -1) { fortsæt; }
if (link.toLowerCase().indexOf("javascript") != -1) { fortsæt; }
hvis (link.indexOf("://") == -1) { hvis (link.charAt(0) == '/') {// håndterer absolut link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } ellers { Strengfil = pageUrl.getFile(); hvis (file.indexOf('/') == -1) {// håndterer relative adresser link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } ellers { Strengsti = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + sti + link; } } }
int index = link.indexOf('#'); hvis (indeks != -1) { link = link.substring(0, indeks); }
link = fjernWwwFromUrl(link);
URL verifiedLink = verifyUrl(link); hvis (verificeretLink == null) { fortsæt; }
/* Hvis du begrænser værter, skal du udelukke de URL'er, der ikke opfylder kriterierne */ hvis (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { fortsæt; }
Spring de links over, der allerede er behandlet. hvis (crawledList.contains(link)) { fortsæt; }
linkList.add (link); }
returneren (linkList);
}
Søg i indholdet på en downloadet webside for at afgøre, om der er en specificeret søgestreng på siden
privat boolsk søgningStringMatches(StrengsideIndhold, String searchString, boolean caseSensitive) { String searchIndhold = sideIndhold; if (!caseSensitive) {// if case insensitive searchIndhold = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[]-termer = p.split(searchString); for (int i = 0; Jeg < termer.længde; i++) { hvis (caseSensitive) { hvis (searchContents.indexOf(terms) == -1) { return false; } } ellers { hvis (searchContents.indexOf(terms.toLowerCase()) == -1) { return false; } } }
returner sand;
}
Udfør selve søgeoperationen offentlig ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = ny HashSet<String>(); LinkedHashSet<String> toCrawlList = ny LinkedHashSet<String>();
hvis (maxUrls < 1) { errorList.add ("Ugyldig Max URL-værdi."); System.out.println("Ugyldige maksimale URL'er."); }
hvis (searchString.length() < 1) { errorList.add ("Manglende søgestreng."); System.out.println ("Manglende søgestreng"); }
hvis (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Flyt www ud af start-URL'en startUrl = fjernWwwFromUrl(startUrl);
toCrawlList.add (startUrl); mens (toCrawlList.size() > 0) {
hvis (maxUrls != -1) { hvis (crawledList.size() == maxUrls) { pause; } }
Få URL nederst på listen. String url = toCrawlList.iterator().next();
Fjern URL fra listen over crawl. toCrawlList.remove(url);
Konverter streng-url til URL-objekt. URL verifiedUrl = verifyUrl(url);
Spring URL'en over, hvis robotter ikke har tilladelse til den. hvis (!isRobotAllowed(verifiedUrl)) { fortsæt; }
Tilføj behandlede URL'er til crawledList crawledList.add(url); Streng pageContents = downloadPage(verifiedUrl);
hvis (pageContents != null && pageContents.length() > 0) { Få et gyldigt link fra siden ArrayList<String> links = henteLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(links);
hvis (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} returneringsresultat;
}
Hovedfunktion public static void main(String[] args) { SearchCrawler crawler = ny SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = ny tråd (crawler); System.out.println ("Start søgning..."); System.out.println("result:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Automatisk genereret catch block e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Antal downloads: 591)
-
2.png
(72.18 KB, Antal downloads: 596)
-
3.png
(188.46 KB, Antal downloads: 606)
Tidligere:PHP udgør 82,2% af de 100W største hjemmesiderNæste:Java Edition Web Source Code Viewer
|