مقدمة
قم بتطبيق مكتبة Java Open Source لكتابة محرك بحث يمكن أن يزحف محتوى موقع الويب. والزحف بعمق بناءً على محتوى صفحة الويب للحصول على جميع عناوين صفحة الويب والمحتوى ذات الصلة. يمكن للمستخدمين البحث عن جميع عناوين الويب ذات الصلة من خلال الكلمات الرئيسية.
وظائف محددة
(1) يمكن للمستخدم تحديد محتوى صفحة الويب المقابلة لعنوان URL.
(2) تحليل محتوى صفحة الويب ويحصل على جميع عناوين رابط URL.
(3) يمكن للمستخدم تعيين عمق الزحف ، مما يعني أنه يمكن أن يزحف بدءًا من الصفحة المقابلة لعنوان URL الأولي ، وعنوان URL في صفحة الويب المقابلة لجميع عناوين URL ، وما إلى ذلك. كلما زاد العمق ، زاد عدد المواقع التي يمكنك الزحف فيها.
(4) حفظ وفهرسة محتوى عنوان URL المزروع. المحتوى المفهرس هو عنوان URL نفسه وعنوان صفحة الويب المقابلة لعنوان URL.
(5) يمكن للمستخدمين البحث عن عنوان URL من خلال الكلمات الرئيسية للعثور على عنوان URL مع الكلمة الرئيسية.
(6) يمكن أن تحدد عملية إنشاء الفهارس وفهارس البحث بذكاء الكلمات الرئيسية الصينية وإجراء عمليات تجزئة الكلمات على الكلمات الرئيسية.
(7) يمكن للمستخدم تحديد العنوان لحفظ الفهرس ، وعنوان URL الأولي ، وعمق الزحف ، والكلمات الرئيسية للبحث ، والحد الأقصى للمطابقة.
إطار مفتوح المصدر
رمز المصدر
الجزء الزاحف: Spider.java
حزمة webcrawler.spider ؛ استيراد java.io.ioException ؛ استيراد java.util.arraylist ؛ استيراد java.util.hashset ؛ استيراد java.util.scanner ؛ استيراد org.jsoup.jsoup ؛ استيراد org.jsoup.nodes.document ؛ استيراد org.jsoup.enodes.element ؛ WebCrawler.index.buildIndex ؛/** * Author lannooo */public class Spider {ArrayList <string> urls ؛ سلسلة خاصة Starturl ؛ خاص int diglevel ؛ / *** param starturl url url url artl* param diglevel عمق*/ Spirit spider (String starturl ، int diglevel) {this.starturl = starturl ؛ this.diglevel = diglevel ؛ this.urls = new ArrayList <> () ؛ } / *** param مستوى عمق الزحف الحالي المتبقي* param arraylist مجموعة عنوان URL التي يجب أن يزحف في الجولة التالية* @RETURN مجموعة عنوان URL الجديد تم الزحف من مجموعة عنوان URL أحادية الإطارات* thatsfection* / arraylist public <string> getLevelurls (int leveld <SrayList <arraylist) if (level> 0) {total = new ArrayList <> () ؛ لـ (url url: arraylist) { /*لكل عنوان URL في كل قائمة ArrayList ، قم أولاً بتحليل محتوى صفحة الويب الخاصة به واحصل على جميع إدخالات url فيه* / for (سلسلة كل: getBarelinks (url)) {total.add (كل) ؛ }} /*استخدم حاوية hashset لحذف التكرارات في المجموع* / hashset <string> hashset = new hashset <> (Total) ؛ TOTAL = ArrayList جديد <> (HASHSET) ؛ } إجمالي الإرجاع ؛ } / ** * ابدأ من starturl ، قم بالزحف لجميع عناوين URL ذات الصلة * throws ioException * / public void 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 في الجولة التالية من الحلقة باعتبارها مجموعة جديدة تحتاج إلى أن تكون مزدحمة بعمق* / system.outln ( newurls = getLevelurls (i ، currenturls) ؛ لـ (سلسلة لكل: currenturls) {urls.add (كل) ؛ } currenturls = newurls ؛ } لـ (سلسلة لكل: currenturls) {urls.add (كل) ؛ } hashset <string> hashset = new hashset <> (urls) ؛ urls = new ArrayList <> (hashset) ؛ } / *** param path المسار لحفظ الفهرس* throws ioException* / public void StoreUrlsandInfo (مسار السلسلة) يلقي iOexception {buildIndex build = new BuildIndex (path) ؛ /* الزحف على جميع عناوين URL في عناوين URL في عنوان صفحة الويب الفعلي*/ لـ (سلسلة كل: urls) {String text = getLinkText (كل) ؛ if (text! = null) {build.addfield ("url" ، كل) ؛ build.addfield ("text" ، text) ؛ /*ضع هذا الإدخال في الفهرس*/ build.pushIndex () ؛ }} build.close () ؛ } / ** * url param تحتاج إلى الحصول على عنوان URL لعنوان صفحة الويب * محتوى عنوان RETURN * throws ioException * / public string getLinkText (url url) يلقي ioException {document = null ؛ جرب { /*تواصل مع jsoup ، قم بتعيين المهلة على 3 ثوان* / وثيقة = jsoup.connect (url) .timeout (3000) .get () ؛ } catch (استثناء e) {system.out.println ("[timeout] الحصول على عنوان عنوان url:"+url) ؛ العودة لاغية. } عنوان السلسلة = document.title () ؛ عنوان العودة ؛ } / ** * url url url param لحلية المحتوى * RETURN إرجاع قائمة جميع عناوين URL في محتوى صفحة الويب الخاصة بعنوان url * throws ioException * / ArrayList public <string> getBarelinks (url url) يلقي ioException {ArrayList <string> linkslist = new arraylist <> () ؛ وثيقة الوثيقة ؛ حاول {document = jsoup.connect (url) .timeout (2000) .get () ؛ } catch (استثناء e) {return LinkSlist ؛ } /*احصل على جميع العلامات <a> مع سمات HREF الخاصة بعلامة <Body> / Elements Links = document.select ("body"). حدد ("A [HREF]") ؛ لـ (ارتباط العنصر: الروابط) { / *استخراج عنوان URL من كل علامة <a> وأزل المرساة * / string href = link.attr ("abs: href"). replaceall ("#" ، "") ؛ /*فقط إضافة عنوان url مع أحرف zju.edu.cn ، قم بإزالة '/'*/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 ؛ } public static void main (string [] args) {scanner in = new scanner (system.in) ؛ System.out.println ("Enter URL:") ؛ سلسلة url = in.nextLine (). trim () ؛ بينما (! url.startswith ("http: //")) {system.out.println ("http: // مطلوب!") ؛ System.out.println ("Enter URL:") ؛ url = in.nextLine (). trim () ؛ } system.out.println ("أدخل العمق لحفر المزيد من عناوين URL [<= 3 الموصى بها]:") ؛ int depth = in.nextint () ؛ Spider Spider = عنكبوت جديد (URL ، العمق) ؛ system.out.println ("أدخل المسار الذي تريد حفظه [default = d:/index-spider]:") ؛ مسار السلسلة = in.nextLine (). trim () ؛ if (path.length () == 0) {path = "d:/index-spider" ؛ } حاول {system.out.println ("ابدأ جلب ...") ؛ spider.getall () ؛ System.out.println ("urls حصلت على النجاح!") ؛ Spider.StoreUrlsandInfo (path) ؛ System.out.println ("النجاح المخزن!") ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}BuildIndex.java
package webcrawler.index ؛ استيراد java.io. org.apache.lucene.index.indexwriterconfig ؛ استيراد org.apache.lucene.store.directory ؛ استيراد org.apache.lucene.store.fsdirectory BuildIndex {private file ؛ دليل الدليل الخاص ؛ IndexWriter Private IndexWriter ؛ IndexTwriterConfig Config ؛ محلل المحلل الخاص ؛ وثيقة الوثيقة الخاصة ؛ / *** param path path path*/ public BuildIndex (string path) {try {file = new file (path) ؛ دليل = fsdirectory.open (ملف) ؛ وثيقة = مستند جديد () ؛ Analyzer = new ikanalyzer () ؛ /*فئة أداة تجزئة الكلمات الصينية*/ config = indexwriterconfig الجديد (الإصدار. indexWriter = new IndexWriter (دليل ، config) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} / *** param fieldname اسم العنصر الجديد الذي تمت إضافته إلى المستند* param fieldText محتوى العنصر الجديد* / public void addield (string fieldname ، string fieldText) {try {field field = new textfield (fieldname ، fieldtext ، field.store.yes) ؛ document.add (Field) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} / *** إضافة مستند إلى الفهرس* / public void pushIndex () {try {indexWriter.addDocument (document) ؛ وثيقة = مستند جديد () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} / *** أضف مستندًا كاملًا وحفظه إلى INDEX* @param عنوان URL الذي تمت إضافته إلى عنوان URL* @param text text المقابل* / public void addoneIndex (url url string ، string text) {this.addfield ("url" ، url) ؛ this.addfield ("text" ، text) ؛ this.pushIndex () ؛ } / *** أغلق كتابة الفهرس* / public void close () {try {indexWriter.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}فهرس البحث
package 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.directoryer ؛ استيراد ؛ org.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.search.topdocs ؛ org.apache.lucene.store.fsdirectory ؛ استيراد org.wltea.analyzer.lucene.ikanalyzer ؛/** * author lannooo * */public class searchIndex {private Indexsearcher IndexSearcher ؛ محلل المحلل الخاص ؛ QueryParser Parser ؛ استعلام الاستعلام الخاص Topdocs الخاصة يضرب. قارئ DirectoryReader الخاص ؛ / *** param path المسار للبحث الفهرس*/ public searchIndex (مسار السلسلة) {try {reader = directoryReader.open (fsdirectory.open (ملف جديد (مسار))) ؛ indexSearcher = New IndexSearcher (reader) ؛ Analyzer = new ikanalyzer () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} / *** param fieldName اسم المجال للبحث* @param محتوى البحث* param matchnumber الحد الأقصى لعدد المطابقات* @RETURN الحد الأقصى لعدد المطابقات الموجود* / public int search (string fieldname ، text string ، int matchnumber) {try {parser = new QueryParser (fieldname ، Analyser) ؛ الاستعلام = parser.parse (نص) ؛ HITS = indexSearcher.Search (Query ، MatchNumber) ؛ إرجاع ضربات. totalhits. } catch (استثناء e) {E.PrintStackTrace () ؛ } العودة -1 ؛ } / *** طباعة جميع المطابقات* / public void printhits () {try {system.out.println ("إجمالي عدد الزيارات:"+hits.totalhits) ؛ لـ (docorec doc: its.scoredocs) {document document = indexSearcher.doc (doc.doc) ؛ System.out.println (document.get ("url")) ؛ System.out.println (document.get ("text")) ؛ } reader.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} public static void main (string [] args) { /*inport inport word* / scanner in = new scanner (system.in) ؛ System.out.println ("أدخل مسار الفهرس:") ؛ مسار السلسلة = in.nextLine (). trim () ؛ بينما (path.length () == 0) {system.out.println ("أدخل مسار الفهرس:") ؛ path = in.nextline (). trim () ؛ } system.out.println ("أدخل رقم HIT:") ؛ int max = in.nextint () ؛ بينما (max <0) {system.out.println ("أدخل رقم HIT:") ؛ max = in.nextint () ؛ } in.nextLine () ؛ System.out.print ("Search >>>") ؛ نص سلسلة = in.nextLine (). trim () ؛ /* looping في الكلمة الرئيسية للمستخدم ، إذا كان Q ، فإنه يخرج ، ويتم الخروج من 0 أيضًا*/ بينما (! text.equals ("q")) {if (text.length ()> 0) {searchIndex search = new searchIndex (path) ؛ int its = search.search ("text" ، text ، max) ؛ if (يضرب! =-1) {search.printhits () ؛ }} system.out.print ("Search >>>") ؛ النص = in.nextLine (). trim () ؛ }}}واجهة واجهة المستخدم (للراحة ، إنها مجرد تنسيق سطر الأوامر ، يمكنك كتابة واجهة واجهة المستخدم الرسومية وفقًا لاحتياجاتك)
package webcrawler.ui ؛ استيراد java.util.scanner ؛ استيراد webcrawler.index.searchIndex ؛/***author lannooo**/class public ui {public static void main (string [] args) {/*input words*/scanner in = new scanner (system.in) ؛ System.out.print ("Search >>>") ؛ نص سلسلة = in.nextLine (). trim () ؛ /*بالنسبة للكلمات الرئيسية للمستخدم ، إذا كانت Q ، فسيتم خروجها ، وسيتم خروج الطول 0*/بينما (! text.equals ("q") int its = search.search ("text" ، text ، 20) ؛ if (يضرب! =-1) {search.printhits () ؛ } system.out.print ("Search >>>") ؛ النص = in.nextLine (). trim () ؛ }}}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.