|
|
Paskelbta 2014-11-30 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importuoti java.io.BufferedReader; importuoti java.io.InputStreamReader; importuoti java.net.URL; importuoti java.util.ArrayList; importuoti java.util.HashMap; importuoti java.util.HashSet; importuoti java.util.LinkedHashSet; importuoti java.util.regex.Matcher; importuoti java.util.regex.Pattern;
Žiniatinklio naršyklių paieška viešoji klasė SearchCrawler įgyvendina Runnable {
/* * disallowListCache talpyklos robotas neleidžia ieškoti URL. Roboto protokolas nustato robots.txt failą šakniniame svetainės kataloge, * Nurodo, kuriuose svetainės puslapiuose galima ieškoti ribotos paieškos. * Paieškos programa turėtų praleisti šias sritis paieškos metu, čia yra robots.txt pavyzdys: * # robots.txt http://somehost.com/ User-agent: * Neleisti: /cgi-bin/ * Neleisti: /registration # Neleisti robotų registracijos puslapyje * Neleisti: /login */
privatus HashMap<String, ArrayList<String>> disallowListCache = naujas HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = naujas ArrayList<String>(); Klaidos pranešimas ArrayList<String> rezultatas = naujas ArrayList<String>(); Ieškomi rezultatai Eilutės startUrl; Atspirties taškas ieškai pradėti int maxUrl; Maksimalus apdorotų URL skaičius Eilutė searchString; Eilutės, kurių reikia ieškoti loginis caseSensitive = klaidingas; Ar turi būti skiriamos didžiosios ir mažosios raidės loginis limitasHost = klaidingas; Ar ieškoti apribotame pagrindiniame kompiuteryje
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { grąžinti rezultatą;
}
public void run() { // Pradėti ieškos giją. crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
URL formatavimo aptikimas privatus URL verifyUrl(String url) { Apdorojami tik HTTP URL. if (!url.toLowerCase().startsWith("http://")) grąžinti null; URL verifiedUrl = null; pabandykite { verifiedUrl = naujas URL(url); } laimikis (e išimtis) { grąžinti null; } grąžinti verifiedUrl;
}
Aptinka, ar robotas leidžia pasiekti nurodytą URL. privatus loginis isRobotAllowed(URL urlToCheck) { Eilutės pagrindinis kompiuteris = urlToCheck.getHost().toLowerCase(); Gaukite šeimininką, kuris suteikia RUL System.out.println("host="+host);
Gaukite URL talpyklą, kurios pagrindinis kompiuteris neleidžia ieškoti ArrayList<String> disallowList = disallowListCache.get(host);
Jei dar neturite talpyklos, atsisiųskite ir išsaugokite ją talpykloje. if (disallowList == null) { disallowList = naujas ArrayList<String>(); pabandykite { URL robotsFileUrl = naujas URL("http://" + pagrindinis kompiuteris + "/robots.txt"); BufferedReader skaitytuvas = naujas BufferedReader( naujas InputStreamReader(robotsFileUrl.openStream()));
Perskaitykite roboto failą, kad sukurtumėte kelių, kurių neleidžiama pasiekti, sąrašą. Stygų linija; o ((eilutė = skaitytojas.readLine()) != nulinis) { if (line.indexOf("Neleisti:") == 0) {// Ar jame yra "Neleisti:" Eilutė disallowPath = line.substring("Neleisti:" .length()); Neleistinos prieigos kelio gavimas
Patikrinkite, ar yra komentarų. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Pašalinkite komentarą }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Talpyklos keliai, kurių šiam pagrindiniam kompiuteriui neleidžiama pasiekti. disallowListCache.put(host, disallowList); } laimikis (e išimtis) { grąžinti tiesa; Šakniniame svetainės kataloge nėra robots.txt failų, ir jis grąžina teisingą } }
Eilutės failas = urlToCheck.getFile(); System.out.println("Failas getFile()="+failas); for (int i = 0; i < disallowList.size(); i++) { Eilutė neleisti = disallowList.get(i); if (failas.startsWith(neleisti)) { grąžinti klaidingą; } }
grąžinti tiesa;
}
private String downloadPage(URL pageUrl) { pabandykite { Atidarykite ryšį su URL skaitymui. BufferedReader skaitytuvas = naujas BufferedReader(naujas InputStreamReader( pageUrl.openStream()));
Skaityti puslapį į buferį. Stygų linija; StringBuffer pageBuffer = naujas StringBuffer(); o ((eilutė = skaitytojas.readLine()) != nulinis) { pageBuffer.append(eilutė); }
grąžinti pageBuffer.toString(); } laimikis (e išimtis) { }
grąžinti null;
}
Pašalinkite "www" iš URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (indeksas != -1) { grąžinti url.substring(0, index + 3) + url.substring(index + 7); }
grąžinimas (URL);
}
Išanalizuokite puslapį ir raskite saitą privatus ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, loginis limitasHost) { Sudarykite saito atitikimo modelį su reguliariaisiais reiškiniais. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = naujas ArrayList<String>(); o (m.find()) { Eilutės nuoroda = m.group(1).trim();
if (link.length() < 1) { tęsti; }
Praleiskite nuorodą į šį puslapį. if (link.charAt(0) == '#') { tęsti; }
if (link.indexOf("mailto:") != -1) { tęsti; }
if (link.toLowerCase().indexOf("javascript") != -1) { tęsti; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// tvarko absoliučiai link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + nuoroda; } else { Eilutės failas = pageUrl.getFile(); if (file.indexOf('/') == -1) {// apdoroja santykinius adresus link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + nuoroda; } else { Eilutės kelias = failas.subeilutė(0, failas.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + kelias + nuoroda; } } }
int index = link.indexOf('#'); if (indeksas != -1) { nuoroda = link.substring(0, indeksas); }
link = removeWwwFromUrl(nuoroda);
URL verifiedLink = verifyUrl(nuoroda); if (verifiedLink == null) { tęsti; }
/* Jei apribosite pagrindinius kompiuterius, išskirkite tuos URL, kurie neatitinka kriterijų */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { tęsti; }
Praleiskite tas nuorodas, kurios jau buvo apdorotos. if (crawledList.contains(nuoroda)) { tęsti; }
linkList.add(nuoroda); }
grįžti (linkList);
}
Ieškokite atsisiųsto tinklalapio turinio, kad nustatytumėte, ar puslapyje yra nurodyta paieškos eilutė
privati Bulio logika searchStringMatches(String pageContents, String searchString, loginis caseSensitive) { String searchContents = pageContents; if (!caseSensitive) {// jei didžiosios ir mažosios raidės neskiria searchContents = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); for (int i = 0; i < terminai.ilgis; i++) { if (didžiosios ir mažosios raidės) { if (searchContents.indexOf(terminai) == -1) { grąžinti klaidingą; } } else { if (searchContents.indexOf(terminai.toLowerCase()) == -1) { grąžinti klaidingą; } } }
grąžinti tiesa;
}
Atlikite tikrąją paieškos operaciją public ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = naujas HashSet<String>(); LinkedHashSet<String> toCrawlList = naujas LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Neleistina maksimali URL reikšmė."); System.out.println("Neleistina maksimali URL reikšmė."); }
if (searchString.length() < 1) { errorList.add("Trūksta paieškos eilutės."); System.out.println("Trūksta paieškos eilutė"); }
if (errorList.size() > 0) { System.out.println("klaida!!"); grąžinti klaidąSąrašas; }
Perkelti www iš pradžios URL startUrl = removeWwwFromUrl(startUrl);
įCrawlList.add(startUrl); o (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { pertrauka; } }
Gaukite URL sąrašo apačioje. Eilutės URL = toCrawlList.iterator().next();
Pašalinti URL iš aptikimo sąrašo. įCrawlList.remove(url);
Konvertuoti eilutės URL į URL objektą. URL verifiedUrl = verifyUrl(url);
Praleiskite URL, jei robotams neleidžiama jo pasiekti. if (!isRobotAllowed(verifiedUrl)) { tęsti; }
Apdorotų URL įtraukimas į aptiktą sąrašą crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Gaukite galiojančią nuorodą iš puslapio ArrayList<String> nuorodos = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
įCrawlList.addAll(nuorodos);
if (searchStringMatches(pageContents, searchString, didžiosios ir mažosios raidės)) { result.add(url); System.out.println(url); } }
} grąžinti rezultatą;
}
Pagrindinė funkcija public static void main(String[] args) { SearchCrawler tikrintuvas = naujas SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = new Thread(crawler); System.out.println("Pradėti paiešką..."); System.out.println("rezultatas:"); paieška.pradžia(); pabandykite { ieškoti.prisijungti(); } catch (InterruptedException e) { TODO Automatiškai sugeneruotas gaudymo blokas e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Atsisiuntimų skaičius: 591)
-
2.png
(72.18 KB, Atsisiuntimų skaičius: 596)
-
3.png
(188.46 KB, Atsisiuntimų skaičius: 606)
Ankstesnis:PHP sudaro 82,2 % geriausių 100 W svetainiųKitą:"Java Edition" žiniatinklio šaltinio kodo peržiūros programa
|