introducción
Aplique la biblioteca de código abierto de Java para escribir un motor de búsqueda que pueda rastrear el contenido de un sitio web. Y gatear profundamente en función del contenido de la página web para obtener todas las direcciones y contenido de la página web relevantes. Los usuarios pueden buscar todas las direcciones web relevantes a través de palabras clave.
Funciones específicas
(1) El usuario puede especificar el contenido de la página web correspondiente a una URL.
(2) analiza el contenido de la página web y obtiene todas las direcciones de enlace de URL.
(3) El usuario puede establecer la profundidad de rastreo, lo que significa que a partir de la página correspondiente a la URL inicial, las URL en la página web correspondientes a todas las URL pueden rastrear, etc. Cuanto mayor sea la profundidad, más sitios web podrás rastrear.
(4) Guarde e indexe el contenido de URL rastreo. El contenido indexado es la dirección de URL en sí y el título de la página web correspondiente a la URL.
(5) Los usuarios pueden buscar la URL a través de palabras clave para encontrar la URL con la palabra clave.
(6) El proceso de establecer índices e índices de búsqueda puede identificar de manera inteligente las palabras clave chinas y realizar operaciones de segmentación de palabras en palabras clave.
(7) El usuario puede especificar la dirección para guardar el índice, la URL inicial, la profundidad de rastreo, las palabras clave para buscar y la coincidencia máxima.
Marco de código abierto
Código fuente
Parte del rastreador: spider.java
paquete webcrawler.spider; import java.io.ioException; import java.util.arrayList; import java.util.hashset; import java.util.scanner; importar org.jsoup.jsoup; importar org.jsoup.nodes.document; import org.jsoup.nodes; import webcrawler.index.buildIndex;/** * @author lannooo */public class Spider {ArrayList <String> urls; starturl de cadena privada; privado int diglevel; / *** @param startUrl The Crawler's Start URL* @param DigLevel Crawl Profundidad*/ public Spider (String StartUrl, int digLevel) {this.starturl = starturl; this.digLevel = diglevel; this.urls = new ArrayList <> (); } / *** @param Nivel La profundidad de rastreo actual restante* @param ArrayList El conjunto de URL que debe arrastrarse en la siguiente ronda* @return El nuevo conjunto de URL se arrastró desde un conjunto de url de una sola foto nulo; if (nivel> 0) {total = new ArrayList <> (); for (string url: arrayList) { /*Para cada URL en cada ArrayList, primero analice el contenido de su página web y obtenga todas las entradas de URL* / for (String cada: GetBarelinks (URL)) {Total.add (cada uno); }} /*Use el contenedor Hashset para eliminar los duplicados en total* / hashset <string> hashset = new Hashset <> (total); Total = new ArrayList <> (hashset); } retorno total; } / ** * Comience desde StartUrl, rastree todas las URL relevantes * @throws ioexception * / public void getall () lanza ioexception {arrayList <String> newurls; ArrayList <String> currentUrls = new ArrayList <> (); /*Agregar startUrl a la lista de currones y comenzar a rastrear desde esta url*/ currentUrls.Add (starturl); para (int i = diglevel; i> 0; i-) { /** Para cada capa, debe obtener el conjunto de URL extendido por esta URL* luego agregue las URL rastreadas del conjunto actual de URL Total* Finalmente, Newurls ingrese la siguiente ronda de bucle como un nuevo conjunto que debe ser profundamente rastreado* / System.out.Println ("DIG AL ALED: (DIG (DIG (DIG (DIG) como un nuevo conjunto que debe ser profundamente arrastrado* / System.out.Println (" DIG AL ALED: (DIG (DIG (DIG (DIG-); newurls = getLelvelurls (i, currenturls); para (cadena cada uno: currentUrls) {urls.add (cada uno); } currentUrls = newurls; } para (String cada: CurrentUrls) {urls.add (cada uno); } Hashset <String> Hashset = new Hashset <> (URLS); Urls = new ArrayList <> (hashset); } / *** @param ruta La ruta para guardar el índice* @throws ioexception* / public void storeurlsandinfo (string ruta) lanza ioexception {buildIndex build = new BuildIndex (ruta); /* Rastrear todas las URL en URL en el título real de la página web*/ for (String cada: URLS) {string text = getLinkText (cada uno); if (text! = null) {build.addfield ("url", cada uno); build.addfield ("texto", texto); /*Ponga esta entrada en el índice*/ build.pushIndex (); }} build.close (); } / ** * @param URL Debe obtener la URL del título de la página web * @@Treturn Title Content * @throws ioException * / public String getLinkText (url de cadena) lanza ioexception {document document = null; Pruebe { /*Conecte con JSoup, establezca el tiempo de espera en 3 segundos* / document = jsoup.connect (url) .timeout (3000) .get (); } Catch (Exception e) {System.out.println ("[Tiempo de espera] Obtenga el título de URL:"+URL); regresar nulo; } String title = document.title (); título de regreso; } / ** * @param URL URL para el análisis de contenido * @return Devuelve la lista de todas las URL en la página web Contenido de la URL * @throws ioException * / public ArrayList <String> getBarelinks (String URL) lanza IOException {ArrayList <String> Linkslist = New ArrayList <> (); Documento de documento; intente {document = jSoup.connect (url) .timeout (2000) .get (); } catch (Exception e) {return LinkSlist; } /*Obtenga todas las etiquetas <a> con atributos href de los enlaces <body> tag* / elements = document.select ("Body"). Seleccione ("A [href]"); para (elemento enlace: enlaces) { / *Extraiga la URL de cada etiqueta <a> analizada y elimine el ancla * / string href = link.attr ("abs: href"). replaceall ("#", ""); /*Solo agregue la URL con los caracteres zju.edu.cn, elimine '/'*/if (href.contains ("zju.edu.cn")) {if (href.endswith ("/")) {href = href.substring (0, href.length ()-1); } linkslist.add (href); }} Hashset <String> Hashset = new Hashset <> (LinkSlist); ArrayList <String> ArrayList = new ArrayList <> (hashset); return ArrayList; } public static void main (string [] args) {Scanner in = new Scanner (System.in); System.out.println ("Ingrese URL:"); Cadena url = in.nextline (). Trim (); while (! url.startswith ("http: //")) {system.out.println ("http: // es necesario!"); System.out.println ("Ingrese URL:"); url = in.nextline (). Trim (); } System.out.println ("Ingrese la profundidad para cavar más URL [<= 3 recomendado]:"); int profundidad = in.nextInt (); Araña araña = nueva araña (url, profundidad); System.out.println ("Ingrese la ruta que desea guardar [default = d:/index-spider]:"); Ruta de cadena = in.nextline (). Trim (); if (path.length () == 0) {path = "d:/index-spider"; } try {System.out.println ("Comience a buscar ..."); spider.getAll (); System.out.println ("¡URL tiene éxito!"); spider.storeurlsandinfo (ruta); System.out.println ("¡Suciedad almacenada!"); } catch (ioException e) {E.PrintStackTrace (); }}}BuildIndex.java
package webCrawler.Index;import java.io.*;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;import org.wltea.analyzer.lucene.IKAnalyzer;/** * @author lannooo * */public class BuildIndex {archivo de archivo privado; directorio de directorio privado; Indexwriter privado IndexWriter; Configuración privada de índice WriterConfig; Analizador de analizador privado; documento de documento privado; / *** @param ruta de indexación ruta*/ public buildindex (string ruta) {try {file = new File (ruta); directorio = fsDirectory.open (archivo); documento = nuevo documento (); analizador = nuevo ikanalyzer (); /*Clase de herramienta de segmentación de palabras chinas*/ config = new IndexWriterConfig (versión.lucene_4_10_0, analizador); indexwriter = new IndexWriter (directorio, config); } catch (Exception e) {E.PrintStackTrace (); }} / *** @param FieldName El nombre del nuevo elemento agregado al documento* @param fieldText El contenido del nuevo elemento* / public void addfield (string fieldName, string fieldText) {try {fieldfield = new Textfield (fieldName, fieldText, field.store.yes); document.add (campo); } catch (Exception e) {E.PrintStackTrace (); }} / *** Agregar documento al índice* / public void pushIndex () {try {indexWriter.addDocument (documento); documento = nuevo documento (); } catch (Exception e) {E.PrintStackTrace (); }} / *** Agregue un documento completo y guárdelo al índice* @param URL La URL agregada a la url* @param text URL correspondiente* / public void addoneIndex (url de cadena, texto de cadena) {this.addfield ("url", url); this.addfield ("texto", texto); this.pushIndex (); } / *** Close Index Writing* / public void Close () {try {indexwriter.close (); } catch (Exception e) {E.PrintStackTrace (); }}}Índice de búsqueda
paquete webcrawler.index; import java.io.file; import java.util.scanner; import org.apache.lucene.analysis.analyzer; import org.apache.lucene.document.document; import org.apache.lucene.index.directoryReader; import org.apache.lucene.QreerSerer; org.apache.lucene.search.indexsearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.scorredoc; importar org.apache.lucene.search.topdocs; import org.apache.lucene.store.fsdirectory; importar; importación; org.wltea.analyzer.lucene.ikanalyzer;/** * @author lannooo * */public class SearchIndex {private indexsearcher indexsearcher; Analizador de analizador privado; Parser privado de consulta; consulta de consulta privada; Hits privados de topdocs; lector de lector de directorio privado; / *** @param ruta La ruta para la búsqueda de índice*/ public SearchIndex (string ruta) {try {lector = DirectoryReader.open (FSDirectory.open (nuevo archivo (Path))); indexsearcher = new IndexSearcher (lector); analizador = nuevo ikanalyzer (); } catch (Exception e) {E.PrintStackTrace (); }} / *** @param fieldName El nombre de dominio de la búsqueda* @param text El contenido de la búsqueda* @param matchNumber el número máximo de coincidencias* @return el número máximo de coincidencias encontradas* / public int search (string fieldName, string text, int consulta = parser.parse (texto); hits = indexSearcher.Search (Query, MatchNumber); return hits.totalhits; } catch (Exception e) {E.PrintStackTrace (); } return -1; } / *** Imprima todas las coincidencias* / public void Printhits () {try {System.out.println ("Total Hits Number:"+Hits.totalhits); for (scoredoc doc: hits.scoredocs) {document document = indexsearcher.doc (doc.doc); System.out.println (document.get ("url")); System.out.println (document.get ("text")); } lector.close (); } catch (Exception e) {E.PrintStackTrace (); }} public static void main (string [] args) { /*Palabra clave de entrada* / Scanner in = new Scanner (System.in); System.out.println ("Ingrese la ruta del índice:"); Ruta de cadena = in.nextline (). Trim (); while (path.length () == 0) {System.out.println ("Ingrese la ruta del índice:"); ruta = in.nextline (). Trim (); } System.out.println ("Ingrese el número de éxito máximo:"); int max = in.nextInt (); while (max <0) {system.out.println ("Ingrese el número de hit max:"); max = in.nextInt (); } in.nextline (); System.out.print ("Buscar >>>"); String text = in.nextline (). Trim (); /* Entrando en la palabra clave del usuario, si es q, sale, y la longitud es 0 también se exitió*/ while (! Text.equals ("q")) {if (text.length ()> 0) {searchIndex search = new SearchIndex (ruta); int hits = search.search ("texto", texto, max); if (hits! =-1) {search.printhits (); }} System.out.print ("Buscar >>>"); text = in.nextline (). Trim (); }}}Interfaz de la interfaz de usuario (por conveniencia, es solo un formato de línea de comando, puede escribir una interfaz GUI de acuerdo con sus necesidades)
paquete webcrawler.ui; import java.util.scanner; import webcrawler.index.searchindex;/***@author lannooo**/public class ui {public static void main (string [] args) {/*Entrada palabras clave*/escaneador in = new Scanner (System.in); System.out.print ("Buscar >>>"); String text = in.nextline (). Trim (); /*Para palabras clave de usuario, si es q, saldrá, y la longitud es 0 saldrá*/while (! Text.equals ("q") && text.length ()> 0) {searchIndex search = new SearchIndex ("d:/index-spider2"); int hits = search.search ("texto", texto, 20); if (hits! =-1) {search.printhits (); } System.out.print ("Buscar >>>"); text = in.nextline (). Trim (); }}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.