การแนะนำ
ใช้ไลบรารีโอเพ่นซอร์สของ Java เพื่อเขียนเครื่องมือค้นหาที่สามารถรวบรวมข้อมูลเนื้อหาของเว็บไซต์ และรวบรวมข้อมูลอย่างลึกซึ้งตามเนื้อหาของหน้าเว็บเพื่อรับที่อยู่และเนื้อหาที่เกี่ยวข้องทั้งหมด ผู้ใช้สามารถค้นหาที่อยู่เว็บที่เกี่ยวข้องทั้งหมดผ่านคำหลัก
ฟังก์ชั่นเฉพาะ
(1) ผู้ใช้สามารถระบุเนื้อหาของหน้าเว็บที่สอดคล้องกับ URL
(2) แยกวิเคราะห์เนื้อหาของหน้าเว็บและรับที่อยู่ลิงก์ URL ทั้งหมด
(3) ผู้ใช้สามารถตั้งค่าความลึกการรวบรวมข้อมูลซึ่งหมายความว่าการเริ่มต้นจากหน้าเว็บที่สอดคล้องกับ URL เริ่มต้น URL ในหน้าเว็บที่สอดคล้องกับ URL ทั้งหมดสามารถคลานและอื่น ๆ ยิ่งความลึกมากเท่าไหร่เว็บไซต์ที่คุณสามารถคลานก็ยิ่งมากขึ้นเท่านั้น
(4) บันทึกและจัดทำดัชนีเนื้อหา URL ที่รวบรวมข้อมูล เนื้อหาที่จัดทำดัชนีคือที่อยู่ URL เองและชื่อหน้าเว็บที่สอดคล้องกับ URL
(5) ผู้ใช้สามารถค้นหา URL ผ่านคำหลักเพื่อค้นหา URL ด้วยคำหลัก
(6) กระบวนการสร้างดัชนีและดัชนีการค้นหาสามารถระบุคำหลักของจีนได้อย่างชาญฉลาดและดำเนินการแบ่งส่วนคำในคำหลัก
(7) ผู้ใช้สามารถระบุที่อยู่เพื่อบันทึกดัชนี URL เริ่มต้นความลึกการรวบรวมข้อมูลคำหลักในการค้นหาและการจับคู่สูงสุด
เฟรมเวิร์กโอเพ่นซอร์ส
รหัสต้นฉบับ
ส่วนตัวรวบรวมข้อมูล: Spider.java
Package WebCrawler.Spider; นำเข้า java.io.ioException; นำเข้า java.util.arrayList; นำเข้า java.util.hashset; นำเข้า java.util.scanner; นำเข้า org.jsoup.jsoup; นำเข้า org.jsoup.nodes.document; webCrawler.index.buildIndex;/** * @author lannooo */สไปเดอร์คลาสสาธารณะ {arraylist <String> urls; สตริงส่วนตัว starturl; Int Diglevel ส่วนตัว; / *** @param starturl url เริ่มต้นของตัวรวบรวมข้อมูล* @param diglevel การรวบรวมข้อมูลความลึก*/ public Spider (สตริง starturl, int diglevel) {this.starturl = startUrl; this.diglevel = diglevel; this.urls = arrayList ใหม่ <> (); } / *** @param ระดับความลึกการรวบรวมข้อมูลปัจจุบันที่เหลืออยู่* @param arraylist ชุด url ที่ต้องคลานในรอบถัดไป* @return ชุด url ใหม่ที่รวบรวมไว้จากชุด url frame @throws ioexception* / arraylist ทั้งหมด = null; if (ระดับ> 0) {total = new ArrayList <> (); สำหรับ (String url: arraylist) { /*สำหรับแต่ละ URL ในแต่ละ arraylist, แยกวิเคราะห์เนื้อหาหน้าเว็บของมันก่อนและรับรายการ URL ทั้งหมดในนั้น* / สำหรับ (String แต่ละ: GetBarelinks (URL)) {Total.Add (แต่ละรายการ); }} /*ใช้คอนเทนเนอร์แฮชเซ็ตเพื่อลบรายการซ้ำทั้งหมด* / hashset <string> hashset = new hashset <> (ทั้งหมด); Total = new ArrayList <> (HashSet); } ผลตอบแทนทั้งหมด; } / ** * เริ่มต้นจาก starturl, รวบรวมข้อมูล URL ที่เกี่ยวข้องทั้งหมด * @throws ioexception * / โมฆะสาธารณะ getall () พ่น ioexception {arraylist <String> newUrls; ArrayList <String> currentUrls = new ArrayList <> (); /*เพิ่ม startUrl ลงในรายการของ CurrentUrls และเริ่มคลานจาก URL*/ currentUrls.add (startUrl); สำหรับ (int i = diglevel; i> 0; i-) { /** สำหรับแต่ละเลเยอร์คุณต้องได้รับชุด URL ที่ขยายออกโดย URL นี้* จากนั้นเพิ่ม URL ที่รวบรวมไว้ของชุดปัจจุบันไปยังชุด URL ทั้งหมด* ในที่สุดนิวอร์เข้าสู่รอบถัดไป) newUrls = getLevelUrls (i, currenturls); สำหรับ (สตริงแต่ละ: currentUrls) {urls.add (แต่ละ); } currentUrls = newUrls; } สำหรับ (สตริงแต่ละ: currentUrls) {urls.add (แต่ละ); } HashSet <String> hashSet = new hashset <> (urls); urls = arraylist ใหม่ <> (hashset); } / *** @param Path เส้นทางที่จะบันทึกดัชนี* @throws ioexception* / โมฆะสาธารณะ storeUrlSandInfo (เส้นทางสตริง) พ่น IOException {buildIndex build = ใหม่ buildIndex (เส้นทาง); /* รวบรวมข้อมูล URL ทั้งหมดใน URL ลงในชื่อหน้าเว็บจริง*/ สำหรับ (สตริงแต่ละ: urls) {String text = getLinkText (แต่ละรายการ); if (text! = null) {build.addfield ("url", แต่ละ); build.addfield ("ข้อความ", ข้อความ); /*ใส่รายการนี้ลงในดัชนี*/ build.pushindex (); }} build.close (); } / ** * @param url คุณต้องได้รับ URL ของชื่อเว็บเพจชื่อ * @return เนื้อหาชื่อเรื่อง * @throws ioexception * / สตริงสาธารณะ getLinktext (url สตริง) โยน ioexception {เอกสารเอกสาร = null; ลอง { /*เชื่อมต่อกับ jsoup ตั้งค่าการหมดเวลาเป็น 3 วินาที* / document = jsoup.connect (url) .timeout (3000) .get (); } catch (exception e) {system.out.println ("[หมดเวลา] รับชื่อ URL:"+url); คืนค่า null; } string title = document.title (); ชื่อกลับ; } / ** * URL url @param สำหรับการแยกเนื้อหา * @return ส่งคืนรายการ URL ทั้งหมดในหน้าเว็บเนื้อหาของ URL * @throws ioexception * / ArrayList สาธารณะ <String> getBarelinks เอกสารเอกสาร; ลอง {document = jsoup.connect (url) .timeout (2000) .get (); } catch (exception e) {return linkslist; } /*รับแท็กทั้งหมด <a> พร้อมแอตทริบิวต์ href ของแท็ก <body> tag* / องค์ประกอบลิงก์ = document.select ("body") เลือก ("A [href]"); สำหรับ (ลิงก์องค์ประกอบ: ลิงก์) { / *แยก URL ออกจากแต่ละแท็ก <a> แท็กและลบจุดยึด * / string href = link.attr ("abs: href"). replaceall ("#", ""); /*เพิ่ม URL ด้วยอักขระ zju.edu.cn ให้ลบ '/'*/if (href.contains ("zju.edu.cn")) {ถ้า (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; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {เครื่องสแกนเนอร์ใน = สแกนเนอร์ใหม่ (System.in); System.out.println ("ป้อน URL:"); string url = in.nextline (). trim (); ในขณะที่ (! url.startswith ("http: //")) {system.out.println ("http: // เป็นสิ่งจำเป็น!"); System.out.println ("ป้อน URL:"); url = in.nextline (). trim (); } system.out.println ("ป้อนความลึกเพื่อขุด URL เพิ่มเติม [<= 3 แนะนำ]:"); ความลึก int = in.nextint (); Spider Spider = New Spider (URL, ความลึก); System.out.println ("ป้อนพา ธ ที่คุณต้องการบันทึก [default = d:/index-spider]:"); String path = in.nextline (). trim (); if (path.length () == 0) {path = "d:/index-spider"; } ลอง {system.out.println ("เริ่มดึงข้อมูล ... "); Spider.getall (); System.out.println ("URL ประสบความสำเร็จ!"); Spider.storeurlsandinfo (เส้นทาง); System.out.println ("ความสำเร็จที่เก็บไว้!"); } catch (ioexception e) {e.printstacktrace (); -buildindex.java
Package WebCrawler.index; นำเข้า Java.io.*; นำเข้า org.apache.lucene.analysis.analyzer; นำเข้า org.apache.lucene.document.document; นำเข้า org.apache.lucene.document.field; org.apache.lucene.index.indexwriterconfig; นำเข้า org.apache.lucene.store.directory; นำเข้า org.apache.lucene.store.fsdirectory; นำเข้า org.apache.lucene.util.version; คลาส BuildIndex {ไฟล์ไฟล์ส่วนตัว; ไดเรกทอรีไดเรกทอรีส่วนตัว นักเขียนดัชนีดัชนีส่วนตัว IndexwriterConfig ส่วนตัว เครื่องวิเคราะห์ส่วนตัว เอกสารเอกสารส่วนตัว / *** @param พา ธ การทำดัชนีพา ธ*/ public buildIndex (เส้นทางสตริง) {ลอง {file = ไฟล์ใหม่ (พา ธ ); ไดเรกทอรี = fsdirectory.open (ไฟล์); เอกสาร = เอกสารใหม่ (); analyzer = new ikanalyzer (); /*คลาสเครื่องมือการแบ่งส่วนคำภาษาจีน*/ config = new IndexWriterConfig (เวอร์ชัน Lucene_4_10_0, Analyzer); IndexWriter = New IndexWriter (ไดเรกทอรี, config); } catch (exception e) {e.printstacktrace (); }} / *** @param fieldName ชื่อของรายการใหม่ที่เพิ่มลงในเอกสาร* @param fieldtext เนื้อหาของรายการใหม่* / โมฆะสาธารณะ addfield (สตริงฟิลด์ชื่อ, สตริงฟิลด์เท็กซ์) {ลอง {ฟิลด์ฟิลด์ = ฟิลด์ใหม่ document.add (ฟิลด์); } catch (exception e) {e.printstacktrace (); }} / *** เพิ่มเอกสารลงในดัชนี* / โมฆะสาธารณะ pushindex () {ลอง {indexwriter.adddocument (เอกสาร); เอกสาร = เอกสารใหม่ (); } catch (exception e) {e.printstacktrace (); }} / *** เพิ่มเอกสารที่สมบูรณ์และบันทึกลงในดัชนี* @param url URL ที่เพิ่มลงใน URL* @param URL ข้อความที่สอดคล้องกัน* / โมฆะสาธารณะ AddoneIndex (url สตริง, ข้อความสตริง) {this.addfield ("url", url); this.addfield ("ข้อความ", ข้อความ); this.pushindex (); } / *** ปิดดัชนีการเขียน* / public void close () {ลอง {indexwriter.close (); } catch (exception e) {e.printstacktrace (); -ดัชนีค้นหา
แพ็คเกจ webcrawler.index; นำเข้า java.io.file; นำเข้า java.util.scanner นำเข้า org.apache.lucene.analysis.analyzer; นำเข้า org.apache.lucene.document.document; นำเข้า org.apache.lucene.index.directoryreader; org.apache.lucene.QueryParser.classic.QueryParser; นำเข้า org.apache.lucene.search.indexsearcher; นำเข้า org.apache.lucene.search.search.Search; นำเข้า org.apache.lucene.Search.scoredoc; นำเข้า org.apache.lucene.search. org.apache.lucene.store.fsdirectory; นำเข้า org.wltea.analyzer.lucene.ikanalyzer;/** * @author lannooo * */คลาสสาธารณะ searchindex {ดัชนีส่วนตัว เครื่องวิเคราะห์ส่วนตัว Private QueryParser Parser; แบบสอบถามแบบสอบถามส่วนตัว เพลงฮิตส่วนตัว ผู้อ่านไดเรกทอรีส่วนตัว / *** @param พา ธ พา ธ สำหรับการค้นหาดัชนี*/ public searchIndex (เส้นทางสตริง) {ลอง {reader = directoryReader.open (fsdirectory.open (ไฟล์ใหม่ (พา ธ ))); indexSearcher = new IndexSearcher (reader); analyzer = new ikanalyzer (); } catch (exception e) {e.printstacktrace (); }} / *** @param fieldName ชื่อโดเมนของการค้นหา* @param text เนื้อหาของการค้นหา* @param matchNumber จำนวนสูงสุดของการจับคู่* @กลับมาจำนวนการจับคู่สูงสุดที่พบ* / การค้นหา int สาธารณะ แบบสอบถาม = parser.parse (ข้อความ); hits = indexSearcher.search (Query, MatchNumber); กลับมา hits.totalhits; } catch (exception e) {e.printstacktrace (); } return -1; } / *** พิมพ์การจับคู่ทั้งหมด* / โมฆะสาธารณะ printhits () {ลอง {system.out.println ("หมายเลขฮิตทั้งหมด:"+hit.totalhits); สำหรับ (Soldoc Doc: hits.scoredocs) {เอกสารเอกสาร = indexSearcher.doc (doc.doc); System.out.println (document.get ("url")); System.out.println (document.get ("text")); } reader.close (); } catch (exception e) {e.printstacktrace (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) { /*คำหลักอินพุต* / สแกนเนอร์ใน = สแกนเนอร์ใหม่ (System.in); System.out.println ("ป้อนเส้นทางของดัชนี:"); String path = in.nextline (). trim (); ในขณะที่ (path.length () == 0) {system.out.println ("ป้อนเส้นทางของดัชนี:"); path = in.nextline (). trim (); } system.out.println ("ป้อนหมายเลข Hit สูงสุด:"); int max = in.nextint (); ในขณะที่ (สูงสุด <0) {system.out.println ("ป้อนหมายเลข Hit สูงสุด:"); max = in.nextint (); } in.nextline (); System.out.print ("Search>>>"); String text = in.nextline (). trim (); /* วนซ้ำไปยังคำหลักของผู้ใช้ถ้าเป็น Q มันจะออกและความยาวคือ 0 ยังถูกออก*/ ในขณะที่ (! text.equals ("q")) {ถ้า (text.length ()> 0) {searchindex search = searchIndex ใหม่ (เส้นทาง); int hits = search.search ("ข้อความ", ข้อความ, สูงสุด); if (hits! =-1) {search.printhits (); }} System.out.print ("Search >>>"); text = in.nextline (). trim (); -อินเตอร์เฟส UI (เพื่อความสะดวกมันเป็นเพียงรูปแบบบรรทัดคำสั่งคุณสามารถเขียนอินเทอร์เฟซ GUI ตามความต้องการของคุณ)
แพ็คเกจ webcrawler.ui; นำเข้า java.util.scanner; นำเข้า webcrawler.index.searchindex;/***@author lannooo**/คลาสสาธารณะ UI {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {/*คำสำคัญอินพุต*/เครื่องสแกนเนอร์ใหม่ System.out.print ("Search>>>"); String text = in.nextline (). trim (); /*สำหรับคำหลักของผู้ใช้ถ้าเป็น Q มันจะออกและความยาวคือ 0 จะออกจาก*/ในขณะที่ (! text.equals ("q") && text.length ()> 0) {searchIndex search = ใหม่ searchIndex ("d:/index-spider2"); int hits = search.search ("ข้อความ", ข้อความ, 20); if (hits! =-1) {search.printhits (); } system.out.print ("ค้นหา >>>"); text = in.nextline (). trim (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น