|
|
Publicerad på 2014-11-30 16:56:56
|
|
|
|

[mw_shl_code=java, sant]/** * @author Jack.Wang
* */ importera java.io.BufferedReader; importera java.io.InputStreamReader; importera java.net.URL; importera java.util.ArrayList; importera java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.regex.Matcher; importera java.util.regex.Pattern;
Sök efter webbcrawlers publik klass SearchCrawler implementerar Runnable {
/* * disallowListCache-cacheroboten tillåter inte sökbara URL:er. Robotprotokollet sätter en robots.txt fil i webbplatsens rotkatalog, * Specificerar vilka sidor på webbplatsen som är sökbara för begränsad sökning. * Sökprogrammet bör hoppa över dessa områden under sökningen, här är ett exempel på robots.txt: * # robots.txt för http://somehost.com/ User-agent: * Disallow: /cgi-bin/ * Förbjud: /registrering # Förbjuder robotar på registreringssidan * Tillåt inte: /login */
privat HashMap<String, ArrayList<String>> disallowListCache = ny HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = ny ArrayList<String>(); Felmeddelande ArrayList-resultat<String> = ny ArrayList<String>(); Sökta resultat String startUrl; En startpunkt för att starta din sökning int maxUrl; Det maximala antalet behandlade URL:er String searchString; Strängar att söka efter boolean caseSensitive = falsk; Om man ska vara kasuskänslig eller inte boolean limitHost = false; Om man ska söka inom en begränsad värd
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { återvändande resultat;
}
public void run() { // Starta söktråden crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Upptäck URL-formatering privat URL verifyUrl(String url) { Endast HTTP-URL:er bearbetas. om (!url.toLowerCase().startsWith("http://")) återvända null; URL verifieradUrl = null; try { verifieradUrl = ny URL(url); } fångar (Undantag e) { återvända null; } returnerar verifieradUrl;
}
Känner av om roboten tillåter åtkomst till den givna URL:en. privat boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Hämta värden som ger RUL System.out.println("host="+host);
Skaffa en cache med URL:er som din värd inte tillåter att söka i ArrayList<String> disallowList = disallowListCache.get(host);
Om du inte redan har en cache, ladda ner och cacha den. om (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 för att skapa en lista över vägar som inte får nås. Stränglinje; medan ((linje = reader.readLine()) != null) { om (line.indexOf("Disallow:") == 0) {// Innehåller den "Disallow:" Sträng disallowPath = line.substring("Disallow:" .längd()); Få vägen för att förbjuda åtkomst
Kontrollera efter anteckningar. int commentIndex = disallowPath.indexOf("#"); om (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Ta bort kommentaren }
disallowPath = disallowPath.trim(); disallowList.add (disallowPath); } }
Cachevägar som denna värd inte får komma åt. disallowListCache.put(host, disallowList); } fångar (Undantag e) { återvänd sant; Det finns inga robots.txt filer i webbplatsens rotkatalog, och den returnerar true } }
Strängfil = urlToCheck.getFile(); System.out.println("File getFile()="+file); för (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { returnera falsk; } }
återvänd sant;
}
privat String downloadPage(URL pageUrl) { try { Öppna länken till URL för läsning. BufferedReader reader = ny BufferedReader(ny InputStreamReader( pageUrl.openStream()));
Läs sidan i bufferten. Stränglinje; StringBuffer pageBuffer = ny StringBuffer(); medan ((linje = reader.readLine()) != null) { pageBuffer.append(rad); }
return pageBuffer.toString(); } fångar (Undantag e) { }
återvända null;
}
Ta bort "www" från URL:en privat Sträng removeWwwFromUrl(Sträng url) { int index = url.indexOf("://www."); om (index != -1) { returnera url.substring(0, index + 3) + url.substring(index + 7); }
return (URL);
}
Genomsök sidan och hitta länken privat ArrayList<String> hämtaLänkar(URL sidUrl, Sträng sidaInnehåll, HashSet crawledList, boolean limitHost) { Kompliéra matchningsmönstret för länken med reguljära uttryck. Mönster p = Pattern.compile("<a\\s+href\\s*=\\s*\\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = ny ArrayList<String>(); medan (m.find()) { Stränglänk = m.group(1).trim();
if (link.length() < 1) { fortsätt; }
Hoppa över länken till den här sidan. if (link.charAt(0) == '#') { fortsätt; }
if (link.indexOf("mailto:") != -1) { fortsätt; }
if (link.toLowerCase().indexOf("javascript") != -1) { fortsätt; }
om (link.indexOf("://") == -1) { om (link.charAt(0) == '/') {// hanterar absolut länk = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + länk; } annars { Strängfil = pageUrl.getFile(); om (file.indexOf('/') == -1) {// hanterar relativa adresser länk = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + länk; } annars { Strängpath = file.substring(0, file.lastIndexOf('/') + 1); länk = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + sökväg + länk; } } }
int index = link.indexOf('#'); om (index != -1) { länk = länk.substring(0, index); }
länk = ta bortWwwFromUrl(länk);
URL verifieradLänk = verifieraUrl(länk); om (verifieradlänk == null) { fortsätt; }
/* Om du begränsar värdar, exkludera de URL:er som inte uppfyller kriterierna */ om (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { fortsätt; }
Hoppa över de länkar som redan har behandlats. if (crawledList.contains(link)) { fortsätt; }
linkList.add (länk); }
återvända (linkList);
}
Sök i innehållet på en nedladdad webbsida för att avgöra om det finns en specificerad söksträng på sidan
privat boolesk sökningStringMatches(SträngsidaInnehåll, String searchString, boolean caseSensitive) { String searchContents = sidInnehåll; if (!caseSensitive) {// if case insensitive searchContents = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[]-termer = p.split(searchString); för (int i = 0; Jag < termer.längd; i++) { if (caseSensitive) { om (searchContents.indexOf(terms) == -1) { returnera falsk; } } annars { om (searchContents.indexOf(terms.toLowerCase()) == -1) { returnera falsk; } } }
återvänd sant;
}
Utför själva sökoperationen publik 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>();
om (maxUrls < 1) { errorList.add ("Ogiltigt maxvärde för URL:er."); System.out.println("Ogiltigt Max-URL-värde."); }
om (searchString.length() < 1) { errorList.add ("Saknad söksträng."); System.out.println ("Saknad söksträng"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Flytta www från start-URL:en startUrl = ta bortWwwFromUrl(startUrl);
toCrawlList.add (startUrl); medan (toCrawlList.size() > 0) {
om (maxUrls != -1) { if (crawledList.size() == maxUrls) { paus; } }
Få URL längst ner på listan. String url = toCrawlList.iterator().next();
Ta bort URL från listan för att genomsöka sök. toCrawlList.remove(url);
Konvertera sträng-url till URL-objekt. URL verifiedUrl = verifyUrl(url);
Hoppa över URL om robotar inte får komma åt den. if (!isRobotAllowed(verifiedUrl)) { fortsätt; }
Lägg till bearbetade URL:er i crawledList crawledList.add(url); Sträng pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Få en giltig länk från sidan <String> ArrayList-länkar = hämtarLänkar(verifieradUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(länkar);
om (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} återvändande resultat;
}
Huvudfunktion public static void main(String[] args) { SearchCrawler crawler = ny SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Trådsökning = ny tråd (crawler); System.out.println ("Börja söka..."); System.out.println("result:"); search.start(); try { search.join(); } fånga (InterruptedException e) { TODO Autogenererad fångstblock e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Antal nedladdningar: 591)
-
2.png
(72.18 KB, Antal nedladdningar: 596)
-
3.png
(188.46 KB, Antal nedladdningar: 606)
Föregående:PHP står för 82,2 % av de största 100W-webbplatsernaNästa:Java Edition Web Source Code Viewer
|