|
|
Publicado en 30/11/2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importar java.io.BufferedReader; importar java.io.InputStreamReader; importar java.net.URL; import java.util.ArrayList; importar java.util.HashMap; importar java.util.HashSet; importar java.util.LinkedHashSet; import java.util.regex.Matcher; importar java.util.regex.Pattern;
Buscar rastreadores web la clase pública SearchCrawler implementa Runnable {
/* * disallowListCache cache robot no permite URLs buscadas. El protocolo Robot establece un archivo robots.txt en el directorio raíz del sitio web, * Especifica qué páginas del sitio son buscables para búsqueda restringida. * El programa de búsqueda debería saltarse estas áreas durante la búsqueda, aquí tienes un ejemplo de robots.txt: * # robots.txt para http://somehost.com/ User-agent: * No permite: /cgi-bin/ * No permitir: /registro # Prohibir robots en la página de registro * Disallow: /login */
privado HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, <String>ArrayList>(); <String> ArrayList errorList = nuevo <String>ArrayList(); Mensaje de error <String> Resultado de ArrayList = nuevo <String>ArrayList(); Resultados buscados Inicio de la cadena de cadenas; Un punto de partida para comenzar tu búsqueda int maxUrl; El número máximo de URLs procesadas String searchString; Cadenas a buscar booleano Sensible al caso = falso; Si hay que ser sensible a mayúsculas minúsculas o no boolean limitHost = false; Si buscar dentro de un anfitrión restringido
Public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { resultado de retorno;
}
empty public run() { // Iniciar el hilo de búsqueda crawl(startUrl, maxUrl, searchString, limitHost, mayúsculasSensibles);
}
Detectar formato de URL private URL verifyUrl(String url) { Solo se procesan las URLs HTTP. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = nueva URL(URL); } catch (Excepción e) { return null; } return verifiedUrl;
}
Detecta si el robot permite acceder a la URL dada. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Consigue el anfitrión que da el RUL System.out.println("host="+host);
Consigue una caché de URLs que tu host no permita buscar ArrayList<String> disallowList = disallowListCache.get(host);
Si aún no tienes caché, descárgalo y hazlo en caché. if (disallowList == null) { disallowList = nueva ArrayList<String>(); try { URL robotsFileUrl = nueva URL("http://" + host + "/robots.txt"); Lector Búfer = nuevo Lector Búfer( nuevo InputStreamReader(robotsFileUrl.openStream()));
Lee el archivo robot para crear una lista de rutas a las que no se puede acceder. Línea de cuerdas; mientras que ((línea = lector.readLine()) != nulo) { if (line.indexOf("Disallow:") == 0) {// ¿Contiene "Disallow:" String disallowPath = línea.subcadena ("Disallow:" .length()); Obtén el camino hacia el acceso prohibido
Revisa las anotaciones. int commentIndex = disallowPath.indexOf("#"); si (commentIndex != -1) { disallowPath = disallowPath.substring(0, Índice de comentarios); Elimina el comentario }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Rutas de caché a las que este host no puede acceder. disallowListCache.put (host, disallowList); } catch (Excepción e) { regreso fiel; No hay archivos robots.txt en el directorio raíz del sitio web, y devuelve true } }
String file = urlToCheck.getFile(); System.out.println("File getFile()="+file); para (int i = 0; i < disallist.size(); i++) { Cadena disallow = disallowList.get(i); if (archivo.iniciaWith(disallow)) { return false; } }
regreso fiel;
}
private String downloadPage(URL pageUrl) { try { Abrir la conexión a la URL para leer. Lector Búfer = nuevo LectorLector Búfer(nuevo LectorStreamInput( pageUrl.openStream()));
Lee la página en el buffer. Línea de cuerdas; StringBuffer pageBuffer = nuevo StringBuffer(); mientras que ((línea = lector.readLine()) != nulo) { pageBuffer.append(línea); }
return pageBuffer.toString(); } catch (Excepción e) { }
return null;
}
Elimina "www" de la URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); si (índice != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Analiza la página y encuentra el enlace ArrayList privado<String> retrieveLinks(URL páginaUrl, Cadena de páginaContenidos, HashSet crawledList, boolean limitHost) { Compila el patrón de coincidencia del enlace con expresiones regulares. Patrón p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Emparejador m = p.emparejador(páginaContenido);
<String> ArrayList linkList = nuevo <String>ArrayList(); mientras que (m.find()) { Enlace de cadenas = m.group(1).trim();
si (link.length() < 1) { continúa; }
Salta el enlace a esta página. if (link.charAt(0) == '#') { continúa; }
if (link.indexOf("mailto:") != -1) { continúa; }
if (link.toLowerCase().indexOf("javascript") != -1) { continúa; }
si (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// maneja absolutamente enlace = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + enlace; } else { String file = pageUrl.getFile(); si (file.indexOf('/') == -1) {// gestiona direcciones relativas enlace = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + enlace; } else { Ruta de cadena = archivo.subcadena(0, archivo.lastIndexOf('/') + 1); enlace = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + ruta + enlace; } } }
int index = link.indexOf('#'); si (índice != -1) { enlace = enlace.subcadena(0, índice); }
enlace = eliminarWwwDeUrl(enlace);
URL verificadaLink = verifyUrl(link); if (verifiedLink == null) { continúa; }
/* Si restringes hosts, excluye aquellas URLs que no cumplan los criterios */ si (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { continúa; }
Salta esos enlaces que ya han sido procesados. if (crawledList.contains(link)) { continúa; }
linkList.add(enlace); }
return (linkList);
}
Busca en el contenido de una página web descargada para determinar si hay una cadena de búsqueda específica en la página
búsqueda booleana privadaStringMatches(String pageContents, String searchString, boolean caseSensitive) { Contenido de búsqueda en cadena = páginaContenido; if (!caseSensitive) {// si insensible a mayúsculas y minúsculas searchContents = páginaContenidos.aLowerCase(); }
Patrón p = Pattern.compile("[\\s]+"); Términos de cadena[] = p.split(searchString); para (int i = 0; Yo < términos. largo; i++) { if (mayúsculasSensible) { si (searchContents.indexOf(términos) == -1) { return false; } } else { si (searchContents.indexOf(términos.toLowerCase()) == -1) { return false; } } }
regreso fiel;
}
Realizar la operación de búsqueda real Rastreo público de ArrayList<String> (String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = nuevo <String>HashSet(); LinkedHashSet<String> toCrawlList = nuevo <String>LinkedHashSet();
si (maxUrls < 1) { errorList.add ("Valor de URL Max invalidado."); System.out.println ("Valor de URL Max inválido."); }
si (searchString.length() < 1) { errorList.add ("Cadena de búsqueda faltante."); System.out.println ("Cadena de búsqueda perdida"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Mover www desde la URL de inicio startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
si (maxUrls != -1) { if (crawledList.size() == maxUrls) { pausa; } }
Obtén la URL al final de la lista. URL de cadena = toCrawlList.iterator().next();
Elimina la URL de la lista de rastreo. toCrawlList.remove(url);
Convierte la URL de la cadena en objeto URL. URL verificadaUrl = verifyUrl(url);
Salta la URL si los robots no pueden acceder a ella. if (!isRobotAllowed(verifiedUrl)) { continúa; }
Añadir URLs procesadas a crawledList crawledList.add(url); String pageContenido = descargaPágina(verifiedUrl);
si (páginaContenido != null && páginaContenidos.longitud() > 0) { Obtén un enlace válido desde la página <String> ArrayList enlaces = retrieveLinks(verifiedUrl, páginaContenido, rastreadoLista, limitHost);
toCrawlList.addAll(enlaces);
si (searchStringMatches(pageContents, searchString, CaseSensitive)) { result.add(url); System.out.println(url); } }
} resultado de retorno;
}
Función principal empty estático público main(String[] args) { SearchCrawler crawler = nuevo SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Búsqueda de hilos = nuevo Hilo (rastreador); System.out.println ("Empezar búsqueda..."); System.out.println("result:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Bloque de captura autogenerado e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Número de descargas: 591)
-
2.png
(72.18 KB, Número de descargas: 596)
-
3.png
(188.46 KB, Número de descargas: 606)
Anterior:PHP representa el 82,2% de los principales sitios web de 100WPróximo:Visor de código fuente web de Java Edition
|