|
|
Pubblicato su 30/11/2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importa java.io.BufferedReader; importare java.io.InputStreamReader; importa java.net.URL; import java.util.ArrayList; importare java.util.HashMap; importa java.util.HashSet; importa java.util.LinkedHashSet; import java.util.regex.Matcher; import java.util.regex.Pattern;
Cerca i web crawler SearchCrawler di classe pubblica implementa Runnable {
/* * disallowListCache cache robot non consente URL cercati. Il protocollo Robot imposta un file robots.txt nella directory radice del sito web, * Specifica quali pagine del sito sono ricercabili per la ricerca restritta. * Il programma di ricerca dovrebbe saltare queste aree durante la ricerca, ecco un esempio di robots.txt: * # robots.txt per http://somehost.com/ User-agent: * Vieta: /cgi-bin/ * Dispermetto: /registrazione # Dispermesso i robot nella pagina di registrazione * Disalconsent: /login */
private HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>(); <String> ArrayList errorList = nuovo ArrayList<String>(); Messaggio di errore <String> Risultato ArrayList = nuovo <String>ArrayList(); Risultati ricercati Stringa startUrl; Un punto di partenza per iniziare la tua ricerca int maxUrl; Il numero massimo di URL processati String searchString; Stringhe da cercare boolean caseSensitive = falso; Se essere sensibili o meno alle maiuscole e minuscole limiteHost booleano = falso; Se cercare all'interno di un host ristretto
Public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { risultato di ritorno;
}
public void run() { // Avvia il thread di ricerca crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Rileva la formattazione URL private URL verifyUrl(String url) { Vengono elaborati solo gli URL HTTP. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nuovo URL(URL); } catch (Eccezione e) { return null; } return verifiedUrl;
}
Rileva se il robot consente l'accesso all'URL fornito. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Prendi l'host che dà la RUL System.out.println("host="+host);
Ottieni una cache di URL che il tuo host non permette di cercare ArrayList<String> disallowList = disallowListCache.get(host);
Se non hai già una cache, scaricala e mettila in cache. if (disallowList == null) { disallowList = nuova ArrayList<String>(); try { URL robotsFileUrl = nuovo URL("http://" + host + "/robots.txt"); Lettore BufferedReader = nuovo LettoreBuffered( nuovo InputStreamReader(robotsFileUrl.openStream()));
Leggi il file robot per creare una lista di percorsi che non sono accessibili. Linea d'archi; mentre ((linea = lettore.readLine()) != nullo) { if (line.indexOf("Disallow:") == 0) {// Contiene "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Ottieni il percorso per l'accesso non consentito
Controlla le annotazioni. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.sottostringa(0, commentoIndice); Rimuovi il commento }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Percorsi di cache a cui questo host non è autorizzato a accedere. disallowListCache.put (host, disallowList); } catch (Eccezione e) { ritorno vero; Non ci sono file robots.txt nella directory root del sito web, e restituisce la risposta vera } }
File stringa = urlToCheck.getFile(); System.out.println("File getFile()="+file); per (int i = 0; i < disallowList.size(); i++) { Stringa disallow = disallowList.get(i); if (file.startsWith(disallow)) { return false; } }
ritorno vero;
}
private Stringa downloadPage(URL pageUrl) { try { Apertura del collegamento all'URL per la lettura. BufferedReader reader = nuovo BufferedReader(nuovo InputStreamReader( pageUrl.openStream()));
Leggi la pagina nel buffer. Linea d'archi; StringBuffer pageBuffer = nuovo StringBuffer(); mentre ((linea = lettore.readLine()) != nullo) { pageBuffer.append(linea); }
return pageBuffer.toString(); } catch (Eccezione e) { }
return null;
}
Rimuovi "www" dall'URL private StringeRemoveWwwFromUrl(String url) { int index = url.indexOf("://www."); se (indice != -1) { return url.substring(0, indice + 3) + url.sottostringa(indice + 7); }
return (url);
}
Analizza la pagina e trova il link private ArrayList<String> retrieveLinks(URL paginaUrl, Stringa paginaContenuti, HashSet crawledList, boolean limitHost) { Compila il pattern corrispondente del link con espressioni regolari. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
<String> ArrayList linkList = nuovo <String>ArrayList(); mentre (m.find()) { String link = m.group(1).trim();
se (link.length() < 1) { continuare; }
Salta il link a questa pagina. if (link.charAt(0) == '#') { continuare; }
if (link.indexOf("mailto:") != -1) { continuare; }
if (link.toLowerCase().indexOf("javascript") != -1) { continuare; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// gestisce assolutamente link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } altrimenti { String file = pageUrl.getFile(); if (file.indexOf('/') == -1) {// gestisce gli indirizzi relativi link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } altrimenti { Percorso stringa = file.sottostringa(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + percorso + collegamento; } } }
int index = link.indexOf('#'); se (indice != -1) { link = link.sottostringa(0, indice); }
link = removeWwwFromUrl(link);
URL verificatoLink = verifyUrl(link); if (verifiedLink == null) { continuare; }
/* Se limiti gli host, escludi quegli URL che non soddisfano i criteri */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { continuare; }
Evita quei link già elaborati. if (crawledList.contains(link)) { continuare; }
linkList.add(link); }
return (linkList);
}
Cerca nel contenuto di una pagina web scaricata per determinare se nella pagina è presente una stringa di ricerca specifica
ricerca booleana privataStringMatches(StringpageContenuti, StringStringSearch, boolean caseSensitive) { Stringa ricercaContenuti = paginaContenuti; if (!caseSensitive) {// if case insensitive searchContents = paginaContenuti.aMinuscolo(); }
Pattern p = Pattern.compile("[\\s]+"); String[] termini = p.split(searchString); per (int i = 0; Ho < termini lunghi; i++) { if (Case Sensitive) { if (searchContents.indexOf(termini) == -1) { return false; } } altrimenti { if (searchContents.indexOf(termini.toLowerCase()) == -1) { return false; } } }
ritorno vero;
}
Esegui l'operazione di ricerca effettiva public<String> ArrayList crawl(String startUrl, int maxUrls, StringstringSearchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = nuovo <String>HashSet(); LinkedHashSet<String> toCrawlList = nuovo <String>LinkedHashSet();
if (maxUrls < 1) { errorList.add("Invalido valore degli URL Max."); System.out.println ("Valore Max URL invalido."); }
se (searchString.length() < 1) { errorList.add ("Stringa di ricerca mancante."); System.out.println ("Stringa di ricerca mancante"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Sposta www dall'URL iniziale startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { pausa; } }
Trova l'URL in fondo alla lista. URL stringa = toCrawlList.iterator().next();
Rimuovi l'URL dalla lista di rastrellamento. toCrawlList.remove(url);
Converti l'URL della stringa in oggetto URL. URL verifiedUrl = verifyUrl(url);
Salta l'URL se ai robot non è permesso accedervi. if (!isRobotAllowed(verifiedUrl)) { continuare; }
Aggiungi gli URL elaborati a crawledList crawledList.add(url); Stringa paginaContenuti = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Ottieni un link valido dalla pagina <String> ArrayList link = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(link);
se (searchStringMatches(pageContents, searchString, SensitiveCaseSensitive)) { result.add(url); System.out.println(url); } }
} risultato di ritorno;
}
Funzione principale Public static void main(String[] args) { SearchCrawler crawler = nuovo SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = nuovo thread(crawler); System.out.println ("Inizia la ricerca..."); System.out.println("risultato:"); search.start(); try { cerca.join(); } catch (InterruptedException e) { TODO blocco di presa auto-generato e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Numero di download: 591)
-
2.png
(72.18 KB, Numero di download: 596)
-
3.png
(188.46 KB, Numero di download: 606)
Precedente:PHP rappresenta l'82,2% dei principali siti web di 100WProssimo:Visualizzatore di codice sorgente web Java Edition
|