введение
Примените библиотеку с открытым исходным кодом Java, чтобы написать поисковую систему, которая может ползать по содержанию веб -сайта. И глубоко ползает на основе содержания веб -страницы для получения всех соответствующих адресов и контента веб -страницы. Пользователи могут искать все соответствующие веб -адреса по ключевым словам.
Конкретные функции
(1) Пользователь может указать содержимое веб -страницы, соответствующего URL.
(2) Подбирает содержание веб -страницы и получает все адреса ссылок URL.
(3) Пользователь может установить глубину ползания, что означает, что, начиная со страницы, соответствующей первоначальному URL, URL -адреса на веб -странице, соответствующие всем URL -адресам, могут быть заполнены и так далее. Чем больше глубина, тем больше веб -сайтов вы можете ползти.
(4) Сохраните и индексируйте контент с ползами. Индексированный контент - это сам адрес URL -адреса и заголовок веб -страницы, соответствующее URL.
(5) Пользователи могут искать URL -адрес с помощью ключевых слов, чтобы найти URL с ключевым словом.
(6) Процесс установления индексов и индексов поиска может разумно идентифицировать китайские ключевые слова и выполнять операции сегментации слов на ключевых словах.
(7) Пользователь может указать адрес для сохранения индекса, начального URL, глубины ползания, ключевых слов для поиска и максимального соответствия.
Рамки с открытым исходным кодом
Исходный код
Часть гусеницы: Spider.java
Package webcrawler.spider; импорт java.io.ioexception; import java.util.arraylist; import java.util.hashset; import java.util.scanner; импорт org.jsoup.jsoup; импорт org.jsoup.nodes.document; импорт org.jsoup.nodes. webcrawler.index.buildindex;/** * @author lannooo */public class spider {arraylist <string> urls; частная строка starturl; частный int diglevel; / *** @param starturl the url начала гусеницы* @param divlevel глубина*/ public spider (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 = new ArrayList <> (); Для (string url: arraylist) { /*Для каждого URL -адреса в каждом ArrayList сначала проанализируйте содержимое его веб -страницы и получите все записи URL в нем* / for (String early: getbarelinks (url)) {total.add (каждый); }} /*Используйте контейнер хэшсет для удаления дубликатов в общей сложности* / hashset <string> hashset = new Hashset <> (total); Total = new ArrayList <> (хэшсет); } return Total; } / ** * Start FromTurl, Crawl All All Actuls 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.out.out.out.Ut.Ut.Out.out.Ut.Out.UT.UT.UT.UT.UT.UT. newurls = getlevelurls (i, currenturls); для (строка каждый: currenturls) {urls.add (каждый); } currenturls = newurls; } для (строка каждого: currenturls) {urls.add (каждый); } Hashset <string> hashset = new Hashset <> (urls); Urls = new ArrayList <> (хэшсет); } / *** @param path Путь к сохранению индекса* @throws ioexception* / public void storeurlsandinfo (path) бросает ioexception {buildindex build = new Buildindex (path); /* Crawll Все URL -адреса в URL -адресах в фактическое название веб -страницы*/ for (String ever: urls) {string text = getLinktext (каждый); if (text! = null) {build.addfield ("url", каждый); build.addfield («текст», текст); /*Поместите эту запись в индекс*/ build.pushindex (); }} build.close (); } / ** * @param URL Вам нужно получить URL -адрес заголовка веб -страницы * @return Teal Content * @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] получить заголовок url:"+url); вернуть ноль; } String title = document.title (); вернуть заголовок; } / ** * @param URL URL для анализа контента * @return Возвращает список всех URL -адресов в контенте веб -страницы URL * @Throws IOException * / public arraylist <string> getBarelinks (string url) Throws ioException {arraylist <string> linkslist = new arraylist <> (); Документ документ; try {document = jsoup.connect (url) .timeout (2000) .get (); } catch (Exception e) {return Linkslist; } /*Получить все теги <a> с атрибутами href из тега <body>* / elements links = document.select ("body"). Select ("a [href]"); для (элемент ссылки: ссылки) { / *Извлечь URL из каждого проанализированного тега <a> и удалить якорь * / string href = link.attr ("abs: href"). ryplaceall ("#", ""); /*Только добавьте URL с символами zju.edu.cn, удалите '/'*/if (href.contains ("zju.edu.cn")) {if (href.endswith ("/")) {href = href.substring (0, href.length ()-); } linkslist.add (href); }} Hashset <string> hashset = new Hashset <> (linkslist); Arraylist <string> arraylist = new ArrayList <> (hashset); return Arraylist; } public static void main (string [] args) {сканер в = новый сканер (System.in); System.out.println («Введите url:»); String url = in.nextline (). Trim (); while (! url.startswith ("http: //")) {System.out.println ("http: // необходимо!"); System.out.println («Введите url:»); url = in.nextline (). trim (); } System.out.println ("Введите глубину, чтобы выкопать больше URL -адресов [<= 3 рекомендуется]:"); int debin = in.nextint (); Spider Spider = новый паук (URL, глубина); System.out.println («Введите путь, который вы хотите сохранить [default = d:/index-spide]:»); String path = in.nextline (). Trim (); if (path.length () == 0) {path = "d:/index-spider"; } try {System.out.println ("Start Fetching ..."); spider.getall (); System.out.println («URLS добился успеха!»); spider.storeurlsandinfo (path); System.out.println («Хранившийся успех!»); } catch (ioException e) {e.printstackTrace (); }}}BUILDINDEX.Java
пакет webcrawler.index; импорт java.io.*; import org.apache.lucene.analysis.analyzer; import org.apache.lucene.document.document; импорт org.apache.lucene.document.field; imporg.Apache.lucene.document.TextField; orgement.Apache.Lucenex. org.apache.lucene.index.indexwriterconfig; import org.apache.lucene.store.directory; import org.apache.lucene.store.fsdirectory; импорт org.apache.lucene.util.version; импорт org.wltea.analyzer.lucene.ikanalyzer Buildindex {private file файл; Справочник частного каталога; частное индексное индексное авторитет; Private IndexWriterConfig Config; Частный анализатор анализатора; частный документ документ; / *** @param path Pathing 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, анализатор); indexwriter = new IndexWriter (Directory, 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 (); }} / *** Добавить документ в индекс* / public void pushindex () {try {indexwriter.adddocument (document); document = new Document (); } catch (Exception e) {e.printstackTrace (); }} / *** Добавить полный документ и сохранить его в индекс* @param URL URL, добавленный в URL* @param Text URL -адрес, соответствующий текст* / public void AddoneIndex (строка URL, строка текст) {this.addfield ("url", url); this.addfield ("текст", текст); this.pushindex (); } / *** Закрыть указание индекса* / public void close () {try {indexwriter.close (); } catch (Exception e) {e.printstackTrace (); }}}Индекс поиска
Package webcrawler.index; импорт java.io.file; import java.util.scanner; импорт org.apache.lucene.analysis.analyzer; импорт org.apache.lucene.document.document; import org.apache.lucene.index.directoryReader; import.AmporeParse. 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; Частный запрос запроса; Частные хиты Topdocs; Читатель частного каталога; / *** @param path Путь для индексного поиска*/ public searchindex (path) {try {reader = directoryReader.open (fsdirectory.open (new File (path))); indexSearcher = new IndexSearcher (Reader); Analyzer = new Ikanalyzer (); } catch (Exception e) {e.printstackTrace (); }} / *** @param fieldname Имя доменного имени поиска* @param Текст. Содержание поиска* @param совместно с максимальным количеством совпадений* @return Максимум найденных совпадений* / public int search (String Fieldname, String Text, int matchnumber) {try {parser = new Queryparser (FieldName, Analyzer); Query = parser.parse (текст); hits = indexsearch.search (Query, matchnumber); return hits.totalhits; } catch (Exception e) {e.printstackTrace (); } return -1; } / **. для (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) { /*Ввод ключевой слов* / сканер в = новый сканер (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 (); }}}Интерфейс пользовательского интерфейса (для удобства это просто формат командной строки, вы можете написать интерфейс графического интерфейса в соответствии с вашими потребностями)
пакет 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, 0 уйдет*/while (! Text.equals ("q") && text.length ()> 0) {searchIndex search = new SearchIndex ("d:/index-spidem2"); int hits = search.search ("text", text, 20); if (Hits! =-1) {search.printhits (); } System.out.print ("search >>>"); text = in.nextline (). trim (); }}}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.