perkenalan
Terapkan perpustakaan open source Java untuk menulis mesin pencari yang dapat merangkak konten situs web. Dan sangat merangkak berdasarkan konten halaman web untuk mendapatkan semua alamat dan konten halaman web yang relevan. Pengguna dapat mencari semua alamat web yang relevan melalui kata kunci.
Fungsi spesifik
(1) Pengguna dapat menentukan konten halaman web yang sesuai dengan URL.
(2) Purse konten halaman web dan memperoleh semua alamat tautan URL.
(3) Pengguna dapat mengatur kedalaman merangkak, yang berarti mulai dari halaman yang sesuai dengan URL awal, URL di halaman web yang sesuai dengan semua URL dapat dirangkak, dan sebagainya. Semakin besar kedalaman, semakin banyak situs web yang dapat Anda perayangi.
(4) Simpan dan indeks konten URL yang dirangkak. Konten yang diindeks adalah alamat URL itu sendiri dan judul halaman web yang sesuai dengan URL.
(5) Pengguna dapat mencari URL melalui kata kunci untuk menemukan URL dengan kata kunci.
(6) Proses menetapkan indeks dan indeks pencarian dapat secara cerdas mengidentifikasi kata kunci Cina dan melakukan operasi segmentasi kata pada kata kunci.
(7) Pengguna dapat menentukan alamat untuk menyimpan indeks, URL awal, kedalaman perayapan, kata kunci untuk mencari, dan kecocokan maksimum.
Kerangka kerja open source
Kode Sumber
Bagian Crawler: Spider.java
Paket webcrawler.spider; impor java.io.ioException; import java.util.arraylist; import java.util.hashset; impor java.util.scanner; impor org.jsoup.jsoup; import org.jsoup.nodes.document; impor org.jsoup.nod.nod.jelement.jsoup.nodes.document; impor org.jsoup.nod.nod.jelements.nodes.document; Impor org.jsoup webcrawler.index.buildIndex;/** * @author lannooo */public class spider {arraylist <string> urls; Starturl string pribadi; private int diglevel; / *** @param starturl URL start crawler* @param diglevel kedalaman crawl*/ laba -laba publik (string starturl, int diglevel) {this.starturl = starturl; this.diglevel = diglevel; this.urls = new arraylist <> (); } /** * @param level The current crawl depth remaining* @param arrayList The URL set that needs to be crawled in the next round* @return The new URL set crawled from a single-frame url set* @throws IOException */ public ArrayList<String> getLevelURLs(int level, ArrayList<String> arrayList) throws IOException{ ArrayList <String> Total = NULL; if (level> 0) {total = arraylist baru <> (); untuk (string url: arraylist) { /*untuk setiap url di setiap arraylist, pertama -tama parse konten halaman webnya dan dapatkan semua entri URL di dalamnya* / untuk (string masing -masing: getBareLinks (url)) {total.add (masing -masing); }} /*Gunakan wadah hashset untuk menghapus duplikat secara total* / hashset <string> hashset = hashset baru <> (total); Total = New ArrayList <> (HashSet); } Total pengembalian; } / ** * Mulai dari starturl, merangkak semua url yang relevan * @throws ioException * / public void getAll () melempar ioException {arraylist <string> newurls; ArrayList <String> currentUrls = ArrayList baru <> (); /*Tambahkan starturl ke dalam daftar lancar dan mulai merangkak dari url*/ currentUrls.add (starturl) ini; for(int i=digLevel; i>0; i--){ /* * For each layer, you must get the url set extended by this url* Then add the crawled urls of the current set to the total URL set* Finally, newURLs enter the next round of loop as a new set that needs to be deeply crawled*/ System.out.println("Dig into level: " + (digLevel-i+1)); newurls = getlevelurls (i, currentUrls); untuk (string masing -masing: currentUrls) {urls.add (masing -masing); } currentUrls = newurls; } untuk (string masing -masing: currentUrls) {urls.add (masing -masing); } Hashset <string> hashset = hashset baru <> (urls); Urls = new arraylist <> (hashset); } / *** @param path Path untuk menyimpan indeks* @throws ioException* / public void storeUrlSandInfo (string path) melempar ioException {buildIndex build = BuildIndEndex baru (path); /* Merangkak semua url dalam url ke dalam judul halaman web aktual*/ untuk (string masing -masing: url) {string text = getLinkText (masing -masing); if (text! = null) {build.addfield ("url", masing -masing); build.addfield ("teks", teks); /*Masukkan entri ini ke dalam indeks*/ build.pushIndex (); }} build.close (); } / ** * @param url Anda perlu mendapatkan URL judul halaman web * @return title konten * @throws ioException * / public string getLinkText (string url) melempar ioException {document document = null; Coba { /*Sambungkan dengan JSoup, atur timeout ke 3 detik* / document = jsoup.connect (url) .timeout (3000) .get (); } catch (Exception e) {System.out.println ("[Timeout] Dapatkan judul url:"+url); kembali nol; } String title = document.title (); judul kembali; } / ** * @param URL URL Untuk Parsing Konten * @Return Mengembalikan daftar semua URL di konten halaman web URL * @Throws IoException * / Public ArrayList <String> getBareLinks (String URL) Throws IoException {ArrayList <String> LinkSlist = Arraylist = Arraylist = Arraylist = Arraylist = Arraylist = Array (ArrayList (String> LinkSlist = ArrayList = Arraylist = Arraylist = Array (ArrayList <ringlist = LinkSlist = ArrayList = Arraylist = Array; Array; Dokumen dokumen; coba {document = jsoup.connect (url) .timeout (2000) .get (); } catch (Exception e) {return linkslist; } /*Dapatkan semua <a> tag dengan atribut href dari tag <dot body> / elemen link = document.select ("body"). Pilih ("a [href]"); untuk (tautan elemen: tautan) { / *Ekstrak URL dari setiap tag <a> yang diuraikan dan hapus jangkar * / string href = link.attr ("abs: href"). replaceall ("#", ""); /*Hanya tambahkan URL dengan karakter zju.edu.cn, hapus '/'*/if (href.contains ("zju.edu.cn")) {if (href.endswith ("/")) {href = href.substring (0, href.length ()-1); } linkslist.add (href); }} Hashset <string> hashset = hashset baru <> (linkslist); ArrayList <String> arrayList = ArrayList baru <> (hashSet); Return ArrayList; } public static void main (string [] args) {scanner in = new scanner (System.in); System.out.println ("Masukkan url:"); String url = in.nextline (). Trim (); while (! url.startswith ("http: //")) {System.out.println ("http: // diperlukan!"); System.out.println ("Masukkan url:"); url = in.nextline (). trim (); } System.out.println ("Masukkan kedalaman untuk menggali lebih banyak URL [<= 3 disarankan]:"); int depth = in.nextInt (); Spider Spider = New Spider (url, kedalaman); System.out.println ("Masukkan path yang ingin Anda simpan [default = d:/index-spider]:"); String path = in.nextline (). Trim (); if (path.length () == 0) {path = "d:/index-spider"; } coba {System.out.println ("Mulai pengambilan ..."); spider.getall (); System.out.println ("URLS Got Success!"); spider.storeurlsandinfo (jalur); System.out.println ("Tersimpan Sukses!"); } catch (ioException e) {e.printstacktrace (); }}}BuildIndex.java
Paket webcrawler.index; impor java.io.*; impor org.apache.lucene.analysis.Analyzer; impor org.apache.lucene.document.document; impor org.apache.lucene.document.field; impor orgache.apache.lucene.document.text.text; org.apache.lucene.index.indexwriterConfig; impor org.apache.lucene.store.directory; impor org.apache.lucene.store.fsdirectory; impor org.apache.lucene.util.version; Impor org.wlteA.analyzer.apae.aoo.ao.aUnor (liNAn, LIGIN.AKAN/LIGNION; LIGNAT/LIGNAN/LIFAN/LIGNAN/LIFAN/LIFAN, LIGNANA/LiNAN.AKION/LiNAn, LIUnzer/LIGNAN, LIUnzer/LiNAn, LIUnze.AnoHan, LiNAN.AKION/LIUNOOD/IMPORT; BuildIndex {file private file; direktori direktori pribadi; indeks indeks privateWriter; konfigurasi private indexWriterConfig; Analyzer Private Analyzer; dokumen dokumen pribadi; / *** @param path indeksing path*/ public buildIndex (string path) {coba {file = file baru (path); direktori = fsdirectory.open (file); dokumen = dokumen baru (); analyzer = new kanalyzer (); /*Kelas Alat Segmentasi Kata Cina*/ config = new IndexWriterConfig (Version.lucene_4_10_0, analyzer); indexWriter = indexWriter baru (direktori, config); } catch (Exception e) {E.PrintStackTrace (); }} / *** @param fieldname Nama item baru yang ditambahkan ke dokumen* @param fieldText konten item baru* / public void addField (String FieldName, String fieldText) {coba {field field = Textfield baru (fieldName, fieldText, field.store.yes); document.add (bidang); } catch (Exception e) {E.PrintStackTrace (); }} / *** Tambahkan dokumen ke indeks* / public void pushIndex () {coba {indexwriter.adddocument (dokumen); dokumen = dokumen baru (); } catch (Exception e) {E.PrintStackTrace (); }} / *** Tambahkan dokumen lengkap dan simpan ke indeks* @param URL URL yang ditambahkan ke URL* @param Text URL yang sesuai Teks* / public void addoneIndex (string url, string text) {this.addfield ("url", url); this.addfield ("teks", teks); this.pushindex (); } / *** Tutup indeks penulisan* / public void close () {coba {indexwriter.close (); } catch (Exception e) {E.PrintStackTrace (); }}}Indeks pencarian
Paket webcrawler.index; impor java.io.file; import java.util.scanner; impor org.apache.lucene.analysis.analyzer; impor org.apache.lucene.document.document; impor org.apache.lucene.index.directoryerer; Impor; org.apache.lucene.queryparser.classic.queryparser; impor org.apache.lucene.search.indexsearcher; impor org.apache.lucene.search.Query; import org.apache.lucene.search.scoreCedoc; impor org.apache.lucene.search.search.search.search.search.search.search.search.search.search.search.search.sewar org.apache.lucene.store.fsdirectory; impor org.wltea.analyzer.lucene.ikanyalyzer;/** * @author lannooo * */Public Class SearchIndex {Private IndexSearcher IndexSearcher; Analyzer Private Analyzer; Parser queryparser pribadi; permintaan permintaan pribadi; hit Topdocs pribadi; pembaca direktori pribadi; / *** @param path Path untuk pencarian indeks*/ pencarian publik (jalur string) {coba {reader = directoryreader.open (fsdirectory.open (file baru (path)))); indexSearcher = IndexSearcher baru (pembaca); analyzer = new kanalyzer (); } catch (Exception e) {E.PrintStackTrace (); } } /** * @param fieldName The domain name of the search* @param text The content of the search* @param matchNumber The maximum number of matches* @return The maximum number of matches found */ public int search(String fieldName, String text, int matchNumber){ try { parser = new QueryParser(fieldName, analyzer); kueri = parser.parse (teks); HITS = IndexSearcher.Search (kueri, matchNumber); Return Hits.totalhits; } catch (Exception e) {E.PrintStackTrace (); } return -1; } / *** Cetak semua kecocokan* / public void printhits () {try {System.out.println ("Total Hits Number:"+Hits.totalhits); for (scorsoc 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) { /*kata kunci input* / pemindai di = pemindai baru (System.in); System.out.println ("Masukkan jalur indeks:"); String path = in.nextline (). Trim (); while (path.length () == 0) {System.out.println ("Masukkan jalur indeks:"); path = in.nextline (). trim (); } System.out.println ("Masukkan Max Hit Number:"); int max = in.nextInt (); while (max <0) {System.out.println ("Enter Max Hit Number:"); max = in.nextInt (); } in.nextline (); System.out.print ("Search >>>"); String text = in.nextline (). Trim (); /* Looping ke kata kunci pengguna, jika q, ia keluar, dan panjangnya 0 juga keluar*/ while (! Text.equals ("q")) {if (text.length ()> 0) {SearchIndex Search = new SearchIndex (Path); int hits = search.search ("text", text, max); if (hit! =-1) {search.printhits (); }} System.out.print ("Cari >>>"); text = in.nextline (). trim (); }}}Antarmuka UI (untuk kenyamanan, ini hanya format baris perintah, Anda dapat menulis antarmuka GUI sesuai dengan kebutuhan Anda)
Paket webcrawler.ui; import java.util.scanner; import webcrawler.index.searchIndex;/***@author lannooo**/kelas publik UI {public static void main (string [] args) {/*input kata kunci*/pemindai di = scanner new baru (System.in); System.out.print ("Search >>>"); String text = in.nextline (). Trim (); /*Untuk kata kunci pengguna, jika q, itu akan keluar, dan panjangnya 0 akan keluar*/while (! Text.equals ("q") && text.length ()> 0) {SearchIndex Search = new SearchIndex ("d:/index-spider2"); int hits = search.search ("text", text, 20); if (hit! =-1) {search.printhits (); } System.out.print ("Search >>>"); text = in.nextline (). trim (); }}}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.