introduction
Appliquez la bibliothèque open source de Java pour écrire un moteur de recherche qui peut explorer le contenu d'un site Web. Et ramper profondément en fonction du contenu de la page Web pour obtenir toutes les adresses et contenu de la page Web pertinents. Les utilisateurs peuvent rechercher toutes les adresses Web pertinentes via des mots clés.
Fonctions spécifiques
(1) L'utilisateur peut spécifier le contenu de la page Web correspondant à une URL.
(2) analyse le contenu de la page Web et obtient toutes les adresses de lien d'URL.
(3) L'utilisateur peut définir la profondeur rampante, ce qui signifie qu'à partir de la page correspondant à l'URL initiale, les URL de la page Web correspondant à toutes les URL peuvent être rampantes, etc. Plus la profondeur est grande, plus vous pouvez ramper de sites Web.
(4) Enregistrer et indexer le contenu URL rampé. Le contenu indexé est l'adresse URL elle-même et le titre de la page Web correspondant à l'URL.
(5) Les utilisateurs peuvent rechercher l'URL via des mots clés pour trouver l'URL avec le mot-clé.
(6) Le processus d'établissement d'index et d'index de recherche peut identifier intelligemment les mots clés chinois et effectuer des opérations de segmentation des mots sur les mots clés.
(7) L'utilisateur peut spécifier l'adresse pour enregistrer l'index, l'URL initiale, la profondeur de chapelure, les mots clés à rechercher et la correspondance maximale.
Cadre open source
Code source
Crawler Part: Spider.java
package webcrawler.spider; importer java.io.ioexception; import java.util.arraylist; import java.util.hashset; import java.util.scanner; import org.jsoup.jsoup.Nodes.element; import org.Document; importer org.jsoup.Nodes.element; import org.jsoups.Soulect.Elements; Importation; Importation; webcrawler.index.buildIndex; / ** * @author lannooo * / classe publique Spider {ArrayList <string> urls; String starTurl privé; Int privé Diglevel; / ** * @param startUrl L'URL de démarrage du Crawler * @param diglevel crawl de profondeur * / public spider (String startUrl, int diglevel) {this.starturl = startUrl; this.diglevel = diglevel; this.urls = new ArrayList <> (); } / ** * @param Niveau La profondeur de crawl actuelle restant * @param arrayList L'ensemble d'URL qui doit être rampé dans le tour suivant * @return Le nouveau jeu d'URL a rampé à partir d'un ensemble URL de trame unique * @throws ioException * / Public ArrayList <String if (niveau> 0) {total = new ArrayList <> (); pour (URL de chaîne: arrayList) {/ * Pour chaque URL dans chaque arrayList, analysez d'abord sa page Web de contenu et obtenez toutes les entrées d'URL dedans * / for (String e chaque: getBareLinks (url)) {total.add (chacun); }} / * Utilisez le conteneur HashSet pour supprimer des doublons dans total * / hashset <string> hashSet = new HashSet <> (total); total = new ArrayList <> (hashset); } return total; } / ** * Commencez à partir de startUrl, craignez toutes les URL pertinentes * @throws ioException * / public void getall () lève ioException {ArrayList <string> newUrls; ArrayList <string> currentUrls = new ArrayList <> (); / * Ajouter StartUrl dans la liste des courants et commencer à ramper à partir de cette URL * / currentUrls.add (startUrl); pour (int i = diglevel; i> 0; i -) {/ * * Pour chaque calque, vous devez obtenir le jeu URL étendu par cette URL * puis ajouter les URL rampantes de l'ensemble actuel sur l'ensemble URL total * Enfin, les NewUrls entrent dans le prochain tour de boucle en tant que nouvel ensemble qui doit être profondément Crawled * / System.out.println ("Dig in Divel:" + 1); newUrls = getleveLUrls (i, currentUrls); for (String e chaque: currentUrls) {url.add (chacun); } currentUrls = newUrls; } pour (chaîne chacun: currentUrls) {urls.add (chacun); } Hashset <string> hashSet = new HashSet <> (URLS); Urls = new ArrayList <> (hashset); } / ** * @param chemin le chemin pour enregistrer l'index * @throws ioException * / public void storeurlsandinfo (String Path) lève ioException {BuildIndex build = new BuildIndex (path); / * Crawl toutes les URL dans les URL dans le titre de la page Web réel * / for (String chacun: urls) {String text = getLinkText (chacun); if (text! = null) {build.addfield ("url", chacun); build.addfield ("texte", texte); / * Mettez cette entrée dans l'index * / build.pushindex (); }} build.close (); } / ** * @param URL Vous devez obtenir l'URL du titre de la page Web * @return Title Content * @throws ioException * / public String getLinkText (string url) lève ioException {document document = null; essayez {/ * connecter avec jSoup, définissez le délai d'expiration sur 3 secondes * / document = jsoup.connect (url) .timeout (3000) .get (); } catch (exception e) {System.out.println ("[Timeout] Obtenez le titre d'URL:" + URL); retourner null; } String title = document.title (); Titre de retour; } / ** * @param URL URL pour l'analyse de contenu * @return renvoie la liste de toutes les URL de la page Web Contenu de l'URL * @throws ioException * / public ArrayList <string> getBareLlinks (String URL) lance ioException {ArrayList <string> linksList = new ArrayList <> (); Document de document; essayez {document = jsoup.connect (url) .timeout (2000) .get (); } catch (exception e) {return linksList; } / * Obtenez toutes les balises <a> avec les attributs HREF de la <body> Tag * / Elements Links = Document.Select ("Body"). SELECT ("A [href]"); for (élément lien: liens) {/ * Extraire l'URL de chaque balise <a> analysée et supprimez l'ancre * / string href = link.attr ("ABS: HREF"). RempaceALL ("#", ""); / * Ajoutez uniquement l'URL avec les caractères zju.edu.cn, supprimez les '/' * / if (href.contitains ("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); return arrayList; } public static void main (String [] args) {scanner dans = new Scanner (System.in); System.out.println ("Entrez URL:"); String url = in.NextLine (). Trim (); while (! url.startswith ("http: //")) {System.out.println ("http: // est nécessaire!"); System.out.println ("Entrez URL:"); url = in.NextLine (). Trim (); } System.out.println ("Entrez en profondeur pour creuser plus d'URL [<= 3 recommandé]:"); int defth = in.Nextint (); Spider Spider = New Spider (URL, profondeur); System.out.println ("Entrez le chemin d'accès que vous souhaitez enregistrer [default = d: / index-spider]:"); String path = in.NextLine (). Trim (); if (path.length () == 0) {path = "d: / index-spider"; } essayez {System.out.println ("Démarrer fetching ..."); spider.getall (); System.out.println ("URLS a réussi!"); spider.storeurlsandinfo (chemin); System.out.println ("Success Success!"); } catch (ioException e) {e.printStackTrace (); }}}Buildindex.java
package webcrawler.index; importer java.io. *; import org.apache.lucene.analysis.analyzer; import org.apache.lucene.document.document; import org.apache.lucène.Document.field; import org.apache.lucène.Document.Text; org.apache.lucene.index.indexwriteronfig; import org.apache.lucene.store.directory; import org.apache.lucene.store.fsdirectory; import org.apache.lucene.util.version; import org.wltea.analyzer.lucene.ikanalyzer; / ** * @aUrtorworwor; * / public class BuildIndex {fichier privé de fichier; répertoire privé; Index IndexWriter privé; Config indexWriterConfig privé; analyseur privé Analyseur; document de document privé; / ** * @Param Path Indexing Path * / public BuildIndex (String Path) {try {file = new File (path); répertoire = fsDirectory.open (fichier); document = nouveau document (); analyseur = nouveau ikanalyzer (); / * Classe d'outils de segmentation des mots chinois * / config = new IndexWriterConfig (version.lucene_4_10_0, analyseur); indexWriter = new INDEXWRIRT (répertoire, config); } catch (exception e) {e.printStackTrace (); }} / ** * @param fieldName Le nom du nouvel élément ajouté au document * @param fieldText le contenu du nouvel élément * / public void addField (String fieldName, String fieldText) {try {field field = new TextField (fieldNname, fieldText, field.store.yes); document.add (champ); } catch (exception e) {e.printStackTrace (); }} / ** * Ajouter un document à l'index * / public void pushIndex () {try {indexWriter.addDocument (document); document = nouveau document (); } catch (exception e) {e.printStackTrace (); }} / ** * Ajoutez un document complet et enregistrez-le à l'index * @param URL L'URL ajouté à l'URL * @param texte URL Text * / public void addoneIndex (URL de chaîne, texte de chaîne) {this.addfield ("url", url); this.addfield ("texte", texte); this.pushindex (); } / ** * Close Index Writing * / public void close () {try {indexWriter.close (); } catch (exception e) {e.printStackTrace (); }}}Recherche d'index
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.directoryreader; importation; 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.lucece.search.topdocs; importer; org.apache.lucene.store.fsdirectory; import org.wltea.analyzer.lucene.ikanalyzer; / ** * @author lannooo * * / public class SearchIndex {private indexSearcher indexSearcher; analyseur privé Analyseur; Private QueryParser Parser; requête de requête privée; Topdocs privés Hits; lecteur privé DirectoryReader; / ** * @param chemin le chemin du chemin pour la recherche d'index * / public searchIndex (String Path) {try {reader = DirectoryReader.Open (fsDirectory.open (nouveau fichier (path))); indexSearcher = new indexSearcher (lecteur); analyseur = nouveau ikanalyzer (); } catch (exception e) {e.printStackTrace (); }} / ** * @param fieldName Le nom de domaine de la recherche * @param texte le contenu de la recherche * @param matchNumber le nombre maximum de correspondances * @return le nombre maximum de correspondances trouvées * / public int search (String fieldNname, Text, nom de jeu, analyser); query = parser.parse (texte); Hits = indexSearcher.Search (Query, MatchNumber); Retour Hits.Totalhits; } catch (exception e) {e.printStackTrace (); } return -1; } / ** * Imprimez toutes les correspondances * / public void printHits () {try {System.out.println ("Numéro total de Hits:" + Hits.TotalHits); for (scoreOC doc: hits.scoredocs) {document document = indexSearcher.doc (doc.doc); System.out.println (document.get ("URL")); System.out.println (document.get ("texte")); } reader.close (); } catch (exception e) {e.printStackTrace (); }} public static void main (String [] args) {/ * mot-clé d'entrée * / scanner dans = new Scanner (System.in); System.out.println ("Entrez le chemin d'accès à l'index:"); String path = in.NextLine (). Trim (); while (path.length () == 0) {System.out.println ("Entrer le chemin de l'index:"); path = in.NextLine (). Trim (); } System.out.println ("Entrez le numéro Hit MAX:"); int max = in.nextint (); while (max <0) {System.out.println ("Entrez le numéro de hit max:"); max = in.Nextint (); } dans.NextLine (); System.out.print ("Search >>>"); String text = in.NextLine (). Trim (); / * En boucle dans le mot-clé de l'utilisateur, s'il est Q, il sort, et la longueur est 0 est également sortie * / while (! Text.equals ("q")) {if (text.length ()> 0) {searchIndex search = new SearchIndex (path); int hits = search.search ("texte", texte, max); if (hits! = - 1) {search.printHits (); }} System.out.print ("Search >>>"); text = in.NextLine (). Trim (); }}}Interface d'interface utilisateur (pour plus de commodité, c'est juste un format de ligne de commande, vous pouvez écrire une interface GUI en fonction de vos besoins)
package webcrawler.ui; importer java.util.scanner; importer webcrawler.index.searchindex; / ** * @author lannooo * * / public class ui {public static void main (String [] args) {/ * entrée les mots clés * / scanner dans = new Scanner (System.in); System.out.print ("Search >>>"); String text = in.NextLine (). Trim (); / * Pour les mots clés de l'utilisateur, s'il est Q, il sortira et la longueur est 0 quittera * / while (! Text.equals ("q") && text.length ()> 0) {searchIndex search = new searchIndex ("d: / index-spider2"); int hits = search.search ("texte", texte, 20); if (hits! = - 1) {search.printHits (); } System.out.print ("Search >>>"); text = in.NextLine (). Trim (); }}}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.