Hari ini, mari kita pelajari tutorial crawler Alsotang dan cukup merangkak Cnode.
Buat Proyek Craelr-Demo
Kami pertama -tama membuat proyek ekspres dan kemudian menghapus semua konten file app.js, karena kami tidak perlu menampilkan konten di sisi web untuk saat ini. Tentu saja, kita juga dapat menggunakan fungsi ekspres yang kita butuhkan dengan npm install express secara langsung di folder kosong.
Analisis Situs Web Target
Seperti yang ditunjukkan pada gambar, ini adalah bagian dari tag div di beranda CNode. Kami menggunakan serangkaian ID dan kelas ini untuk menemukan informasi yang kami butuhkan.
Gunakan superagent untuk mendapatkan data sumber
Superagent adalah perpustakaan HTTP yang digunakan oleh API AJAX. Itu digunakan mirip dengan jQuery , di mana kami memulai permintaan GET, mengeluarkan hasil di fungsi callback.
Salinan kode adalah sebagai berikut:
var express = membutuhkan ('express');
var url = membutuhkan ('url'); // parsing URL operasi
var superagent = membutuhkan ('superagent'); // Jangan lupa instal NPM
var cheeseio = membutuhkan ('cheerio');
var eventproxy = membutuhkan ('eventproxy');
var targetUrl = 'https://cnodejs.org/';
superagent.get (targetUrl)
.end (function (err, res) {
Console.log (res);
});
Hasil res -nya adalah objek yang berisi informasi URL target, dan konten situs web terutama dalam teksnya (String).
Gunakan cheato untuk menguraikan
Cheerio bertindak sebagai fungsi jQuery sisi server. Kami pertama -tama menggunakan .Load () untuk memuat HTML, dan kemudian memfilter elemen melalui pemilih CSS.
Salinan kode adalah sebagai berikut:
var $ = cheeseio.load (res.text);
// Filter data melalui pemilih CSS
$ ('#topic_list .topic_title'). masing -masing (fungsi (idx, elemen) {
console.log (elemen);
});
Hasilnya adalah objek, dan fungsi .each(function(index, element)) dipanggil untuk mengulangi melalui setiap objek, dan elemen DOM HTML dikembalikan.
Hasil output console.log($element.attr('title')); adalah广州2014年12月06日NodeParty 之UC 场
Untuk judul seperti ini, output console.log($element.attr('href')); Hasilnya adalah URL Like /topic/545c395becbcb78265856eb2 . Kemudian gunakan fungsi URL.Resolve () dari NodeJS1 untuk menyelesaikan URL lengkap.
Salinan kode adalah sebagai berikut:
superagent.get (turl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var TopicUrls = [];
var $ = cheeseio.load (res.text);
// Dapatkan semua tautan di beranda
$ ('#topic_list .topic_title'). masing -masing (fungsi (idx, elemen) {
var $ element = $ (elemen);
var href = url.resolve (turl, $ element.attr ('href'));
console.log (href);
//topicurls.push(href);
});
});
Gunakan EventProxy untuk merangkak konten secara bersamaan dari setiap topik
Tutorial ini menunjukkan contoh metode dan metode konter bersarang (serial). EventProxy menggunakan metode acara (paralel) untuk menyelesaikan masalah ini. Setelah semua merangkak selesai, EventProxy akan secara otomatis memanggil fungsi pemrosesan ketika menerima pesan acara.
Salinan kode adalah sebagai berikut:
// Langkah 1: Dapatkan contoh EventProxy
var ep = new EventProxy ();
// Langkah 2: Tentukan fungsi panggilan balik yang mendengarkan acara.
// setelah metode mendengarkan
// Params: Nama Acara (String) Acara, Times (Nomor) Jumlah mendengarkan, fungsi panggilan balik panggilan balik
ep.after ('topic_html', topicurls.length, function (topik) {
// Topik adalah array yang berisi 40 pasang di Ep.emit ('Topic_html', pasangan) 40 kali
//.peta
Topics = Topics.map (function (TopicPair) {
// Gunakan Cheerio
var TopicUrl = TopicPair [0];
var topIchtml = TopicPair [1];
var $ = cheeseio.Load (TopICHTML);
kembali ({
Judul: $ ('. Topic_full_title'). Text (). Trim (),
HREF: Topicurl,
Komentar1: $ ('. Balas_Content'). EQ (0) .text (). Trim ()
});
});
//hasil
console.log ('hasil:');
console.log (topik);
});
// Langkah 3: Tentukan rilis pesan acara
TopicUrls.foreach (function (TopicUrl) {
superagent.get (TopicUrl)
.end (function (err, res) {
console.log ('fetch' + TopicUrl + 'Success');
ep.emit ('topic_html', [TopicUrl, res.text]);
});
});
Hasilnya adalah sebagai berikut
Latihan diperpanjang (tantangan)
Dapatkan nama pengguna dan poin pesan
Temukan nama kelas pengguna komentar dalam kode sumber halaman artikel, dan className adalah Reply_author. Console.log Elemen Pertama $('.reply_author').get(0) dapat dilihat bahwa kita perlu mendapatkan semuanya di sini.
Pertama, kita bisa merangkak artikel dan mendapatkan semua yang kita butuhkan sekaligus.
Salinan kode adalah sebagai berikut:
var userhref = url.resolve (turl, $ ('. Reply_author'). get (0) .attribs.href);
console.log (userhref);
console.log ($ ('. Balas_author'). Dapatkan (0) .Children [0] .data);
Kami dapat mengambil informasi poin melalui https://cnodejs.org/user/username
Salinan kode adalah sebagai berikut:
$ ('. Balas_author'). masing -masing (fungsi (idx, elemen) {
var $ element = $ (elemen);
console.log ($ element.attr ('href'));
});
Pada halaman informasi pengguna $('.big').text().trim() adalah informasi poin.
Gunakan function function.get (0) untuk mendapatkan elemen pertama.
Salinan kode adalah sebagai berikut:
var userhref = url.resolve (turl, $ ('. Reply_author'). get (0) .attribs.href);
console.log (userhref);
Ini hanya merangkak dari satu artikel, dan masih ada beberapa hal yang perlu dimodifikasi untuk 40 artikel.