|
|
Julkaistu 30.11.2014 16.56.56
|
|
|
|

[mw_shl_code=java,totta]/** * @author Jack.Wang
* */ tuo java.io.BufferedReader; tuo java.io.InputStreamReader; tuo java.net.URL; tuo java.util.ArrayList; tuo java.util.HashMap; tuo java.util.HashSet; tuo java.util.LinkedHashSet; tuo java.util.regex.Matcher; tuo java.util.regex.Pattern;
Haku web-indeksoijille public class SearchCrawler toteuttaa Runnable {
/* * disallowListCache-välimuistirobotti ei salli haettuja URL-osoitteita. Robot-protokolla asettaa robots.txt-tiedoston verkkosivuston juurihakemistoon, * Määrittelee, mitkä sivut sivustolla ovat haettavissa rajoitetussa haussa. * Hakuohjelman tulisi ohittaa nämä alueet haun aikana, tässä on esimerkki robots.txt: * # robots.txt http://somehost.com/ käyttäjä-agentille: * Kielto: /cgi-bin/ * Kieltä: /rekisteröinti # Kielto robotit rekisteröintisivulla * Estä: /kirjautuminen */
private HashMap<String, <String>ArrayList> disallowListCache = uusi HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = uusi ArrayList<String>(); Virheilmoitus <String> ArrayList-tulos = uusi ArrayList<String>(); Haetut tulokset String startUrl; Lähtökohta etsinnän aloittamiseen int maxUrl; Suurin käsiteltyjen URL-osoitteiden määrä MerkkijonohakuString; Merkkijonot, joita haetaan boolean caseSensitive = epätosi; Pitäisikö kirjainkoon sensitiivistä olla vai ei boolean limitHost = epätosi; Kannattaako hakea rajoitetun isännän sisällä
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { palautustulos;
}
public void run() { // Aloita hakuketju crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Tunnista URL-muotoilu private URL verifyUrl(String url) { Vain HTTP-URL-osoitteet käsitellään. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; kokeile { verifiedUrl = uusi URL(url); } catch (Poikkeus e) { return null; } return verifiedUrl;
}
Tunnistaa, salliiko robotti pääsyn annettuun URL-osoitteeseen. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Hanki isäntä, joka antaa RUL:n System.out.println("host="+host);
Hanki välimuisti URL-osoitteita, joita isäntäsi ei salli hakea ArrayList<String> disallowList = disallowListCache.get(isäntä);
Jos sinulla ei vielä ole välimuistia, lataa ja tallenna se. if (disallowList == null) { disallowList = uusi ArrayList<String>(); kokeile { URL robotsFileUrl = new URL("http://" + host + "/robots.txt"); BufferedReader = uusi BufferedReader( new InputStreamReader(robotsFileUrl.openStream()));
Lue robottitiedosto luodaksesi listan poluista, joita ei saa käyttää. Jousilinja; kun ((rivi = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Sisältääkö se "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Hanki reitti kiellettyyn pääsyyn
Tarkista merkinnät. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Poista kommentti }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Välimuistipolut, joihin tämä isäntä ei saa käyttää. disallowListCache.put(isäntä, disallowList); } catch (Poikkeus e) { return true; Sivuston juurihakemistossa ei ole robots.txt tiedostoja, ja se palauttaa true } }
Merkkijonotiedosto = urlToCheck.getFile(); System.out.println("Tiedosto getFile()="+file); kun (int i = 0; i < disallowList.size(); i++) { Merkkijono disallow = disallowList.get(i); if (file.startsWith(disallow)) { palauta väärin; } }
return true;
}
private String downloadPage(URL pageUrl) { kokeile { Avaa yhteys URL-osoitteeseen lukemista varten. BufferedReader = uusi BufferedReader(uusi InputStreamReader( pageUrl.openStream()));
Lue sivu puskuriin. Jousilinja; StringBuffer pageBuffer = uusi StringBuffer(); kun ((rivi = reader.readLine()) != null) { pageBuffer.append(rivi); }
return pageBuffer.toString(); } catch (Poikkeus e) { }
return null;
}
Poista "www" URL-osoitteesta private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (indeksi != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (URL);
}
Jäsennä sivu ja etsi linkki private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Käännä linkin yhteensopivuuskuvio säännöllisillä lausekkeilla. Kuvio p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = uusi ArrayList<String>(); kun (m.find()) { Merkkijonolinkki = m.group(1).trim();
if (link.length() < 1) { jatka; }
Ohita linkki tälle sivulle. if (link.charAt(0) == '#') { jatka; }
if (link.indexOf("mailto:") != -1) { jatka; }
if (link.toLowerCase().indexOf("javascript") != -1) { jatka; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// käsittelee ehdottomasti link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + linkki; } else { Merkkijonotiedosto = pageUrl.getFile(); if (file.indexOf('/') == -1) {// käsittelee suhteellisia osoitteita link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + linkki; } else { Merkkijonopolku = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + polku + linkki; } } }
int index = link.indexOf('#'); if (indeksi != -1) { link = link.substring(0, indeksi); }
linkki = poista WwwFromUrl(linkki);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { jatka; }
/* Jos rajoitat isäntiä, sulje pois ne URL-osoitteet, jotka eivät täytä kriteerejä */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { jatka; }
Ohittakaa ne linkit, jotka on jo käsitelty. if (crawledList.contains(link)) { jatka; }
linkList.add(link); }
return (linkList);
}
Hae ladatun verkkosivun sisällöstä selvittääksesi, onko sivulla määritelty hakujono.
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Merkkijonon hakuSisältö = pageContents; if (!caseSensitive) {// if insensitive case searchContents = pageContents.toLowerCase(); }
Kuvio p = Pattern.compile("[\\s]+"); String[] termit = p.split(searchString); kun (int i = 0; I < termit.pituus; i++) { if (caseSensitive) { jos (searchContents.indexOf(terms) == -1) { palauta väärin; } } else { jos (searchContents.indexOf(terms.toLowerCase()) == -1) { palauta väärin; } } }
return true;
}
Suorita varsinainen etsintäoperaatio public ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = uusi HashSet<String>(); LinkedHashSet<String> toCrawlList = uusi LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Virheelliset maksimiosoitteiden arvot."); System.out.println ("Virheelliset maksimiosoitteiden arvo."); }
if (searchString.length() < 1) { errorList.add("Puuttuva hakumerkkijono."); System.out.println ("Puuttuva hakumerkkijono"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Siirrä www pois aloitus-URL:stä startUrl = poista WwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { tauko; } }
Hanki URL listan alareunasta. Merkkijonon url = toCrawlList.iterator().next();
Poista URL indeksointilistalta. toCrawlList.remove(url);
Muunna merkkijonon URL-osoite URL-objektiksi. URL verifiedUrl = verifyUrl(url);
Ohita URL, jos robotit eivät saa käyttää sitä. if (!isRobotAllowed(verifiedUrl)) { jatka; }
Lisää käsitellyt URL-osoitteet crawledListiin crawledList.add(url); Merkkijono pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Hanki kelvollinen linkki sivulta <String> ArrayList-linkit = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(linkit);
jos (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(URL); System.out.println(url); } }
} palautustulos;
}
Päätehtävä public static void main(String[] args) { SearchCrawler crawler = uusi SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = uusi Thread (crawler); System.out.println ("Aloita haku..."); System.out.println("tulos:"); search.start(); kokeile { search.join(); } catch (InterruptedException e) { TODO Automaattisesti luotu catch block e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Latausten määrä: 591)
-
2.png
(72.18 KB, Latausten määrä: 596)
-
3.png
(188.46 KB, Latausten määrä: 606)
Edellinen:PHP kattaa 82,2 % 100 W suosituimmista sivustoistaSeuraava:Java Edition Web Source Code Viewer
|