|
|
Geplaatst op 30-11-2014 16:56:56
|
|
|
|

[mw_shl_code=java, waar]/** * @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;
Zoek naar webcrawlers publieke klasse SearchCrawler implementeert Runnable {
/* * disallowListCache cache-robot staat geen doorzochten URL's toe. Het Robot-protocol zet een robots.txt bestand in de rootmap van de website, * Geeft aan welke pagina's op de site doorzoekbaar zijn voor beperkte zoekopdrachten. * Het zoekprogramma moet deze gebieden tijdens de zoekopdracht overslaan, hier is een voorbeeld van robots.txt: * # robots.txt voor http://somehost.com/ User-agent: * Niet toestaan: /cgi-bin/ * Niet toestaan: /registratie # Robots niet toestaan op de registratiepagina * Niet toestaan: /login */
private HashMap<String, ArrayList<String>> disallowListCache = nieuwe HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = nieuwe ArrayList<String>(); Foutmelding ArrayList-resultaat<String> = nieuwe ArrayList<String>(); Geraadpleegde resultaten String startUrl; Een startpunt om je zoektocht te beginnen int maxUrl; Het maximale aantal verwerkte URL's String searchString; Strings om naar te zoeken boolean caseSensitive = valse; Of je nu hoofdlettergevoelig moet zijn of niet boolean limitHost = vals; Of zoeken binnen een beperkte host
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { retourresultaat;
}
public void run() { // Start de zoekthread crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Detecteren URL-opmaak private URL verifyUrl(String url) { Alleen HTTP-URL's worden verwerkt. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nieuwe URL(url); } vangen (Uitzondering e) { return null; } return verifiedUrl;
}
Detecteert of de robot toegang geeft tot de opgegeven URL. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Haal de host die de RUL geeft System.out.println("host="+host);
Haal een cache van URL's die je host niet toestaat om te zoeken ArrayList<String> disallowList = disallowListCache.get(host);
Als je nog geen cache hebt, download en cache hem dan. als (disallowList == null) { disallowList = nieuwe ArrayList<String>(); try { URL robotsFileUrl = nieuwe URL ("http://" + host + "/robots.txt"); BufferedReader reader = nieuwe BufferedReader( nieuwe InputStreamReader(robotsFileUrl.openStream()));
Lees het robotbestand om een lijst te maken van paden die niet toegankelijk zijn. Snaarlijn; terwijl ((lijn = reader.readLine()) != null) { als (line.indexOf("Disallow:") == 0) {// Bevat het "Disallow:" String disallowPath = line.substring("Disallow:" .lengte()); Haal het pad naar verboden toegang
Controleer op annotaties. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Verwijder de reactie }
disallowPath = disallowPath.trim(); disallowList.add (disallowPath); } }
Cachepaden waar deze host geen toegang toe heeft. disallowListCache.put(host, disallowList); } vangen (Uitzondering e) { return true; Er zijn geen robots.txt bestanden in de rootmap van de website, en het geeft true terug } }
String file = urlToCheck.getFile(); System.out.println("Bestand getFile()="+bestand); voor (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 { Open de link naar de URL om te lezen. BufferedReader reader = nieuwe BufferedReader(nieuwe InputStreamReader( pageUrl.openStream()));
Lees de pagina in de buffer. Snaarlijn; StringBuffer pageBuffer = nieuwe StringBuffer(); terwijl ((lijn = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } vangen (Uitzondering e) { }
return null;
}
Verwijder "www" uit de URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); als (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Ontleed de pagina en vind de link privé ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Complimeer het matchingpatroon van de link met reguliere expressies. Patroon p = Patroon.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = nieuwe ArrayList<String>(); terwijl (m.find()) { String link = m.group(1).trim();
if (link.length() < 1) { Ga door; }
Sla de link naar deze pagina over. if (link.charAt(0) == '#') { Ga door; }
if (link.indexOf("mailto:") != -1) { Ga door; }
if (link.toLowerCase().indexOf("javascript") != -1) { Ga door; }
als (link.indexOf("://") == -1) { als (link.charAt(0) == '/') {// werkt absoluut link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } anders { String file = pageUrl.getFile(); als (file.indexOf('/') == -1) {// relatieve adressen verwerkt link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } anders { String path = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + pad + link; } } }
int index = link.indexOf('#'); als (index != -1) { link = link.substring(0, index); }
link = verwijderWwwFromUrl(link);
URL geverifieerdLink = verifieerUrl(link); als (geverifieerdeLink == nul) { Ga door; }
/* Als je hosts beperkt, sluit dan die URL's uit die niet aan de criteria voldoen */ als (limitHost) && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { Ga door; }
Sla die links over die al zijn verwerkt. if (crawledList.contains(link)) { Ga door; }
linkList.add (link); }
return (linkList);
}
Zoek in de inhoud van een gedownloade webpagina om te bepalen of er een bepaalde zoekstring in de pagina zit
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { String searchContents = pageContents; if (!caseSensitive) {// if case insensitive searchContents = pageContents.toLowerLetter(); }
Patroon p = Patroon.compile("[\\s]+"); String[]-termen = p.split(searchString); voor (int i = 0; Ik < termen.lengte; i++) { if (caseSensitive) { als (searchContents.indexOf(termen)) == -1) { return false; } } anders { als (searchContents.indexOf(termen).toLowerLetter()) == -1) { return false; } } }
return true;
}
Voer de daadwerkelijke zoekoperatie uit publieke ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = nieuwe HashSet<String>(); LinkedHashSet<String> toCrawlList = nieuwe LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add ("Ongeldige maximale URL-waarde."); System.out.println("Ongeldige maximale URL-waarde."); }
als (searchString.length() < 1) { errorList.add ("Ontbrekende zoekstring."); System.out.println ("Ontbrekende zoekstring"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Verwijder www uit de start-URL startUrl = verwijderWwwFromUrl(startUrl);
toCrawlList.add (startUrl); terwijl (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { pauze; } }
Haal de URL onderaan de lijst. String url = toCrawlList.iterator().next();
Verwijder de URL uit de naar crawl-lijst. toCrawlList.remove(url);
Converteer de string url naar een URL-object. URL verifiedUrl = verifyUrl(url);
Sla de URL over als robots er niet bij mogen komen. if (!isRobotAllowed(verifiedUrl)) { Ga door; }
Voeg verwerkte URL's toe aan de gecrawlde lijst crawledList.add (url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Haal een geldige link van de pagina ArrayList-links<String> = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(links);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} retourresultaat;
}
Hoofdfunctie publieke statische void main(String[] args) { SearchCrawler crawler = nieuwe SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = nieuwe thread(crawler); System.out.println("Start zoeken..."); System.out.println("resultaat:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Automatisch gegenereerd vangblok e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Aantal downloads: 591)
-
2.png
(72.18 KB, Aantal downloads: 596)
-
3.png
(188.46 KB, Aantal downloads: 606)
Vorig:PHP is goed voor 82,2% van de top 100W websitesVolgend:Java Edition Web Broncode Viewer
|