Heim > Web-Frontend > js-Tutorial > Der gesamte Prozess der Erstellung eines Crawlers mit NodeJS (Fortsetzung)_node.js

Der gesamte Prozess der Erstellung eines Crawlers mit NodeJS (Fortsetzung)_node.js

WBOY
Freigeben: 2016-05-16 16:25:02
Original
960 Leute haben es durchsucht

In Fortsetzung des vorherigen Kapitels müssen wir das Programm ändern, um den Inhalt von 40 Seiten kontinuierlich zu erfassen. Das heißt, wir müssen den Titel, den Link, den ersten Kommentar, den kommentierenden Benutzer und die Forumspunkte jedes Artikels ausgeben.

Wie in der Abbildung gezeigt, ist der von $('.reply_author').eq(0).text().trim(); erhaltene Wert der richtige Benutzer, der den ersten Kommentar abgegeben hat.

{<1>}

Nachdem eventproxy die Kommentare und den Inhalt des Benutzernamens erhalten hat, müssen wir über den Benutzernamen zur Benutzeroberfläche springen, um weiterhin die Punkte des Benutzers zu sammeln

Code kopieren Der Code lautet wie folgt:

var $ = cheerio.load(topicHtml);
//Diese URL ist die Ziel-URL für den nächsten Schritt
var userHref = 'https://cnodejs.org' $('.reply_author').eq(0).attr('href');
userHref = url.resolve(tUrl, userHref);
var title = $('.topic_full_title').text().trim().replace(/n/g,"");;
var href = topicUrl;
var comment1 = $('.reply_content').eq(0).text().trim();
var author1 = $('.reply_author').eq(0).text().trim();
//Parameter an den nächsten gleichzeitigen Crawl übergeben
ep.emit('user_html', [userHref, title, href, comment1, author1]);

In Eventproxy müssen wir dieses Mal herausfinden, wo die Punktzahl platziert ist (class="big").

{<2>}

Es ist einfach, den Klassennamen zu finden. Versuchen wir zuerst, das Ergebnis auszugeben

Code kopieren Der Code lautet wie folgt:

var result = superagent.get(userUrl)
.end(function (err, res) {
Wenn (irrt) {
                return console.error(err);
}
      var $ = cheerio.load(res.text);
      var score = $('.big').text().trim();
console.log(user[1]);
console.log(user[2]);
console.log(user[3]);
console.log(user[4]);
console.log($('.big').text().trim());
         zurück ({
              Titel: Benutzer[1],
             href: user[2],
              Kommentar1: Benutzer[3],
              Autor1: Benutzer[4],
Punktzahl1: Punktzahl
});
});
});

Führen Sie das Programm aus und erhalten Sie das Ergebnis dieses Codes.

{<3>}

Aber hier kommt das Problem. Wir können das Ergebnis in der Callback-Funktion von .end() korrekt ausgeben, aber wir können das Ergebnis nicht korrekt ausgeben. Wenn Sie genau hinsehen, ist das Ergebnis, das ausgegeben werden muss, ein Request-Objekt. Dies ist ein fahrlässiger Fehler. Die Funktion .end() übergibt den Rückgabewert nicht an das Request-Objekt und das Ergebnis muss an die vorherige Ebene (Benutzer) zurückgegeben werden.

Code kopieren Der Code lautet wie folgt:

//userDetails finden
ep.after('user_html', topicUrls.length, function(users){
    Benutzer = Benutzer.map(Funktion(Benutzer){
        var userUrl = user[0];
        var-Punktzahl;
        superagent.get(userUrl)
            .end(function (err, res) {
                if (irr) {
                    return console.error(err);
                }
                //console.log(res.text);
                var $ = cheerio.load(res.text);
                Score = $('.big').text().trim();
            });
        zurück ({
            Titel: Benutzer[1],
            href: Benutzer[2],
            Kommentar1: Benutzer[3],
            Autor1: Benutzer[4],
            Punktzahl1: Punktzahl
        });
    });

Benutzer erhalten einen Score von 1.0 .map().Diese Funktion wird von .map() verwendet Wenn Sie .get() verwenden, erhalten Sie einen Score, einen Rückgabewert und einen Rückgabewert同步操作是不会等待回调函数做完操作的.

{<4>}

我的做法就是eventproxy再emit一层消息, 伴随着消息把需要的数据一起传递给接收消息操作.after(),只<.>

复制代码 代码如下:

score = $('.big')text().trim();
//新添加
ep.emit('got_score', [Benutzer[1], Benutzer[2], Benutzer[3], Benutzer[4], Punktzahl]);
.....
ep.after('got_score', 10, function(users){
console.log(users);
});

{<6>}

这个问题解决了,但score1的数值好像太大了点吧.再一看,原来class='big'有两个,用户的话题收藏也是属于这个class.我们得通过cheerio的.slice( start, [end] )Wir haben die Funktion „score“ für „score = $('.big').slice(0).eq(0).text().trim();“ verwendet 。

{<7>}

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage