introdução
Aplique a biblioteca de código aberto da Java para escrever um mecanismo de pesquisa que possa rastejar o conteúdo de um site. E rastejar profundamente com base no conteúdo da página da web para obter todos os endereços e conteúdo da página da Web relevantes. Os usuários podem pesquisar todos os endereços da Web relevantes por meio de palavras -chave.
Funções específicas
(1) O usuário pode especificar o conteúdo da página da web correspondente a um URL.
(2) analisa o conteúdo da página da web e obtém todos os endereços de link de URL.
(3) O usuário pode definir a profundidade de rastreamento, o que significa que, a partir da página correspondente ao URL inicial, os URLs na página da web correspondentes a todos os URLs podem ser rastejados e assim por diante. Quanto maior a profundidade, mais sites você puder rastejar.
(4) Salvar e indexar o conteúdo de URL rastreado. O conteúdo indexado é o próprio endereço da URL e o título da página da web correspondente ao URL.
(5) Os usuários podem pesquisar o URL por meio de palavras -chave para encontrar o URL com a palavra -chave.
(6) O processo de estabelecimento de índices e índices de pesquisa pode identificar de maneira inteligente as palavras -chave chinesas e executar operações de segmentação de palavras em palavras -chave.
(7) O usuário pode especificar o endereço para salvar o índice, o URL inicial, a profundidade de rastreamento, as palavras -chave a serem pesquisadas e a correspondência máxima.
Estrutura de código aberto
Código -fonte
Parte do rastreador: Spider.java
pacote webcrawler.spider; importar java.io.ioException; importar java.util.ArrayList; importar java.util.hashset; importar java.util.scanner; import org.jsoup.jsoup; import.nodes.nodes.melements; webcrawler.index.buildindex;/** * @author Lannooo */public class Spider {ArrayList <String> URLS; Starturl de String Private; private int diglevel; / *** @param Starturl O url inicial do rastreador* @param diglevel crawl Profund*/ public spider (string starturl, int diglevel) {this.starturl = starturl; this.diglevel = diglevel; this.urls = new ArrayList <> (); } / *** @Param Nível da profundidade de rastreamento atual* @param ArrayList O conjunto de URL que precisa ser rasteado na próxima rodada* @return o novo URL Set RAWLED de um URL de quadro único* @THRAYLIST IOEXCECTION* / Public ArrayList <String> GetVeLURLS (INTEXCOLISTRAYLISTS <SriveList = nulo; if (nível> 0) {total = new ArrayList <> (); para (String URL: ArrayList) { /*Para cada URL em cada ArrayList, primeiro analise o conteúdo da página da web e obtenha todas as entradas de URL nele* / para (string cada: getBarelinks (url)) {total.add (cada); }} /*Use o contêiner de hashset para excluir duplicatas no total* / hashset <String> hashSet = new HashSet <> (total); total = novo ArrayList <> (hashset); } retornar total; } / ** * Inicie de StartUrl, rasteje todos os URLs relevantes * @THOWSows IoException * / public void getall () lança IoException {ArrayList <String> newurls; ArrayList <String> currenturls = new ArrayList <> (); /*Adicione StartUrl na lista de currenturls e comece a rastejar deste URL*/ currenturls.add (Starturl); Para (int i = Diglevel; i> 0; i-) { /** Para cada camada, você deve obter o conjunto de URL por este URL* e adicione os URLs rastejados do conjunto atual ao conjunto total de URL* finalmente, o DigLoT.Intl (NEWLSINTLN; newurls = getLevelurls (i, currenturls); para (string cada: currenturls) {urls.add (cada); } currenturls = newurls; } para (string cada: currenturls) {urls.add (cada); } Hashset <string> hashset = new HashSet <> (URLs); Urls = novo ArrayList <> (hashset); } / *** @param Path O caminho para salvar o índice* @THOWSows IoException* / public void storeurlSandinfo (caminho da string) lança IoException {BuildIndex Built = new BuildIndex (caminho); /* Rastreie todos os URLs nos URLs no título real da página da web*/ para (string cada: urls) {string text = getLinkText (cada); if (text! = null) {build.addfield ("url", cada); build.addfield ("texto", texto); /*Coloque esta entrada no índice*/ build.pushindex (); }} build.close (); } / ** * URL @param Você precisa obter o URL do título da página da web * @return title Content * @THOWSoException * / public String getLinkText (String url) lança ioexception {document document = null; tente { /*conectar -se ao jsoup, defina o tempo limite para 3 segundos* / document = jsoup.connect (url) .Timeout (3000) .get (); } catch (Exceção e) {System.out.println ("[Timeout] Obtenha o título de URL:"+url); retornar nulo; } String title = document.title (); título de retorno; } / ** * @param URL URL para análise de conteúdo * @return retorna a lista de todos os URLs no conteúdo da página da web do URL * @throws IoException * / public ArrayList <String> getBarelinks (String url) lança IoException {Arraylist <StryList <StryList> Documento documento; tente {document = jsoup.connect (url) .timeout (2000) .get (); } catch (Exceção e) {return linkslist; } /*Obtenha todas as tags <a> com atributos href da tag <body> tag* / elementos links = document.select ("body"). Select ("a [href]"); para (link do elemento: links) { / *Extrair o URL de cada tag <a> analisada e remova a âncora * / string href = link.attr ("abs: href"). replaceall ("#", ""); /*Adicione apenas o URL com os caracteres zju.edu.cn, remova o '/'*/if (href.contains ("zju.edu.cn")) {if (href.endswith ("/")) {href = href.substring (0, href.lng ()-1); } linkslist.add (href); }} Hashset <string> hashset = new HashSet <> (linkslist); ArrayList <String> ArrayList = new ArrayList <> (HashSet); retornar Arraylist; } public static void main (string [] args) {scanner in = new scanner (system.in); System.out.println ("Enter Url:"); String url = in.nextLine (). TRIM (); while (! url.startswith ("http: //")) {System.out.println ("http: // é necessário!"); System.out.println ("Enter Url:"); url = in.nextLine (). TRIM (); } System.out.println ("Digite a profundidade para cavar mais URLs [<= 3 recomendado]:"); int de profundidade = in.nextInt (); Aranha aranha = nova aranha (URL, profundidade); System.out.println ("Digite o caminho que você deseja salvar [padrão = d:/index-spider]:"); String Path = in.NextLine (). TRIM (); if (path.length () == 0) {path = "d:/index-spider"; } tente {System.out.println ("Comece a buscar ..."); spider.getall (); System.out.println ("URLs obtiveram sucesso!"); Spider.Storeurlsandinfo (caminho); System.out.println ("Sucesso armazenado!"); } catch (ioexception e) {e.printStackTrace (); }}}BuildIndex.java
pacote webcrawler.index; importar java.io. org.apache.lucene.index.indexwriterconfig; importar org.apache.lucene.store.directory; importar org.apache.lucene.store.fsdirectory; importanation.apache. classe BuildIndex {arquivo de arquivo privado; diretório de diretório privado; private indexwriter indexwriter; IndexWriterConfig Private Config; analisador privado analisador; documento privado documento; / *** @Param Path Indexing Path*/ public BuildIndex (String Path) {try {file = new File (caminho); diretório = fsdirectory.open (arquivo); document = new document (); analisador = new ikanalyzer (); /*Ferramenta de segmentação de palavras chinesa Classe*/ config = new IndexWriterConfig (versão.lucene_4_10_0, analisador); indexWriter = new IndexWriter (diretório, config); } catch (Exceção e) {e.printStackTrace (); }} / *** @param fieldName O nome do novo item adicionado ao documento* @param fieldText o conteúdo do novo item* / public void addfield (string fieldname, string fieldText) {try {field field = new textfield (fieldName, fieldText, field.store.yes); document.add (campo); } catch (Exceção e) {e.printStackTrace (); }} / *** Adicione documento ao índice* / public void pushIndex () {try {indexwriter.adddocument (document); document = new document (); } catch (Exceção e) {e.printStackTrace (); }} / *** Adicione um documento completo e salve -o no índice* @param url O URL adicionado ao URL* @param text URL Texto correspondente* / public void AddoneIndex (String URL, String text) {this.addfield ("url", url); this.addfield ("texto", texto); this.pushindex (); } / *** Feche a escrita do índice* / public void Close () {try {indexwriter.close (); } catch (Exceção e) {e.printStackTrace (); }}}Índice de Pesquisa
pacote webcrawler.index; importar java.io.file; importar java.util.scanner; importar org.apache.lucene.analysis.analyzer; importação org.apache.lucene.document.document; importer; importer org.apache.lucene.index.directoryreader; importar; org.apache.lucene.QueryParser.classic.QueryParser; importar org.apache.lucene.search.indexsearcher; importar org.apache.lucene.search.Query; import org.apache.lucene.search.scoredoc; importância.apache.luchene.search.earch.search.ocedoc; org.apache.lucene.store.fsdirectory; importar org.wltea.analyzer.lucene.ikanalyzer;/** * @author lannooo * */public class SearchIndex {private IndexSearcher IndexSearcher; analisador privado analisador; analisador privado queryparser; consulta privada consulta; hits privados topdocs; Reader de diretório privado; / *** @param Path the Path for Index Search*/ public SearchIndex (String Path) {try {reader = diretoryReader.open (fsdirectory.open (novo arquivo (caminho))); IndexSearcher = new IndexSearcher (leitor); analisador = new ikanalyzer (); } catch (Exceção e) {e.printStackTrace (); }} / *** @param fieldName o nome de domínio da pesquisa* @param texto O conteúdo da pesquisa* @param corresponde ao número máximo de correspondências* @return o número máximo de correspondências encontradas* / public int (string fieldName, string text, int mattnumber) {try {parser = new QueryParser (FieldNeRSer, string, Int MatchNumber) {Try {parser = New QueryParSer (FieldNer (FieldNeR,, Int MatchNumber) {Try {Parser = New QueryParSer (FieldNer (FieldNer,, Int MatchNumber) {Try {Parser = New QueryParSer (FieldNer (FieldNer, (FieldNear, Int MatchNumber) {Try {parser = New QueryParser (FieldNer, Query = parser.parse (texto); hits = indexSearcher.search (consulta, matchNumber); hits de retorno.Totalhits; } catch (Exceção e) {e.printStackTrace (); } retornar -1; } / *** Imprima todas as correspondências* / public void Primthits () {try {System.out.println ("Número total de acertos:"+hits.totalhits); para (Scoredoc Doc: hits.scoredocs) {document document = indexSearcher.doc (doc.doc); System.out.println (document.get ("url")); System.out.println (document.get ("text")); } leitor.close (); } catch (Exceção e) {e.printStackTrace (); }} public static void main (string [] args) { /*Entrada Palavra -chave* / scanner in = new Scanner (System.in); System.out.println ("Digite o caminho do índice:"); String Path = in.NextLine (). TRIM (); while (path.Length () == 0) {System.out.println ("Digite o caminho do índice:"); caminho = in.nextLine (). TRIM (); } System.out.println ("Digite o número máximo de acerto:"); int max = in.nextInt (); while (max <0) {System.out.println ("Digite o número máximo de hit:"); max = in.nextInt (); } in.NextLine (); System.out.print ("Search >>>"); Text string = in.NextLine (). TRIM (); /* Looping na palavra -chave do usuário, se for q, ele sai e o comprimento é 0 também é exitado*/ while int hits = search.search ("text", text, max); if (hits! =-1) {search.printhits (); }} System.out.print ("Search >>>"); texto = in.nextLine (). TRIM (); }}}Interface da interface do usuário (por conveniência, é apenas um formato de linha de comando, você pode escrever uma interface GUI de acordo com suas necessidades)
pacote webcrawler.ui; importar java.util.scanner; importar webcrawler.index.searchIndex;/***@Author Lannooo**/public class UI {public static void main (string [] args) {/*input Keywords*/scanner in = new Scanner (Sistema.in); System.out.print ("Search >>>"); Text string = in.NextLine (). TRIM (); /*Para palavras-chave do usuário, se for q, ele sairá, e o comprimento é 0, sairá*/while (! Text.equals ("q") && text.length ()> 0) {searchIndex search = new SearchIndex ("d:/index-spider2"); int hits = search.search ("text", texto, 20); if (hits! =-1) {search.printhits (); } System.out.print ("Search >>>"); texto = in.nextLine (). TRIM (); }}}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.