Einführung
Wenden Sie die Open -Source -Bibliothek von Java an, um eine Suchmaschine zu schreiben, die den Inhalt einer Website kriechen kann. Und crawl basierend auf dem Inhalt der Webseite, um alle relevanten Webseitenadressen und Inhalte zu erhalten. Benutzer können über Keywords nach allen relevanten Webadressen suchen.
Spezifische Funktionen
(1) Der Benutzer kann den Inhalt der Webseite angeben, die einer URL entspricht.
(2) analysiert den Inhalt der Webseite und erhält alle URL -Linkadressen.
(3) Der Benutzer kann die Kriechtiefe festlegen, was bedeutet, dass aus der Seite, die der anfänglichen URL entspricht, die URLs auf der Webseite, die allen URLs entspricht, gekrabbeln können und so weiter. Je größer die Tiefe, desto mehr Websites können Sie kriechen.
(4) Speichern und indizieren den gekrabbten URL -Inhalt. Der indizierte Inhalt ist die URL -Adresse selbst und der Webseitentitel, der der URL entspricht.
(5) Benutzer können die URL über Keywords durchsuchen, um die URL mit dem Schlüsselwort zu finden.
(6) Der Prozess des Erstellens von Indizes und Suchindizes kann chinesische Schlüsselwörter intelligent identifizieren und Word -Segmentierungsvorgänge für Schlüsselwörter durchführen.
(7) Der Benutzer kann die Adresse angeben, um den Index, die anfängliche URL, die Crawl -Tiefe, die zu suchenden Schlüsselwörter und die maximale Übereinstimmung zu speichern.
Open Source -Framework
Quellcode
Crawler -Teil: spider.java
Paket webcrawler.spider; import java.io.ioxception; import Java.util.ArrayList; import Java.util.hashset; import Java.util.scanner; webcrawler.index.buildIndex;/** * @author lannooo */public class spider {arrayList <string> urls; private String starturl; privates int grabenlevel; / *** @param starturl Die Crawler -Start -URL* @param diglevel crawltiefe*/ public spider (String starturl, int diglevel) {this.starturl = starturl; this.diglevel = diglevel; this.urls = new ArrayList <> (); } / *** @Param Level Die aktuelle Crawl-Tiefe verbleibende* @param ArrayList Das URL-Set, das in der nächsten Runde krabbeln muss if (Level> 0) {Total = New ArrayList <> (); Für (String -URL: ArrayList) { /*für jede URL in jeder ArrayList -Inhalt zuerst analysieren und alle URL -Einträge darin erhalten* / für (Zeichenfolge jeweils: getBarelinks (url)) {Total.add (jeweils); }} /*Verwenden Sie den Hashset -Container, um Duplikate insgesamt zu löschen Total = New ArrayList <> (Hashset); } Return Total; } / ** * Starturl starten Sie alle relevanten URLs * @throws ioException * / public void getAll () löscht IoException {ArrayList <string> newurls aus; ArrayList <string> currenturls = new ArrayList <> (); /*Starturl in die Liste der Currenturls hinzufügen und von dieser URL von dieser URL crawls*/ currentUrls.add (starturl) gestartet werden; Für (int i = diglevel; i> 0; i-) { /** für jede Schicht müssen Sie den von dieser URL* verlängerten URL-Set den krabbierten URLs des aktuellen Satzes hinzufügen. newurls = getlevelurls (i, currenturls); für (Zeichenfolge jeweils: currentUrls) {urls.add (jeweils); } currenturls = newurls; } für (Zeichenfolge jeweils: currenturls) {urls.add (jeweils); } Hashset <string> Hashset = new Hashset <> (URLs); Urls = new ArrayList <> (Hashset); } / *** @param Pfad Der Pfad zum Speichern des Index* @throws ioException* / public void storeUrlsandInfo (String Pfad) löst IOException {BuildIndex build = new BuildIndex (Pfad) aus; /* Kriechen Sie alle URLs in URLs in den tatsächlichen Webseiten -Titel*/ für (String jeweils: urls) {String text = getLinkText (jeweils); if (text! = null) {Build.addfield ("url", jeweils); Build.Addfield ("Text", Text); /*Legen Sie diesen Eintrag in den Index ein*/ build.pushIndex (); }} build.close (); } / ** * @param URL Sie müssen die URL des Webseiten -Titels erhalten * @Return Title Inhalt * @throws ioException * / public String getLinkText (String url) löscht IOException {document document = null aus; Versuchen Sie es { /*verbinden Sie sich mit JSOUP, stellen Sie die Zeitüberschreitung auf 3 Sekunden ein* / document = jSOUP.Connect (URL) .TimeOut (3000) .get (); } catch (Ausnahme e) {System.out.println ("[Timeout] Title of URL erhalten:"+url); null zurückkehren; } String title = document.title (); Rückgabetitel; } / ** * @param URL URL für Inhaltsanalysen * @Return gibt die Liste aller URLs im Webseite Inhalt der URL zurück * @throws ioException * / public arrayList <string> getBarelInn (String url) aus. Dokumentdokument; try {document = jsoup.connect (url) .Timeout (2000) .get (); } catch (Ausnahme e) {return linkslist; } /*Alle <a> Tags mit HREF -Attributen des <body> tag* / Elements links = document.select ("body") erhalten. Select ("a [href]"); für (Element Link: Links) { / *extrahieren Sie die URL aus jedem analysierten <a> Tag und entfernen Sie den Anker * / String href = link.attr ("ABS: href"). Ersatz ("#", ""); /*Fügen Sie die URL nur mit Zju.edu.cn-Zeichen hinzu, entfernen Sie die '/'*/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); ArrayList zurückgeben; } public static void main (String [] args) {scanner in = neuer Scanner (System.in); System.out.println ("URL eingeben:"); String url = in.nextline (). Trim (); while (! url.startswith ("http: //")) {System.out.println ("http: // wird benötigt!"); System.out.println ("URL eingeben:"); url = in.nextline (). trim (); } System.out.println ("Tiefe eingeben, um mehr URLs zu graben [<= 3 Empfohlen]:"); int tiefe = in.nextint (); Spider Spider = New Spider (URL, Tiefe); System.out.println ("Pfad eingeben, dass Sie speichern möchten [default = d:/index-spinnen]:"); String path = in.nextline (). Trim (); if (path.length () == 0) {path = "d:/indexspinnen"; } try {System.out.println ("Fetching ..."); spider.getall (); System.out.println ("URLs haben Erfolg!"); Spider.StoreurlsandInfo (Path); System.out.println ("gespeicherer Erfolg!"); } catch (ioException e) {e.printstacktrace (); }}}BuildIndex.java
Paket webcrawler.index; import Java.io.*; import org.apache.lucen.analysis.Analyzer; org.apache.lucene.index.indexWriterConfig; import org.apache.lucene.store.directory; import org.apache.lucen.store.fsdirectory; import org.apache.lucene.util.version; BuildIndex {private Datei Datei; privates Verzeichnisverzeichnis; privater Indexwriter -Indexwriter; private IndexWriterConfig -Konfiguration; Privatanalysator Analysator; privates Dokument Dokument; / *** @param Pfadindexierungspfad*/ public BuildIndex (String -Pfad) {try {file = new File (Path); Verzeichnis = fsdirectory.open (Datei); document = new document (); Analysator = neuer Ikanalyzer (); /*Chinesische Word -Segmentierung Toolklasse*/ config = new indexWriterConfig (Version.lucene_4_10_0, Analyzer); IndexWriter = neuer IndexWriter (Verzeichnis, config); } catch (Ausnahme e) {e.printstacktrace (); }} / *** @param fieldName Der Name des neuen Elements, das dem Dokument hinzugefügt wurde* @param fieldText Der Inhalt des neuen Elements* / public void addfield (String FieldName, String FieldText) {try {field field = new textField (fieldname, fieldText, field.store.yes); document.add (Feld); } catch (Ausnahme e) {e.printstacktrace (); }} / *** Dokument zum Index hinzufügen document = new document (); } catch (Ausnahme e) {e.printstacktrace (); }} / *** Fügen Sie ein vollständiges Dokument hinzu und speichern Sie es dem Index* @param URL Die URL, die zur URL hinzugefügt wurde this.addfield ("Text", Text); this.pushIndex (); } / *** Close Index Writing* / public void close () {try {indexWriter.close (); } catch (Ausnahme e) {e.printstacktrace (); }}}Suchindex
Paket webcrawler.index; import java.io.file; import java.util.scanner; import org.apache.lucen.Analysis.Analyzer; org.apache.lucene.document org.apache.lucene.queryparser.classic.queryparser; import org.apache.lucene.search.indexSearcher; import org.apache.lucene.search.query; org.apache.lucene.store.fsdirectory; import org.wlTea.Analyzer.lucene.ikanalyzer;/** * @Author Lannooo * */Public Class Searchindex {private IndexSearcher Index; Privatanalysator Analysator; privater Queryparser -Parser; private Abfrageanfrage; private Topdocs -Hits; privater Verzeichnisreader -Leser; / *** @param Pfad Der Pfad für die Indexsuche*/ public SearchIndex (String -Pfad) {try {reader = dirienceReader.open (fsDirectory.open (neue Datei)); IndexSearcher = neuer Index (Reader); Analysator = neuer Ikanalyzer (); } catch (Ausnahme e) {e.printstacktrace (); }} / *** @param fieldname Der Domain -Name der Suche* @param text Der Inhalt der Suche* @param MatchNumber Die maximale Anzahl von Übereinstimmungen* @return die maximale Anzahl von Übereinstimmungen gefunden* / public int Search (String -Feldname, String -Text, Int -MatchNumber) {try {parser = New Queryparser (Feldname, Analyzer); query = parser.Parse (Text); Hits = IndexSearcher.Search (Abfrage, MatchNumber); return thits.totalhits; } catch (Ausnahme e) {e.printstacktrace (); } return -1; } / *** Alle Übereinstimmungen ausdrucken* / public void printhits () {try {System.out.println ("Gesamthits Nummer:"+hits.totalhits); für (ScoreCOC doc: hits.scordecs) {document document = indexer.doc (doc.doc); System.out.println (document.get ("url")); System.out.println (document.get ("text")); } reader.close (); } catch (Ausnahme e) {e.printstacktrace (); }} public static void main (String [] args) { /*eingeben Schlüsselwort* / scanner in = new scanner (System.in); System.out.println ("Pfad des Index eingeben:"); String path = in.nextline (). Trim (); while (path.length () == 0) {System.out.println ("Pfad des Index eingeben:"); path = in.Nextline (). trim (); } System.out.println ("MAX -HIT -Nummer eingeben:"); int max = in.nextint (); while (max <0) {system.out.println ("max max hit number:"); max = in.Nextint (); } in.nextline (); System.out.print ("Suche >>>"); String text = in.nextline (). Trim (); /* In das Schlüsselwort des Benutzers einleiten, wenn es q ist, beendet es, und die Länge wird ebenfalls beendet*/ 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 -Schnittstelle (zur Bequemlichkeit ist nur ein Befehlszeilenformat, Sie können eine GUI -Oberfläche entsprechend Ihren Anforderungen schreiben)
Paket webcrawler.ui; import java.util.scanner; importieren webcrawler.index.searchIndex;/***@Author lannooo**/public class ui {public static void main (String [] args) {/*Input -Keywords*/scanner in = neuer Scanner (System.in); System.out.print ("Suche >>>"); String text = in.nextline (). Trim (); /*Für Benutzerschlüsselwörter, wenn es q ist, wird es beendet, und die Länge wird von 0 beendet*/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 ("Suche >>>"); text = in.nextline (). trim (); }}}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.