導入
Javaのオープンソースライブラリを適用して、Webサイトのコンテンツをクロールできる検索エンジンを作成します。 Webページのコンテンツに基づいて深くクロールして、関連するすべてのWebページアドレスとコンテンツを取得します。ユーザーは、キーワードを使用して、関連するすべてのWebアドレスを検索できます。
特定の関数
(1)ユーザーは、URLに対応するWebページのコンテンツを指定できます。
(2)Webページのコンテンツを解析し、すべてのURLリンクアドレスを取得します。
(3)ユーザーは、クロールの深さを設定できます。つまり、最初のURLに対応するページから始まることを意味します。すべてのURLに対応するWebページのURLはクロールすることができます。深さが大きければ大きいほど、より多くのWebサイトをクロールできます。
(4)クロールされたURLコンテンツを保存してインデックスを付けます。インデックス付きコンテンツは、URLアドレス自体と、URLに対応するWebページタイトルです。
(5)ユーザーは、キーワードを介してURLを検索して、キーワードを使用してURLを見つけることができます。
(6)インデックスを確立してインデックスを検索するプロセスは、中国のキーワードをインテリジェントに識別し、キーワードで単語セグメンテーション操作を実行できます。
(7)ユーザーは、インデックス、初期URL、クロール深さ、検索するキーワード、および最大一致を保存するアドレスを指定できます。
オープンソースフレームワーク
ソースコード
クローラーパート:spider.java
パッケージwebcrawler.spider; import java.io.ioexception; import java.util.arraylist; java.util.hashset; import java.util.scanner; import org.jsoup.jsoup; import org.jsoup.nodes.document; import org.nodes.elect.elment; webcrawler.index.buildindex;/** * @author lannooo */public class spider {arraylist <string> urls;プライベートストリングstarturl; Private int diglevel; / *** @param starturlクローラーのスタートurl* @param diglevel crawl depth*/ public spider(string starturl、int diglevel){this.starturl = starturl; this.diglevel = diglevel; this.urls = new ArrayList <>(); } / *** @paramレベルヌル; if(level> 0){total = new ArrayList <>(); for(string url:arrayList){ /*各arrayListの各URLに対して、最初にそのWebページコンテンツを解析し、すべてのURLエントリを取得します* / for(string各:getBareLinks(url)){total.add(hile); }} /*ハッシュセット容器を使用して、合計で重複を削除します* / hashset <string> hashset = new Hashset <>(合計); Total = new ArrayList <>(hashset); }合計を返します。 } / ** * starturlから開始、すべての関連するurls * @throws ioexception * / public void getall()throws ioexception {arraylist <string> newurls; ArrayList <String> currentUrls = new ArrayList <>(); /*starturlをcurrenturlsのリストに追加し、このurlからrawうを開始します*/ currenturls.add(starturl); (int i = diglevel; i> 0; i-){ /**各レイヤーに対して、このURLによってURLセットを拡張する必要があります*次に、現在のセットのクロールされたURLを合計URLセットに追加する必要があります*最後に、newUrlsは次のループのラウンドのループに入ります。 newurls = getLevelurls(i、currenturrs); for(文字列ごと:currenturrs){urls.add(hiled); } currenturls = newurls; } for(文字列ごと:currenturrs){urls.add(hiled); } hashset <string> hashset = new Hashset <>(urls); urls = new ArrayList <>(Hashset); } / *** @paramパスインデックスを保存するパス* @throws ioexception* / public void storeurlsandinfo(string path)throws ioexception {buildindex build = new buildindex(path); /* URLのすべてのURLを実際のWebページにクロールしますタイトル*/ for(string各:urls){string text = getLinkText(各); if(text!= null){build.addfield( "url"、それぞれ); build.addfield( "text"、text); /*このエントリをインデックスに入れます*/ build.pushindex(); }} build.close(); } / ** * @param url WebページのURLを取得する必要がありますタイトル * @returnタイトルコンテンツ * @Throws IOException * / public String getLinkText(string url)throws ioexception {document document = null; try { /*jsoupと接続し、タイムアウトを3秒に設定します* / document = jsoup.connect(url).timeout(3000).get(); } catch(Exception e){System.out.println( "[timeout] get url:"+url); nullを返します。 }文字列ittitle = document.title();タイトルを返す; } / ** * @param url url for content parsing * @return url * @throws ioexception * / public arraylist <string> getBareLinks(String URL)のWebページコンテンツのすべてのURLのリストを返します。ドキュメントドキュメント。 try {document = jsoup.connect(url).timeout(2000).get(); } catch(例外e){return linkslist; } /*<body>タグのhref属性を使用してすべての<a>タグを取得します* /要素links = document.select( "body")。select( "a [href]"); for(要素リンク:リンク){ / *解析された各<a>タグからURLを抽出し、anchor * / string href = link.attr( "abs:href")。 /*zju.edu.cn文字でURLを追加するだけで、 '/'*/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( "enter url:"); string url = in.nextline()。trim(); while(!url.startswith( "http://")){system.out.println( "http:// resed!"); system.out.println( "enter url:"); url = in.nextline()。trim(); } system.out.println( "深さを入力して、より多くのURLを掘る[<= 3推奨]:"); int depth = in.nextint();スパイダースパイダー=新しいスパイダー(URL、深さ); system.out.println( "保存するパスを入力します[default = d:/index-spider]:"); string path = in.nextline()。trim(); if(path.length()== 0){path = "d:/index-spider"; } try {system.out.println( "fetching ..."); spider.getall(); system.out.println( "urls got success!"); spider.storeurlsandinfo(パス); system.out.println( "Stored success!"); } catch(ioexception e){e.printstacktrace(); }}}BuildIndex.java
Package webcrawler.index; import java.io。*; import org.apache.lucene.analyser.analyzer; Import org.apache.lucene.document.document; import org.apache.lucene.document.field; Import org.apache.lucene.document.document.textfield.textfield; incrg.pacheen.index. apache.lucene.index.indexwriterconfig; Import org.apache.lucene.store.directory; Import org.apache.lucene.store.store.fsdirectory; import org.apache.lucene.util.version; inart org.wltea.analyzer.lucene.lucene.lucene.lucene.lucenalymoo * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */public class buildindex {private file;プライベートディレクトリディレクトリ。プライベートインデックスライターインデックスライター。 Private IndexWriterConfig config;プライベートアナライザーアナライザー。プライベートドキュメントドキュメント。 / *** @param Path Indexing Path*/ public BuildIndex(String Path){try {file = new file(path); directory = fsdirectory.open(file); document = new Document(); Analyzer = new Ikanalyzer(); /*中国語の単語セグメンテーションツールクラス*/ config = new indexwriterconfig(version.lucene_4_10_0、Analyzer); indexwriter = new IndexWriter(ディレクトリ、config); } catch(Exception e){e.printstacktrace(); }} / *** @param fieldNameドキュメントに追加された新しいアイテムの名前* @param fieldText新しいアイテムのコンテンツ* / public void addfield(string fieldname、string fieldtext){try {field field = new textfield(fieldname、fieldtext、field.store.yes); document.add(field); } catch(Exception e){e.printstacktrace(); }} / *** indexにドキュメントを追加* / public void pushindex(){try {indexwriter.adddocument(document); document = new Document(); } catch(Exception e){e.printstacktrace(); }} / ***完全なドキュメントを追加してindexに保存* @param url urlをurlに追加します。 this.addfield( "text"、text); this.pushindex(); } / *** close index writing* / public void close(){try {indexwriter.close(); } catch(Exception e){e.printstacktrace(); }}}インデックスを検索します
パッケージ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; apache.lucene.queryparser.classic.queryparser; Import org.apache.lucene.search.indexsearcher; Import org.apache.lucene.search.query; Import org.apache.lucene.search.scoredoc; Import org.apache.lucene.lucene.topdocs; org.apache.lucene.store.fsdirectory; Import org.wltea.analyzer.lucene.ikanalyzer;/** * @author lannooo * */public class searchindex {private indexsearcher indexssearcher;プライベートアナライザーアナライザー。プライベートQueryParserパーサー。プライベートクエリクエリ。プライベートトップドクヒット。プライベートディレクトリリーダーリーダー。 / *** @Param PATHインデックス検索のパス*/ public SearchIndex(String Path){try {reader = directoryreader.open(fsdirectory.open(new file(path))); indexsearcher = new IndexSearcher(Reader); Analyzer = new Ikanalyzer(); } catch(Exception e){e.printstacktrace(); }} / *** @param fieldname searchのドメイン名* @paramテキスト検索のコンテンツ* @param matchnumber一致の最大数のマッチナンバー* @return見つかったマッチの最大数* / public int search(string fieldname、string text、int matchnumber){try {parser = new queryparser(fieldname、analyzer); query = parser.parse(text); hits = indexsearcher.search(query、mathnumber); hits.totalhitsを返します。 } catch(Exception e){e.printstacktrace(); } return -1; } / ***すべての一致を印刷* / public void printhits(){try {system.out.println( "合計ヒット数:"+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")); } reader.close(); } catch(Exception e){e.printstacktrace(); }} public static void main(string [] args){ /*入力キーワード* / scanner in = new scanner(system.in); system.out.println( "インデックスのパスを入力:"); string path = in.nextline()。trim(); while(path.length()== 0){system.out.println( "インデックスのパスを入力:"); path = in.nextline()。trim(); } system.out.println( "max hit number:"); int max = in.nextint(); while(max <0){system.out.println( "max hit number:"); max = in.nextint(); } in.nextline(); System.out.print( "Search >>>"); string text = in.nextline()。trim(); /*ユーザーのキーワードにループする、qの場合、それは終了し、長さは0が終了します*/ while(!text.equals( "q")){if(text.length()> 0){searchIndex search = new SearchIndex(PATH); int hits = search.search( "text"、text、max); if(hits!= -1){search.printhits(); }} system.out.print( "search >>>"); text = in.nextline()。trim(); }}}UIインターフェイス(便宜上、それは単なるコマンドライン形式であり、ニーズに応じてGUIインターフェイスを書くことができます)
パッケージwebcrawler.ui; Import java.util.scanner; import webcrawler.index.searchindex;/***@author lannooo**/public class ui {public static void main(string [] args){/*入力キーワード*/scanner in = new scanner(system.in); System.out.print( "Search >>>"); string text = in.nextline()。trim(); /*ユーザーキーワードの場合、qの場合、終了し、長さは0になります*/while(!text.equals( "q")&& text.length()> 0){searchIndex search = new SearchIndex( "d:/index-spider2"); int hits = search.search( "text"、text、20); if(hits!= -1){search.printhits(); } system.out.print( "search >>>"); text = in.nextline()。trim(); }}}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。