Lassen Sie uns heute das Crawler -Tutorial von Alsotang lernen und einfach Cnode crawlen.
Erstellen Sie ein Projekt craelr-Demo
Wir erstellen zuerst ein Express -Projekt und löschen dann alle Inhalte von App.js -Dateien, da wir vorerst keine Inhalte auf der Webseite anzeigen müssen. Natürlich können wir auch die Expressfunktion verwenden, die wir von npm install express .
Ziel -Website -Analyse
Wie in der Abbildung gezeigt, ist dies ein Teil des Div -Tags auf der CNODE -Homepage. Wir verwenden diese Reihe von IDs und Klassen, um die Informationen zu finden, die wir benötigen.
Verwenden Sie Superagent, um Quelldaten zu erhalten
Superagent ist die HTTP -Bibliothek, die von der AJAX -API verwendet wird. Es wird ähnlich wie JQuery verwendet , durch die wir eine GET -Anforderung einleiten und das Ergebnis in der Rückruffunktion ausgeben.
Die Codekopie lautet wie folgt:
var express = require ('express');
var url = erfordern ('url'); // die Operation URL analysieren
var superagent = required ('superAgent'); // Vergiss nicht die NPM -Installation
var Cheeseio = erfordern ('Cheerio');
var eventProxy = Request ('eventProxy');
var targeturl = 'https://cnodejs.org/';
Superagent.get (Targeturl)
.end (Funktion (err, res) {
console.log (res);
});
Das Ergebnis ist ein Objekt, das die Ziel -URL -Informationen enthält, und der Website -Inhalt befindet sich hauptsächlich in seinem Text (String).
Verwenden Sie Cheatio, um zu analysieren
Cheerio fungiert als serverseitige JQuery-Funktion. Wir verwenden zuerst seine .load (), um HTML zu laden und dann Elemente durch den CSS -Selektor zu filtern.
Die Codekopie lautet wie folgt:
var $ = Cheeseio.load (res.text);
// Daten über den CSS -Selektor filtern
$ ('#topic_list .topic_title'). Jede (Funktion (IDX, Element) {
console.log (element);
});
Das Ergebnis ist ein Objekt, und die Funktion .each(function(index, element)) wird aufgerufen, um durch jedes Objekt zu iterieren, und die HTML -DOM -Elemente werden zurückgegeben.
Das Ergebnis von Output console.log($element.attr('title')); ist广州2014年12月06日NodeParty 之UC 场
Für solche Titel ist Ausgabe console.log($element.attr('href')); Das Ergebnis ist eine URL -ähnliche /topic/545c395becbcb78265856eb2 . Verwenden Sie dann die Funktion von nodejs1 von url.resolve (), um die vollständige URL zu vervollständigen.
Die Codekopie lautet wie folgt:
Superagent.get (Turl)
.end (Funktion (err, res) {
if (err) {
return console.Error (err);
}
var topicurls = [];
var $ = Cheeseio.load (res.text);
// Erhalten Sie alle Links auf der Homepage
$ ('#topic_list .topic_title'). Jede (Funktion (IDX, Element) {
var $ element = $ (element);
var href = url.resolve (Turl, $ element.attr ('href'));
console.log (href);
//topicurls.push(href);
});
});
Verwenden Sie EventProxy, um gleichzeitig Inhalte aus jedem Thema zu kriechen
Das Tutorial zeigt Beispiele für tiefe verschachtelte (serielle) Methoden und Gegenmethoden. EventProxy verwendet Event -Methoden (Parallele), um dieses Problem zu lösen. Nach Abschluss des Krabbelns ruft EventProxy die Verarbeitungsfunktion automatisch auf, wenn sie die Ereignismeldung empfängt.
Die Codekopie lautet wie folgt:
// Schritt 1: Erhalten Sie eine Instanz von EventProxy
var ep = new eventProxy ();
// Schritt 2: Definieren Sie die Rückruffunktion, die Ereignissen hört.
// Nachdem die Methode wiederholt wird, ist das Hören zuzuhören
// Params: Ereignisname (String) Ereignisname, Zeiten (Nummer) Anzahl der Hörer, Rückruffunktion
ep.after ('topic_html', topicurls.length, Funktion (Themen) {{
// Themen sind ein Array, das die 40 Paare in EP.Emit ('topic_html', Paar) 40 Mal enthält
//.Karte
topics = topics.map (function (topicpair) {
// Cheerio benutze
var topicurl = topicpair [0];
var topichtml = topicpair [1];
var $ = Cheeseio.load (topichtml);
zurückkehren ({
Titel: $ ('. topic_full_title'). text (). trim (),
href: topicurl,
Kommentar1: $ ('. Reply_Content'). EQ (0) .Text (). Trim ()
});
});
//Ergebnis
console.log ('Ergebnis:');
console.log (Themen);
});
// Schritt 3: Bestimmen Sie die Veröffentlichung von Ereignismeldungen
topicurls.foreach (function (topicurl) {
Superagent.get (topicurl)
.end (Funktion (err, res) {
console.log ('fetch' + topicurl + 'erfolgreich');
ep.emit ('topic_html', [topicurl, res.text]);
});
});
Die Ergebnisse sind wie folgt
Verlängerte Übungen (Herausforderungen)
Holen Sie sich den Nachrichten Benutzernamen und Punkte
Suchen Sie den Namen der Benutzerklasse des Kommentars im Quellcode der Artikelseite, und der Klassenname ist Reply_Uthor. Console.log First Element $('.reply_author').get(0) ist zu sehen, dass wir die Dinge hierher bekommen müssen.
Erstens können wir einen Artikel kriechen und alles, was wir brauchen, auf einmal bekommen.
Die Codekopie lautet wie folgt:
var userhref = url.resolve (Turl, $ ('. Reply_uthor'). Get (0) .Attribs.href);
console.log (userHref);
console.log ($ ('. Reply_author'). Get (0) .Children [0] .Data);
Wir können Informationen über https://cnodejs.org/user/username erhalten
Die Codekopie lautet wie folgt:
$ ('. Reply_author'). Jede (Funktion (IDX, Element) {
var $ element = $ (element);
console.log ($ element.attr ('href'));
});
Auf der Benutzerinformation Seite $('.big').text().trim() sind die Punktinformationen.
Verwenden Sie die Funktion von Cheatios Funktion.get (0), um das erste Element zu erhalten.
Die Codekopie lautet wie folgt:
var userhref = url.resolve (Turl, $ ('. Reply_uthor'). Get (0) .Attribs.href);
console.log (userHref);
Dies ist nur ein Krabbeln eines einzelnen Artikel, und es gibt immer noch einige Dinge, die für 40 Artikel geändert werden müssen.