|
|
Publisert på 30.11.2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importere java.io.BufferedReader; importere java.io.InputStreamReader; importere java.net.URL; import java.util.ArrayList; importere java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.regex.Matcher; import java.util.regex.Pattern;
Søk etter nettcrawlere offentlig klasse SearchCrawler implementerer Runnable {
/* * disallowListCache cache robot tillater ikke søkte URL-er. Robot-protokollen setter en robots.txt-fil i rotkatalogen til nettstedet, * Spesifiserer hvilke sider på nettstedet som er søkbare for begrenset søk. * Søkeprogrammet bør hoppe over disse områdene under søket, her er et eksempel på robots.txt: * # robots.txt for http://somehost.com/ User-agent: * Ikke tillate: /cgi-bin/ * Ikke tillatt: /registrering # Ikke tillatt roboter på registreringssiden * Ikke tillat: /login */
privat HashMap<String, ArrayList<String>> disallowListCache = ny HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = ny ArrayList<String>(); Feilmelding ArrayList-resultat<String> = ny ArrayList<String>(); Søkte resultater String startUrl; Et utgangspunkt for å starte søket ditt int maxUrl; Maksimalt antall prosesserte URL-er String searchString; Strenger å søke etter boolsk caseSensitive = falsk; Om man skal være case-sensitiv eller ikke boolsk grenseVert = falsk; Om man skal søke innenfor en begrenset vert
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { returresultat;
}
public void run() { // Start søketråden crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Oppdag URL-formatering privat 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 (Unntak e) { returner null; } returnerte verifiedUrl;
}
Oppdager om roboten gir tilgang til den gitte URL-en. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Få verten som gir RUL System.out.println("host="+host);
Få en cache med URL-er som verten din ikke tillater søk i ArrayList<String> disallowList = disallowListCache.get(host);
Hvis du ikke allerede har en cache, last den ned 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()));
Les robotfilen for å lage en liste over stier som ikke er tillatt å få tilgang til. Strenglinje; mens ((linje = reader.readLine()) != null) { hvis (line.indexOf("Disallow:") == 0) {// Inneholder den "Disallow:" Streng disallowPath = line.substring("Disallow:" .lengde()); Få veien for å nekte tilgang
Sjekk etter merknader. int commentIndex = disallowPath.indexOf("#"); hvis (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Fjern kommentaren }
disallowPath = disallowPath.trim(); disallowList.add (disallowPath); } }
Cache-stier som denne verten ikke har tilgang til. disallowListCache.put(host, disallowList); } catch (Unntak e) { returner sann; Det finnes ingen robots.txt filer i rotkatalogen til nettstedet, og den returnerer true } }
Strengfil = urlToCheck.getFile(); System.out.println("File getFile()="+file); for (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); hvis (file.startsWith(disallow)) { returner falsk; } }
returner sann;
}
privat String downloadPage(URL pageUrl) { try { Åpne tilkobling til URL for lesing. BufferedReader reader = ny BufferedReader (ny InputStreamReader( pageUrl.openStream()));
Les siden inn i bufferen. Strenglinje; StringBuffer pageBuffer = ny StringBuffer(); mens ((linje = reader.readLine()) != null) { pageBuffer.append(linje); }
return pageBuffer.toString(); } catch (Unntak e) { }
returner null;
}
Fjern "www" fra URL-en private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); hvis (indeks != -1) { returner url.substring(0, indeks + 3) + url.substring(indeks + 7); }
return (URL);
}
Analyser siden og finn lenken privat ArrayList<String> henteLenker(URL pageURL, streng sideinnhold, HashSet crawledList, boolean limitHost) { Kompil matchingsmønsteret til lenken med regulære uttrykk. 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()) { Strenglenke = m.group(1).trim();
hvis (link.length() < 1) { fortsett; }
Hopp over lenken til denne siden. hvis (link.charAt(0) == '#') { fortsett; }
hvis (link.indexOf("mailto:") != -1) { fortsett; }
hvis (link.toLowerCase().indexOf("javascript") != -1) { fortsett; }
hvis (link.indexOf("://") == -1) { hvis (link.charAt(0) == '/') {// håndterer absolutt lenke = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + lenke; } ellers { Strengfil = pageUrl.getFile(); hvis (file.indexOf('/') == -1) {// håndterer relative adresser lenke = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + lenke; } ellers { Strengsti = file.substring(0, file.lastIndexOf('/') + 1); lenke = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + sti + lenke; } } }
int index = link.indexOf('#'); hvis (indeks != -1) { link = link.substring(0, indeks); }
lenke = fjernWwwFromUrl(lenke);
URL verifiedLink = verifyUrl(link); hvis (verifiedLink == null) { fortsett; }
/* Hvis du begrenser verter, ekskluder de URL-ene som ikke oppfyller kriteriene */ hvis (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { fortsett; }
Hopp over de lenkene som allerede er behandlet. hvis (crawledList.contains(link)) { fortsett; }
linkList.add (lenke); }
returnere (linkList);
}
Søk i innholdet på en nedlastet nettside for å finne ut om det finnes en spesifisert søkestreng på siden
privat boolsk søkStringMatches(StrengsideInnhold, String searchString, boolean caseSensitive) { StrengsøkInnhold = sideInnhold; hvis (!caseSensitive) {// if case insensitive searchContents = pageContents.toLowerCase(); }
Mønster p = Pattern.compile("[\\s]+"); String[]-termer = p.split(searchString); for (int i = 0; Jeg < term.lengde; i++) { hvis (caseSensitive) { hvis (searchContents.indexOf(terms) == -1) { returner falsk; } } ellers { hvis (searchContents.indexOf(terms.toLowerCase()) == -1) { returner falsk; } } }
returner sann;
}
Utfør selve søkeoperasjonen 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 maks URL-verdi."); System.out.println ("Ugyldige maksimale URL-verdi."); }
hvis (searchString.length() < 1) { errorList.add ("Manglende søkestreng."); System.out.println ("Manglende søkestreng"); }
hvis (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Flytt www ut av 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-en fra gjennomsøkingslisten. toCrawlList.remove(URL);
Konverter streng-url til URL-objekt. URL verifiedUrl = verifyUrl(url);
Hopp over URL hvis roboter ikke har tilgang til den. hvis (!isRobotAllowed(verifiedUrl)) { fortsett; }
Legg til behandlede URL-er i crawledList crawledList.add(url); Streng pageContents = downloadPage(verifiedUrl);
hvis (pageContents != null && pageContents.length() > 0) { Få en gyldig lenke fra siden <String> ArrayList-lenker = henteLenker(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(lenker);
hvis (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(URL); System.out.println(url); } }
} returresultat;
}
Hovedfunksjon offentlig statisk void main(String[] args) { SearchCrawler crawler = ny SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Trådsøk = ny tråd (crawler); System.out.println ("Start søk..."); System.out.println("result:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Automatisk generert fangstblokk e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Antall nedlastinger: 591)
-
2.png
(72.18 KB, Antall nedlastinger: 596)
-
3.png
(188.46 KB, Antall nedlastinger: 606)
Foregående:PHP står for 82,2 % av de 100W største nettsideneNeste:Java Edition Web Source Code Viewer
|