|
|
Postat pe 30.11.2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @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;
Caută crawlere web clasa publică SearchCrawler implementează Runnable {
/* * robotul cache disallowListCache nu permite URL-uri căutate. Protocolul Robot setează un fișier robots.txt în directorul rădăcină al site-ului, * Specifică care pagini de pe site pot fi căutate pentru căutare restricționată. * Programul de căutare ar trebui să sară peste aceste zone în timpul căutării, iată un exemplu de robots.txt: * # robots.txt pentru http://somehost.com/ User-agent: * Interpermit: /cgi-bin/ * Interpermite: /înregistrare # Interpermite roboții pe pagina de înregistrare * Disallow: /login */
private HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>(); <String> ArrayList errorList = new <String>ArrayList(); Mesaj de eroare <String> Rezultat ArrayList = nou <String>ArrayList(); Rezultate căutate String startUrl; Un punct de plecare pentru a-ți începe căutarea int maxUrl; Numărul maxim de URL-uri procesate String searchString; Șiruri de căutat boolean CaseSensitive = fals; Dacă să fie sau nu sensibil la majuscule și majuscule boolean limitHost = fals; Dacă să cauți în interiorul unei gazde restricționate
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { rezultatul returnării;
}
public void run() { // Începe firul de căutare crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Detectează formatarea URL-urilor URL privat verifyUrl(String url) { Sunt procesate doar URL-urile HTTP. if (!url.url.toLowerCase().startsWith("http://")) returnează nul; URL verificatUrl = null; try { verifiedUrl = URL nou (url); } prinde (Excepție e) { returnează nul; } return verifiedUrl;
}
Detectează dacă robotul permite accesul la URL-ul dat. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Ia gazda care dă RUL System.out.println("host="+host);
Obține un cache cu URL-uri pe care gazda ta nu le permite să le cauți ArrayList<String> disallowList = disallowListCache.get(host);
Dacă nu ai deja un cache, descarcă-l și pune în cache. if (disallowList == null) { disallowList = new <String>ArrayList(); try { URL robotsFileUrl = URL nou, ("http://" + host + "/robots.txt"); BufferedReader cititor = nou BufferedReader( noul InputStreamReader(robotsFileUrl.openStream()));
Citește fișierul robotului pentru a crea o listă de căi la care nu li se permite accesul. Linia de corzi; în timp ce ((linie = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Conține "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Obține calea către accesul interzis
Verifică dacă există adnotări. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, Index de comentarii); Șterge comentariul }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Căi cache la care această gazdă nu are voie să acceseze. disallowListCache.put (host, disallowList); } prinde (Excepție e) { întoarcerea cu adevărat; Nu există fișiere robots.txt în directorul rădăcină al site-ului, iar acesta returnează adevăratul } }
Fișier șir = urlToCheck.getFile(); System.out.println("File getFile()="+file); pentru (int i = 0; i < disallist.size(); i++) { String disallow = disallist.get(i); if (fișier.startsWith(disallow)) { returnează false; } }
întoarcerea cu adevărat;
}
private String downloadPage(URL pageUrl) { try { Deschide conexiunea către URL pentru lectură. BufferedReader cititor = nou BufferedReader(nou InputStreamReader( pageUrl.openStream()));
Citește pagina în buffer. Linia de corzi; StringBuffer pageBuffer = new StringBuffer(); în timp ce ((linie = reader.readLine()) != null) { pageBuffer.append(linie); }
return pageBuffer.toString(); } prinde (Excepție e) { }
returnează nul;
}
Elimină "www" din URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); dacă (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Analizează pagina și găsește linkul ArrayList privat<String> retrieveLinks(URL paginăUrl, Șiruri de paginăConținut, HashSet crawledList, boolean limitHost) { Compilează modelul de potrivire al legăturii cu expresii regulate. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
<String> ArrayList linkList = new <String>ArrayList(); în timp ce (m.find()) { Legătură de șir = m.group(1).trim();
dacă (link.length() < 1) { continuă; }
Săriți peste linkul către această pagină. if (link.charAt(0) == '#') { continuă; }
if (link.indexOf("mailto:") != -1) { continuă; }
if (link.toLowerCase().indexOf("javascript") != -1) { continuă; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// gestionează absolut link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } altfel { Fișier șir = pageUrl.getFile(); if (file.indexOf('/') == -1) {// gestionează adresele relative link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } altfel { Calea șirului = fișier.substring(0, fișier.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + cale + link; } } }
int index = link.indexOf('#'); dacă (index != -1) { link = link.substring(0, index); }
link = removeWwwFromUrl(link);
URL verificatLink = verifyUrl(link); if (verifiedLink == null) { continuă; }
/* Dacă restricționezi gazdele, exclude acele URL-uri care nu îndeplinesc criteriile */ dacă (limitHost && !pageUrl.getHost().toLowerCase().egal( verifiedLink.getHost().toLowerCase())) { continuă; }
Sari peste acele linkuri care au fost deja procesate. if (crawledList.contains(link)) { continuă; }
linkList.add(link); }
return (linkList);
}
Caută în conținutul unei pagini web descărcate pentru a determina dacă există un șir de căutare specificat în pagină
căutare booleană privatăStringMatches(String pageContents, String searchString, boolean caseSensitive) { StringSearchContents = pageContents; if (!caseSensitive) {// dacă insensitive la majuscule searchContents = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[] termeni = p.split(searchString); pentru (int i = 0; Am < termeni. lungime; i++) { if (caseSensitive) { if (searchContents.indexOf(termeni) == -1) { returnează false; } } altfel { if (searchContents.indexOf(termeni.toLowerCase()) == -1) { returnează false; } } }
întoarcerea cu adevărat;
}
Efectuează operațiunea efectivă de căutare public<String> ArrayList crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = new <String>HashSet(); LinkedHashSet<String> toCrawlList = nou <String>LinkedHashSet();
if (maxUrls < 1) { errorList.add ("Invalid valoare a URL-urilor Max."); System.out.println ("Valoare URL maximă invalidă."); }
if (searchString.length() < 1) { errorList.add ("Șir de căutare lipsă."); System.out.println ("String de căutare lipsă"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Mută www din URL-ul de start startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
dacă (maxUrls != -1) { if (crawledList.size() == maxUrls) { pauză; } }
Obține URL-ul la finalul listei. URL string = toCrawlList.iterator().next();
Elimină URL-ul din lista de crawl. toCrawlList.remove(url);
Convertește URL-ul șirului în obiect URL. URL verificatUrl = verifyUrl(url);
Sari peste URL-ul dacă roboții nu au voie să aibă acces la el. if (!isRobotAllowed(verifiedUrl)) { continuă; }
Adaugă URL-uri procesate în crawledList crawledList.add(url); String pageConținut = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Obține un link valid de pe pagină <String> ArrayList links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(linkuri);
dacă (searchStringMatches(pageContents, searchString, Case Sensitive)) { result.add(url); System.out.println(url); } }
} rezultatul returnării;
}
Funcția principală public static void main(String[] args) { SearchCrawler crawler = nou SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Căutare fire = fir nou (crawler); System.out.println ("Începe căutarea..."); System.out.println("rezultat:"); search.start(); try { search.join(); } prinde (ExcepțieÎntreruptăE) { TODO Bloc de prindere auto-generat e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Numărul de descărcări: 591)
-
2.png
(72.18 KB, Numărul de descărcări: 596)
-
3.png
(188.46 KB, Numărul de descărcări: 606)
Precedent:PHP reprezintă 82,2% din primele site-uri 100WUrmător:Vizualizator de coduri sursă web Java Edition
|