Aujourd'hui, apprenons le tutoriel sur le robot d'Alsotang et rampez simplement Cnode.
Créer un projet Craelr-Demo
Nous créons d'abord un projet express, puis supprimons tous les contenus des fichiers app.js, car nous n'avons pas besoin d'afficher le contenu du côté Web pour le moment. Bien sûr, nous pouvons également utiliser la fonction express dont nous avons besoin par npm install express directement dans un dossier vide.
Analyse du site Web cible
Comme le montre la figure, cela fait partie de la balise DIV sur la page d'accueil CNODE. Nous utilisons cette série d'ID et de classes pour localiser les informations dont nous avons besoin.
Utilisez SuperAgent pour obtenir des données source
SuperAgent est la bibliothèque HTTP utilisée par l'API AJAX. Il est utilisé de manière similaire à jQuery , à travers lequel nous initier une demande de GET, en sortiez le résultat dans la fonction de rappel.
La copie de code est la suivante:
var express = require ('express');
var url = require ('url'); // analyser l'URL de l'opération
var superagent = require ('superagent'); // N'oubliez pas l'installation de NPM
var cheeseio = require ('cheerio');
var eventProxy = require ('eventProxy');
var TargetUrl = 'https://cnodejs.org/';
SuperAgent.get (TargetUrl)
.end (fonction (err, res) {
console.log (res);
});
Son résultat RES est un objet contenant les informations d'URL cible, et le contenu du site Web est principalement dans son texte (chaîne).
Utilisez Cheatio pour analyser
Cheerio agit comme une fonction jQuery côté serveur. Nous utilisons d'abord son .load () pour charger HTML, puis filtrer les éléments via le sélecteur CSS.
La copie de code est la suivante:
var $ = cheeseio.load (res.text);
// Filtrez les données via le sélecteur CSS
$ ('# topic_list .topic_title'). Chaque (fonction (idx, élément) {
console.log (élément);
});
Le résultat est un objet, et la fonction .each(function(index, element)) est appelée à itérer à travers chaque objet, et les éléments HTML DOM sont renvoyés.
Le résultat de la sortie console.log($element.attr('title')); est广州2014年12月06日NodeParty 之UC 场
Pour des titres comme celui-ci, Output console.log($element.attr('href')); Le résultat est une URL Like /topic/545c395becbcb78265856eb2 . Utilisez ensuite la fonction URL.Resolve () de NodeJS1 pour compléter l'URL complète.
La copie de code est la suivante:
superagent.get (turl)
.end (fonction (err, res) {
if (err) {
return console.error (err);
}
var topicSurls = [];
var $ = cheeseio.load (res.text);
// Obtenez tous les liens sur la page d'accueil
$ ('# topic_list .topic_title'). Chaque (fonction (idx, élément) {
var $ element = $ (élément);
var href = url.resolve (turl, $ element.attr ('href'));
console.log (href);
//topicurls.push(href);
});
});
Utilisez EventProxy pour ramper simultanément le contenu de chaque sujet
Le tutoriel montre des exemples de méthodes et de méthodes de comptoir profondément imbriquées (en série). EventProxy utilise des méthodes d'événement (parallèle) pour résoudre ce problème. Une fois tous les rampes terminées, EventProxy appellera automatiquement la fonction de traitement lorsqu'elle recevra le message de l'événement.
La copie de code est la suivante:
// Étape 1: Obtenez une instance de EventProxy
var ep = new EventProxy ();
// Étape 2: Définissez la fonction de rappel qui écoute les événements.
// Une fois la méthode est répétée écoute
// Params: Nom de l'événement EventName (String), Times (numéro) Nombre d'énudes, fonction de rappel de rappel
ep.after ('topic_html', topicurls.length, fonction (sujets) {
// sujets est un tableau contenant les 40 paires dans ep.emit ('topic_html', paire) 40 fois
//.carte
sujets = sujets.map (fonction (topicpair) {
// Utilisez Cheerio
var topicUrl = topicpair [0];
var topIchTml = thèsepair [1];
var $ = cheeseio.load (topichtml);
retour ({
Titre: $ ('. topic_full_title'). text (). Trim (),
HREF: Topicurl,
comment1: $ ('. Répondre_content'). Eq (0) .Text (). Trim ()
});
});
//résultat
console.log ('Résultat:');
console.log (sujets);
});
// Étape 3: Déterminer la version des messages de l'événement
topicurls.ForEach (fonction (topicurl) {
superagent.get (topicurl)
.end (fonction (err, res) {
Console.log ('fetch' + topicurl + 'réussi');
ep.emit ('topic_html', [topicurl, res.text]);
});
});
Les résultats sont les suivants
Exercices prolongés (défis)
Obtenez le nom d'utilisateur et les points du message
Recherchez le nom de la classe utilisateur du commentaire dans le code source de la page de l'article, et le nom de classe est Répondre_author. console.log premier élément $('.reply_author').get(0) peut être vu que nous devons obtenir des choses ici.
Tout d'abord, nous pouvons ramper un article et obtenir tout ce dont nous avons besoin à la fois.
La copie de code est la suivante:
var userHref = url.resolve (turl, $ ('. Répondre_author'). get (0) .attribs.href);
console.log (userHref);
console.log ($ ('. Répondre_author'). get (0) .children [0] .data);
Nous pouvons saisir des informations sur les points via https://cnodejs.org/user/username
La copie de code est la suivante:
$ ('. Répondre_author'). Chaque (fonction (idx, élément) {
var $ element = $ (élément);
console.log ($ element.attr ('href'));
});
Sur la page d'informations utilisateur $('.big').text().trim() est les informations sur les points.
Utilisez la fonction de Cheatio.get (0) pour obtenir le premier élément.
La copie de code est la suivante:
var userHref = url.resolve (turl, $ ('. Répondre_author'). get (0) .attribs.href);
console.log (userHref);
Ce n'est qu'un bondling d'un seul article, et il y a encore certaines choses qui doivent être modifiées pour 40 articles.