J'ai déjà écrit de nombreux robots de Python à une page, et je pense que Python est toujours très utile. Ici, j'utilise Java pour résumer un chenilles de plusieurs pages, faire de manière itérative tous les liens de la page de semence et les sauver tous sous le chemin TMP.
1. Préface
La mise en œuvre de cet robot nécessite le support de deux structures de données, la file d'attente non visitée (PriorityQueue: peut calculer l'importance de l'URL) et le tableau visité (HashSet: peut rapidement découvrir si l'URL existe); La file d'attente est utilisée pour mettre en œuvre une rampe d'abord en largeur et une table visitée est utilisée pour enregistrer l'URL rampée, ne rampe plus à plusieurs reprises, en évitant les anneaux. Les boîtes à outils requises par Java Crawlers incluent HttpClient et HTMLParser1.5, et vous pouvez afficher le téléchargement de la version spécifique dans le Maven Repo.
1. Site Web Target: Sina http://www.sina.com.cn/
2. Capture d'écran des résultats:
Parlons de la mise en œuvre de Crawlers. Le code source sera téléchargé sur github plus tard. Les amis qui en ont besoin peuvent laisser un message:
2. Programmation du robot
1. Créez l'URL de la page de semence
MyCrawler Crawler = new MyCrawler ();
crawler.crawling (new String [] {"http://www.sina.com.cn/"});
2. Initialisez la table non visitée comme l'URL des graines ci-dessus
Linkqueue.addunvisitedUrl (graines [i]);
3. La partie d'implémentation logique la plus importante: éliminez l'URL qui n'a pas été visité dans la file d'attente, téléchargez-la, puis ajoutez la table visitée, analysez les autres URL sur la page URL modifiée et ajoutez la file d'attente non conduite à la file d'attente non visitée; Itérer jusqu'à ce que la file d'attente soit vide, donc ce réseau d'URL est encore très grand. Notez que le téléchargement de la page et la résolution de la page ici nécessitent l'implémentation de la boîte à outils Java, et l'utilisation de la boîte à outils est expliquée en détail ci-dessous.
while (! linkqueue.unVisitedUrlSempty () && linkqueue.getVisitedUrlnum () <= 1000) {// L'URL de l'en-tête sort de la file d'attente STRING VisiTUrl = (String) linkqueue.unVisitedUrldeeue (); if (VisitUrl == null) continue; DownloadFile DownloadFile Downloader = new DownloadFile (); // Téléchargez la page Web Downloader.DownloadFile (VisitUrl); // L'URL est placée dans l'URL visité LinkQueue.AddVisitedUrl (VisitUrl); // Extraire l'URL de la page Web de téléchargement Set <string> links = htmlparsertool.extracLinks (VisitUrl, filtre); // Nouvelle URL non visitée pour (lien de chaîne: liens) {linkqueue.addunvisitedUrl (lien); }}4. Télécharger la boîte à outils pour la page HTML suivante
Public String DownloadFile (URL de chaîne) {String filepath = null; / * 1. Générez l'objet httpclinet et définissez les paramètres * / httpClient httpClient = new httpclient (); // Définissez le délai de connexion HTTP pour 5S httpClient.gethttpConnectionManager (). GetParams (). SetConnectionTimeout (5000); / * 2. Générez l'objet GetMethod et définissez les paramètres * / getMethod getMethod = new GetMethod (URL); // Définissez le délai d'expiration de la demande pour 5s getMethod.getParams (). SetParameter (httpMethodParams.so_timeout, 5000); // SET DEMAND RETRY Traitement getMethod.getParams (). SetParameter (httpMethodParams.retry_handler, new defaulthTTPMethoDretryHandler ()); / * 3. Exécuter la demande de get http * / try {int statuscode = httpclient.execureMethod (getMethod); // Déterminez le code d'état d'accès if (statuscode! = httpstatus.sc_ok) {System.err.println ("Méthode a échoué:" + getMethod.getStatusline ()); filepath = null; } / * 4. Processus Http Response Contenu * / BYTE [] ResponseBody = getMethod.getResponseBody (); // Lire comme un tableau d'octet // Générez le nom de fichier lors de l'enregistrement en fonction de la page Web URL FilePath = "Temp //" + GetFilenameByurl (url, getMethod.getResponsener ("Contenu-Type"). GetValuue); SaveTolocal (réponse, Filepath); } catch (httpexception e) {// Une exception fatale s'est produite, ce qui peut être que le protocole est incorrect ou qu'il y a un problème avec le contenu renvoyé.out.println ("Veuillez vérifier votre adresse HTTP fournie!"); e.printStackTrace (); } catch (ioException e) {// Une exception de réseau s'est produite e.printStackTrace (); } Enfin {// Libérez la connexion getMethod.Releaseconnection (); } return filepath; }5. Html Page Analyse Toolkit:
public static set <string> extraclinks (URL de chaîne, filtre linkFilter) {set <string> links = new hashSet <string> (); try {analyser parser = new parser (url); parser.SetEncoding ("GB2312"); // Filtre le filtre de la balise <-frame> pour extraire le lien représenté par l'attribut SRC dans la balise de trame NodeFilter frameFilter = new nodeFilter () {public booléen accepte (node node) {if (node.getText (). StartSwith ("frame src =")) {return true; } else {return false; }}}}; // ORFILTER pour définir le filtrage <a> Tags et <trame> TAGS ORFILTER LinkFilter = new OrFilter (new NodeClassFilter (linktag.class), framefilter); // Obtenez toutes les balises filtrées nodelist list = parser.ExtractAllNodesthatMatch (linkFilter); for (int i = 0; i <list.size (); i ++) {node tag = list.elementat (i); if (tag instanceof linktag) // <a> tag {linktag link = (linktag) tag; String linkUrl = link.getLink (); // url if (filter.accept (linkUrl)) links.add (linkUrl); } else // <-frame> tag {// Extraire le lien vers l'attribut SRC dans le cadre, tel que <frame src = "test.html" /> String frame = tag.getText (); int start = frame.indexof ("src ="); frame = cadre.SubString (start); int end = frame.indexof (""); if (end == -1) end = frame.indexof (">"); String frameUrl = frame.substring (5, end - 1); if (filter.accept (frameurl)) links.add (frameurl); }}} catch (parserexception e) {e.printStackTrace (); } return liens; }6. La page non visitée est enregistrée à l'aide de PriorityQueue avec des files d'attente préférées, principalement pour s'appliquer aux algorithmes tels que PageRank. Certaines URL sont plus fidèles; Le tableau visité est mis en œuvre à l'aide de Hashset, faites attention à trouver rapidement s'il existe;
classe publique LinkQueue {// Collection d'URL consultée Set statique privé VisitedUrl = new HashSet (); // Collection d'URL accessible Private Static Fitre UnvisitedUrl = new priorityQueue (); // Obtenez la file d'attente URL file d'attente statique publique getUnSitedUrl () {return UnvisitedUrl; } // Ajouter à la file d'attente d'URL visitée publique statique addVisitedUrl (URL de chaîne) {visitedUrl.add (url); } // Supprimer URL accessible public static void demoveVisitedUrl (URL de chaîne) {visitedUrl.Remove (URL); } // Les URL non révisées sont hors de l'objet statique public de file d'attente UnvisitedUrlDequeue () {return unvisitedUrl.poll (); } // Assurez-vous que chaque URL n'est accessible qu'une fois public static void addUnvisItedUrl (URL de chaîne) {if (url! = Null &&! Url.trim (). Égal ("") &&! VisitedUrl.Contains (url) &&! UnvisitedUrl.contains (url)) UnvisiTurl.Add (url); } // Obtenez le nombre d'URL qui ont été accessibles publics static int getVisitedUrlnum () {return visitedUrl.size (); } // juger si la file d'attente d'URL non visitée est vide publique statique booléenne UnvisitedUrlSempty () {return UnvisitedUrl.iSempty (); }}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.