Heim > Web-Frontend > js-Tutorial > Der gesamte Prozess der Erstellung eines Crawlers mit NodeJS_node.js

Der gesamte Prozess der Erstellung eines Crawlers mit NodeJS_node.js

WBOY
Freigeben: 2016-05-16 16:25:03
Original
1842 Leute haben es durchsucht

Lassen Sie uns heute das Crawler-Tutorial von alsotang lernen und dann dem einfachen Crawlen von CNode folgen.

Projekt craelr-demo erstellen
Wir erstellen zunächst ein Express-Projekt und löschen dann den gesamten Inhalt der Datei app.js, da wir den Inhalt vorerst nicht im Web anzeigen müssen. Natürlich können wir auch direkt npm install express in einem leeren Ordner die von uns benötigten Express-Funktionen nutzen.

Gezielte Website-Analyse
Wie im Bild gezeigt, ist dies ein Teil des div-Tags auf der CNode-Homepage. Wir verwenden diese Reihe von IDs und Klassen, um die benötigten Informationen zu finden.

Verwenden Sie Superagent, um Quelldaten zu erhalten

Superagent ist eine HTTP-Bibliothek, die von der Ajax-API verwendet wird. Seine Verwendung ähnelt der von jQuery. Wir initiieren darüber eine Get-Anfrage und geben das Ergebnis in der Callback-Funktion aus.

Code kopieren Der Code lautet wie folgt:

var express = require('express');
var url = require('url'); //Operations-URL analysieren
var superagent = require('superagent'); // Vergessen Sie nicht, npm install
für diese drei externen Abhängigkeiten durchzuführen var cheerio = require('cheerio');
var eventproxy = require('eventproxy');
var targetUrl = 'https://cnodejs.org/';
superagent.get(targetUrl)
.end(function (err, res) {
console.log(res);
});

Sein Res-Ergebnis ist ein Objekt, das Ziel-URL-Informationen enthält, und der Website-Inhalt besteht hauptsächlich aus seinem Text (String).

Verwenden Sie Cheerio zum Parsen

cheerio fungiert als serverseitige jQuery-Funktion. Zuerst verwenden wir .load(), um HTML zu laden, und filtern dann Elemente über den CSS-Selektor.

Code kopieren Der Code lautet wie folgt:

var $ = cheerio.load(res.text);
//Daten über den CSS-Selektor filtern
$('#topic_list .topic_title').each(function (idx, element) {
console.log(element);
});

Das Ergebnis ist ein Objekt. Rufen Sie die Funktion .each(function(index, element)) auf, um jedes Objekt zu durchlaufen und HTML-DOM-Elemente zurückzugeben.

Das Ergebnis der Ausgabe von console.log($element.attr('title')); ist 广州 2014年12月06日 NodeParty 之 UC 场
Titel wie console.log($element.attr('href')); werden als URLs wie /topic/545c395becbcb78265856eb2 ausgegeben. Verwenden Sie dann die Funktion url.resolve() von NodeJS1, um die vollständige URL zu vervollständigen.

Code kopieren Der Code lautet wie folgt:

superagent.get(tUrl)
.end(function (err, res) {
Wenn (irrt) {
                return console.error(err);
}
        var topicUrls = [];
      var $ = cheerio.load(res.text);
//Alle Links auf der Homepage erhalten
           $('#topic_list .topic_title').each(function (idx, element) {
            var $element = $(element);
            var href = url.resolve(tUrl, $element.attr('href'));
console.log(href);
                     //topicUrls.push(href);
});
});

Verwenden Sie Eventproxy, um den Inhalt jedes Themas gleichzeitig zu crawlen
Das Tutorial zeigt Beispiele für tief verschachtelte (serielle) Methoden und Zählermethoden. Eventproxy verwendet Ereignismethoden (parallele Methoden), um dieses Problem zu lösen. Wenn das gesamte Crawling abgeschlossen ist, empfängt eventproxy die Ereignisnachricht und ruft automatisch die Verarbeitungsfunktion für Sie auf.

Code kopieren Der Code lautet wie folgt:

//Schritt eins: Holen Sie sich eine Instanz von eventproxy
var ep = new eventproxy();
//Schritt 2: Definieren Sie die Rückruffunktion für Abhörereignisse.
//Die After-Methode ist eine wiederholte Überwachung
//params: eventname(String) Ereignisname, times(Number) Anzahl der Abhörzeiten, Callback-Callback-Funktion
ep.after('topic_html', topicUrls.length, function(topics){
// topic ist ein Array, das die 40 Paare
in ep.emit('topic_html', pair) 40 Mal enthält //.map
themen = themen.map(function(topicPair){
            //verwende Cheerio
        var topicUrl = topicPair[0];
        var topicHtml = topicPair[1];
        var $ = cheerio.load(topicHtml);
         zurück ({
               Titel: $('.topic_full_title').text().trim(),
            href: topicUrl,
               comment1: $('.reply_content').eq(0).text().trim()
});
});
//Ergebnis
console.log('outcome:');
console.log(topics);
});
//Schritt 3: Bestimmen Sie das
, das die Ereignismeldung auslöst topicUrls.forEach(function (topicUrl) {
Superagent.get(topicUrl)
        .end(function (err, res) {
console.log('fetch ' topicUrl ' erfolgreich');
             ep.emit('topic_html', [topicUrl, res.text]);
});
});

Die Ergebnisse sind wie folgt

Erweiterte Übung (Challenge)

Benutzernamen und Punkte per Nachricht erhalten

Suchen Sie den Klassennamen des Benutzers, der im Quellcode der Artikelseite einen Kommentar abgegeben hat. Der Klassenname lautet „reply_author“. Wie Sie dem ersten Element von console.log $('.reply_author').get(0) entnehmen können, ist alles, was wir brauchen, hier.

Lassen Sie uns zunächst einen Artikel crawlen und alles, was wir brauchen, auf einmal erhalten.

Code kopieren Der Code lautet wie folgt:

var userHref = url.resolve(tUrl, $('.reply_author').get(0).attribs.href);
console.log(userHref);
console.log($('.reply_author').get(0).children[0].data);

Wir können Punktinformationen über https://cnodejs.org/user/username

erfassen

Code kopieren Der Code lautet wie folgt:

$('.reply_author').each(function (idx, element) {
var $element = $(element);
console.log($element.attr('href'));
});

Auf der Benutzerinformationsseite $('.big').text().trim() finden Sie die Punkteinformationen.

Verwenden Sie die Funktion .get(0) von Cheerio, um das erste Element abzurufen.

Code kopieren Der Code lautet wie folgt:

var userHref = url.resolve(tUrl, $('.reply_author').get(0).attribs.href);
console.log(userHref);

Dies ist nur eine Aufnahme eines einzelnen Artikels, es gibt noch 40, die geändert werden müssen.

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