|
|
Zverejnené 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;
Vyhľadávanie webových prehľadávačov public class SearchCrawler implements Runnable {
/* * disallowListCache cache robot neumožňuje vyhľadávanie v URL adresách. Protokol Robot umiestňuje robots.txt súbor do koreňového adresára webovej stránky, * Špecifikuje, ktoré stránky na stránke sú vyhľadávateľné pre obmedzené vyhľadávanie. * Vyhľadávací program by mal tieto oblasti počas vyhľadávania preskočiť, tu je príklad robots.txt: * # robots.txt pre http://somehost.com/ User-agent: * Disallow: /cgi-bin/ * Zakaz: /registrácia # Zakaz robotov na registračnej stránke * Disallow: /login */
private HashMap<String, ArrayList<String>> disallowListCache = nový HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = nový ArrayList<String>(); Chybová správa Výsledok ArrayList<String> = nový ArrayList<String>(); Vyhľadávané výsledky String startUrl; Východiskový bod na začatie vášho hľadania int maxUrl; Maximálny počet spracovaných URL String searchString; Reťazce na vyhľadávanie booleovský caseSensitive = nepravda; Či by ste mali byť citliví na veľké a malé písmená booleovský limitHostiteľ = nepravda; Či hľadať v rámci obmedzeného hostiteľa
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { vrátiť výsledok;
}
public void run() { // Spustiť vyhľadávacie vlákno crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Detekcia formátovania URL private URL verifyUrl(String url) { Spracovávajú sa iba HTTP URL. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nová URL(url); } catch (Výnimka e) { return null; } return overifiedUrl;
}
Detekuje, či robot umožňuje prístup k danej URL. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Získaj hostiteľa, ktorý dáva RUL System.out.println("host="+host);
Získajte cache URL, ktoré váš hosting neumožňuje vyhľadávať ArrayList<String> disallowList = disallowListCache.get(host);
Ak ešte nemáte cache, stiahnite si ju a uložte do cache. if (disallowList == null) { disallowList = nový ArrayList<String>(); try { URL robotsFileUrl = nová URL ("http://" + host + "/robots.txt"); BufferedReader = nový BufferedReader( nový InputStreamReader(robotsFileUrl.openStream()));
Prečítajte si robotický súbor, aby ste vytvorili zoznam ciest, ku ktorým nie je možné pristupovať. Strunová linka; while ((line = reader.readLine()) != null) { ak (line.indexOf("Disallow:") == 0) {// Obsahuje "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Získajte cestu k zakázanému prístupu
Skontrolujte poznámky. int commentIndex = disallowPath.indexOf("#"); ak (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Odstrániť komentár }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Cache cesty, ku ktorým tento hostiteľ nemá prístup. disallowListCache.put(hostiteľ, disallowList); } catch (Výnimka e) { return true; V koreňovom adresári webu nie sú žiadne robots.txt súbory a vracia true } }
String file = urlToCheck.getFile(); System.out.println("File getFile()="+file); pre (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 { Otvorte prepojenie na URL na čítanie. BufferedReader reader = nový BufferedReader(nový InputStreamReader( pageUrl.openStream()));
Čítaj stránku do bufferu. Strunová linka; StringBuffer pageBuffer = nový StringBuffer(); while ((line = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } catch (Výnimka e) { }
return null;
}
Odstráňte "www" z URL adresy private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); ak (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Analyzuj stránku a nájdi odkaz private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Skompilujte zodpovedajúci vzor spojenia s regulárnymi výrazmi. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = nový ArrayList<String>(); zatiaľ čo (m.find()) { String link = m.group(1).trim();
ak (link.length() < 1) { pokračovať; }
Preskočte odkaz na túto stránku. if (link.charAt(0) == '#') { pokračovať; }
if (link.indexOf("mailto:") != -1) { pokračovať; }
if (link.toLowerCase().indexOf("javascript") != -1) { pokračovať; }
ak (link.indexOf("://") == -1) { ak (link.charAt(0) == '/') {// spracováva absolútne link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } inak { String file = pageUrl.getFile(); ak (file.indexOf('/') == -1) {// spracováva relatívne adresy link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } inak { Cesta reťazca = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + path + link; } } }
int index = link.indexOf('#'); ak (index != -1) { link = link.substring(0, index); }
link = removeWwwFromUrl(link);
URL verifiedLink = verifyUrl(link); ak (verifiedLink == null) { pokračovať; }
/* Ak obmedzíte hosty, vynechajte tie URL, ktoré nespĺňajú kritériá */ ak (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { pokračovať; }
Preskočte tie odkazy, ktoré už boli spracované. if (crawledList.contains(link)) { pokračovať; }
linkList.add(link); }
return (linkList);
}
Prehľadajte obsah stiahnutej webovej stránky, aby ste zistili, či sa na stránke nachádza špecifikovaný vyhľadávací reťazec
súkromné boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Vyhľadávanie reťazcaObsah = stránkaObsah; if (!caseSensitive) {// if caseSensitive) searchContents = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); pre (int i = 0; I < terms.length; i++) { ak (caseSensitive) { if (searchContents.indexOf(terms)) == -1) { return false; } } inak { if (searchContents.indexOf(terms).toLowerCase()) == -1) { return false; } } }
return true;
}
Vykonajte skutočnú vyhľadávaciu operáciu public<String> ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = nový HashSet<String>(); LinkedHashSet<String> toCrawlList = nový LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Hodnota neplatných maximálnych URL."); System.out.println("Hodnota neplatných maximálnych URL."); }
ak (searchString.length() < 1) { errorList.add("Chýbajúci vyhľadávací reťazec."); System.out.println("Chýbajúci vyhľadávací reťazec"); }
ak (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Presuňte www z úvodnej URL startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { prestávka; } }
URL nájdete na spodku zoznamu. String url = toCrawlList.iterator().next();
Odstráňte URL zo zoznamu na prehľadávanie. toCrawlList.remove(url);
Preveďte URL reťazca na URL objekt. URL verifiedUrl = verifyUrl(url);
Preskočite URL, ak roboty nemajú prístup k nej. if (!isRobotAllowed(verifiedUrl)) { pokračovať; }
Pridajte spracované URL do crawledList crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null & pageContents.length() > 0) { Získajte platný odkaz zo stránky <String> ArrayList links = retrieveLinks(verifiedUrl, stránkContents, crawledList, limitHost);
toCrawlList.addAll(links);
ak (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} vrátiť výsledok;
}
Hlavná funkcia public static void main(String[] args) { SearchCrawler crawler = nový SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Vyhľadávanie vlákien = nové vlákno (crawler); System.out.println("Začni hľadať..."); System.out.println("výsledok:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Automaticky generovaný záchytný blok e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Počet stiahnutí: 591)
-
2.png
(72.18 KB, Počet stiahnutí: 596)
-
3.png
(188.46 KB, Počet stiahnutí: 606)
Predchádzajúci:PHP tvorí 82,2 % z top 100W webových stránokBudúci:Java Edition Web Source Code Viewer
|