|
|
Objavljeno na 30. 11. 2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ import java.io.BufferedReader; uvoz java.io.InputStreamReader; uvoz 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;
Iskanje spletnih pajkov public class SearchCrawler implements Runnable {
/* * disallowListCache predpomnilniški robot ne dovoljuje iskanja URL-jev. Protokol Robot postavi robots.txt datoteko v korenski mapi spletne strani, * Določa, katere strani na strani so iskalne za omejeno iskanje. * Iskalni program naj ta območja med iskanjem preskoči, tukaj je primer robots.txt: * # robots.txt za http://somehost.com/ Uporabniški agent: * Disallow: /cgi-bin/ * Nedovoli: /registracija # Prepoved robotov na registracijski strani * Izklopi: /prijava */
private HashMap<String, ArrayList<String>> disallowListCache = novi HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = nov ArrayList<String>(); Sporočilo o napaki Rezultat ArrayList<String> = nov ArrayList<String>(); Iskani rezultati String startUrl; Izhodišče za začetek iskanja int maxUrl; Največje število obdelanih URL-jev String searchString; Nizi, ki jih je treba iskati boolean caseSensitive = false; Ali je treba biti občutljiv na velike in velike črke boolean limitHost = false; Ali iskati znotraj omejenega gostitelja
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { vrni rezultat;
}
public void run() { // Začni iskalno nit crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Zaznaj oblikovanje URL-jev private URL verifyUrl(String url) { Obdelujejo se samo HTTP URL-ji. if (!url.toLowerCase().začne z("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nov URL(url); } catch (Izjema e) { return null; } return verifiedUrl;
}
Zazna, ali robot omogoča dostop do danega URL-ja. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Vzemi gostitelja, ki daje RUL System.out.println("host="+host);
Pridobite predpomnilnik URL-jev, ki jih vaš gostitelj ne dovoljuje iskati ArrayList<String> disallowList = disallowListCache.get(host);
Če še nimaš predpomnilnika, ga prenesi in shrani v predpomnilnik. if (disallowList == null) { disallowList = nov ArrayList<String>(); try { URL robotsFileUrl = nov URL("http://" + host + "/robots.txt"); BufferedReader reader = novi BufferedReader( novi InputStreamReader(robotsFileUrl.openStream()));
Preberite robotsko datoteko, da ustvarite seznam poti, do katerih ni dovoljen dostop. Strunska linija; medtem ko ((vrstica = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Ali vsebuje "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Pridobite pot do prepovedanega dostopa
Preverite opombe. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Odstranite komentar }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Predpomnilniško poti, do katerih ta gostitelj nima dostopa. disallowListCache.put(host, disallowList); } catch (Izjema e) { vrni true; V korenskem imeniku spletne strani ni robots.txt datotek in vrne resnico } }
String file = urlToCheck.getFile(); System.out.println("File getFile()="+file); za (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { return false; } }
vrni true;
}
private String downloadPage(URL pageUrl) { try { Odpri povezavo z URL-jem za branje. BufferedReader reader = nov BufferedReader(novi InputStreamReader( pageUrl.openStream()));
Preberi stran v medpomnilnik. Strunska linija; StringBuffer pageBuffer = nov StringBuffer(); medtem ko ((vrstica = reader.readLine()) != null) { pageBuffer.append(line); }
vrni pageBuffer.toString(); } catch (Izjema e) { }
return null;
}
Odstranite "www" iz URL-ja private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (index != -1) { vrni url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Razčlenite stran in poiščite povezavo private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Primerjajte vzorec povezave z regularnimi izrazi. Vzorec p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(vsebina strani);
ArrayList<String> linkList = novi ArrayList<String>(); medtem ko (m.find()) { String link = m.group(1).trim();
if (link.length() < 1) { nadaljuj; }
Preskočite povezavo do te strani. if (link.charAt(0) == '#') { nadaljuj; }
if (link.indexOf("mailto:") != -1) { nadaljuj; }
if (link.toLowerCase().indexOf("javascript") != -1) { nadaljuj; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// obravnava absolutno link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } else { String file = pageUrl.getFile(); if (file.indexOf('/') == -1) {// obravnava relativne naslove link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } else { Pot niza = datoteka.podniz(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + path + link; } } }
int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, indeks); }
link = remakeWwwFromUrl(link);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { nadaljuj; }
/* Če omejujete gostitelje, izključite tiste URL-je, ki ne izpolnjujejo kriterijev */ if (limitHost && !pageUrl.getHost().toLowerSize().equals( verifiedLink.getHost().toLowerCase())) { nadaljuj; }
Preskočite povezave, ki so že obdelane. if (crawledList.contains(link)) { nadaljuj; }
linkList.add(link); }
return (linkList);
}
Preiščite vsebino prenesene spletne strani, da ugotovite, ali je na strani določen iskalni niz
Zasebno boolean iskanjeStringMatches(String pageContents, String searchString, boolean caseSensitive) { String searchContents = pageContents; if (!caseSensitive) {// if je neobčutljiv na velike črke searchContents = pageContents.toLittleLetter(); }
Vzorec p = Pattern.compile("[\\s]+"); String[] izrazi = p.split(searchString); za (int i = 0; I < terms.length; i++) { if (caseSensitive) { if (searchContents.indexOf(terms)) == -1) { return false; } } else { if (searchContents.indexOf(terms).toLowerCase()) == -1) { return false; } } }
vrni true;
}
Izvedite dejansko iskalno operacijo public<String> ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = nov HashSet<String>(); LinkedHashSet<String> toCrawlList = novi LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Neveljavna vrednost največ URL-jev."); System.out.println("Neveljavna vrednost največjih URL-jev."); }
if (searchString.length() < 1) { errorList.add("Manjkajoči iskalni niz."); System.out.println("Manjkajoči iskalni niz"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Premakni www izven začetnega URL-ja startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); medtem ko (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { premor; } }
Pridobite URL na dnu seznama. String url = toCrawlList.iterator().next();
Odstranite URL s seznama za pajkanje. toCrawlList.remove(url);
Pretvorite URL niza v URL objekt. URL verifiedUrl = verifyUrl(url);
Preskočite URL, če roboti nimajo dostopa do njega. if (!isRobotAllowed(verifiedUrl)) { nadaljuj; }
Dodajte obdelane URL-je v crawledList crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null & pageContents.length() > 0) { Pridobite veljavno povezavo s strani <String> ArrayList links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(links);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} vrni rezultat;
}
Glavna funkcija public static void main(String[] args) { SearchCrawler crawler = nov SearchCrawler ("http://www.itsvse.com/", 100,"Delver_Si"); Iskanje po niti = nova nit(pajka); System.out.println("Začni iskati..."); System.out.println("rezultat:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO samodejno generiran blok ujetja e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Število prenosov: 591)
-
2.png
(72.18 KB, Število prenosov: 596)
-
3.png
(188.46 KB, Število prenosov: 606)
Prejšnji:PHP predstavlja 82,2 % največjih 100W spletnih straniNaslednji:Java Edition spletni pregledovalnik izvorne kode
|