|
|
Zveřejněno 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;
Vyhledávání webových crawlerů public class SearchCrawler implements Runnable {
/* * disallowListCache cache robot neumožňuje vyhledávání v URL. Protokol Robot umístí robots.txt soubor do kořenového adresáře webu, * Specifikuje, které stránky na webu jsou vyhledávatelné pro omezené vyhledávání. * Vyhledávací program by měl tyto oblasti během vyhledávání přeskočit, zde je příklad robots.txt: * # robots.txt pro http://somehost.com/ User-agent: * Nedovolit: /cgi-bin/ * Zakazovat: /registrace # Zakazovat roboty na registrační stránce * Zakazovat: /přihlášení */
soukromý HashMap<String, ArrayList<String>> disallowListCache = nový HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = nový ArrayList<String>(); Chybová zpráva Výsledek ArrayList<String> = nový ArrayList<String>(); Výsledky vyhledávání String startUrl; Výchozí bod, jak začít hledat int maxUrl; Maximální počet zpracovaných URL Vyhledávání řetězcůString; Řetězce k vyhledávání booleovský caseSensitive = nepravdivý; Zda být citlivý na velikost písmen a písmena booleovský limitHost = nepravdivý; Zda hledat v omezeném hostiteli
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { Výsledek vrátit;
}
public void run() { // Spusťte vyhledávací vlákno crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Detekce formátování URL private URL verifyUrl(String url) { Zpracovávají se pouze HTTP URL. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nová URL(url); } catch (Exception e) { return null; } return verified URL;
}
Detekuje, zda robot umožňuje přístup k dané URL. private boolean isRobotAllowed(URL urlToCheck) { Host řetězce = urlToCheck.getHost().toLowerCase(); Získejte hostitele, který dává RUL System.out.println("host="+host);
Získejte cache URL, které váš hostitel neumožňuje vyhledávat ArrayList<String> disallowList = disallowListCache.get(host);
Pokud ještě nemáte cache, stáhněte si ji a uložte do mezipaměti. if (disallowList == null) { disallowList = nový ArrayList<String>(); try { URL robotsFileUrl = nová URL ("http://" + host + "/robots.txt"); BufferedReader reader = nový BufferedReader( nový InputStreamReader(robotsFileUrl.openStream()));
Přečtěte si robotický soubor a vytvořte si seznam cest, ke kterým není přístup. Strunová linka; while ((line = reader.readLine()) != null) { pokud (line.indexOf("Disallow:") == 0) {// Obsahuje "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Získejte cestu k zakázanému přístupu
Zkontrolujte poznámky. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Odstraňte komentář }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Cache cesty, ke kterým tento hostitel nemá přístup. disallowListCache.put(host, disallowList); } catch (Exception e) { return true; V kořenovém adresáři webu nejsou žádné robots.txt soubory a vrací true } }
String file = urlToCheck.getFile(); System.out.println("File getFile()="+file); pro (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 { Otevřete připojení k URL pro čtení. BufferedReader reader = nový BufferedReader(nový InputStreamReader( pageUrl.openStream()));
Přečti stránku do bufferu. Strunová linka; StringBuffer pageBuffer = nový StringBuffer(); while ((line = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } catch (Exception e) { }
return null;
}
Odstraňte "www" z URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); pokud (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Rozpracuj stránku a najdi odkaz private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Zkompilujte vzor spojení s regulárními výrazy. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = nový ArrayList<String>(); zatímco (m.find()) { String link = m.group(1).trim();
if (link.length() < 1) { pokračujte; }
Přeskočte odkaz na tuto stránku. if (link.charAt(0) == '#') { pokračujte; }
if (link.indexOf("mailto:") != -1) { pokračujte; }
if (link.toLowerCase().indexOf("javascript") != -1) { pokračujte; }
if (link.indexOf("://") == -1) { pokud (link.charAt(0) == '/') {// je absolutně link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + odkaz; } jinak { String file = pageUrl.getFile(); pokud (file.indexOf('/') == -1) {// zpracovává relativní adresy link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + odkaz; } jinak { String path = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + path + link; } } }
int index = link.indexOf('#'); pokud (index != -1) { link = link.substring(0, index); }
link = odstranitWwwFromUrl(link);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { pokračujte; }
/* Pokud omezujete hostitele, vylučujte ty URL, které nesplňují kritéria */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { pokračujte; }
Přeskočte odkazy, které už byly zpracovány. if (crawledList.contains(link)) { pokračujte; }
linkList.add(link); }
return (linkList);
}
Prohledejte obsah stažené webové stránky, abyste zjistili, zda se na stránce nachází specifikovaný vyhledávací řetězec
soukromé boolean vyhledáváníStringMatches(String pageContents, String searchString, boolean caseSensitive) { VyhledáváníObsah řetězce = stránkaObsah; pokud (!caseSensitive) {// pokud je necitlivé na velká písmena searchContents = pageContents.toSmallCase(); }
Vzor p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); pro (int i = 0; I < terms.length; i++) { pokud (caseSensitive) { if (searchContents.indexOf(terms)) == -1) { return false; } } jinak { if (searchContents.indexOf(terms).toLowerCase()) == -1) { return false; } } }
return true;
}
Proveďte skutečnou vyhledávací operaci 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 Maxů URL."); System.out.println("Hodnota neplatných Maxů URL."); }
if (searchString.length() < 1) { errorList.add("Chybějící vyhledávací řetězec."); System.out.println("Chybějící vyhledávací řetězec"); }
if (errorList.size() > 0) { System.out.println("ehm!!"); return errorList; }
Přesunte www mimo startovací URL startUrl = odstranitWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { pauza; } }
Získejte URL na konci seznamu. String url = toCrawlList.iterator().next();
Odstraňte URL ze seznamu pro procházení. toCrawlList.remove(url);
Převést URL řetězce na URL objekt. URL verifiedUrl = verifyUrl(url);
Přeskočte URL, pokud k ní roboti nemají přístup. if (!isRobotAllowed(verifiedUrl)) { pokračujte; }
Přidejte zpracované URL do crawledList crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null & pageContents.length() > 0) { Získejte platný odkaz ze stránky <String> ArrayList links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(odkazy);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} Výsledek vrátit;
}
Hlavní funkce public static void main(String[] args) { SearchCrawler crawler = nový SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Vyhledávání v vláknech = nové vlákno (crawler); System.out.println("Začni hledat..."); System.out.println("result:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Automaticky generovaný blok zachycení e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Počet stažení: 591)
-
2.png
(72.18 KB, Počet stažení: 596)
-
3.png
(188.46 KB, Počet stažení: 606)
Předchozí:PHP tvoří 82,2 % z 100 největších webůDalší:Java Edition Web Source Code Viewer
|