Buku ini berlanjut terakhir kali, kita perlu memodifikasi program untuk merangkak konten 40 halaman berturut -turut. Dengan kata lain, kita perlu mengeluarkan judul, tautan, komentar pertama, komentar pengguna dan poin forum dari setiap artikel.
Seperti yang ditunjukkan pada gambar, nilai yang diperoleh $('.reply_author').eq(0).text().trim(); adalah pengguna komentar pertama yang benar.
{<1>}
Setelah mendapatkan komentar dan konten nama pengguna di EventProxy, kita perlu melompat ke antarmuka pengguna melalui nama pengguna untuk terus merangkak titik pengguna
Salinan kode adalah sebagai berikut:
var $ = cheeseio.Load (TopICHTML);
// URL ini adalah langkah selanjutnya untuk merangkak URL target
var userhref = 'https://cnodejs.org' + $ ('. Balas_author'). EQ (0) .attr ('href');
userhref = url.resolve (turl, userhref);
var title = $ ('. Topic_full_title'). text (). trim (). ganti (// n/g, "") ;;
var href = TopicUrl;
var comment1 = $ ('. Balas_content'). EQ (0) .text (). trim ();
var author1 = $ ('. Balas_author'). EQ (0) .text (). trim ();
// Lewati parameter ke perayapan bersamaan berikutnya
ep.emit ('user_html', [userhref, judul, href, komentar1, penulis1]);
Dalam EventProxy kali ini, kami ingin menemukan di mana skor ditempatkan (class = "Big").
{<2>}
Temukan saja nama class, mari kita coba output hasilnya terlebih dahulu
Salinan kode adalah sebagai berikut:
var hasil = superagent.get (userUrl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var $ = cheeseio.load (res.text);
var skor = $ ('. BIG'). TEXT (). TRIM ();
console.log (pengguna [1]);
console.log (pengguna [2]);
console.log (pengguna [3]);
console.log (pengguna [4]);
console.log ($ ('. Big'). Text (). trim ());
kembali ({
Judul: Pengguna [1],
href: pengguna [2],
Komentar1: pengguna [3],
penulis1: pengguna [4],
skor1: skor
});
});
});
Jalankan program dan hasilnya diperoleh dengan kode ini.
{<3>}
Tetapi masalahnya adalah bahwa kita dapat mengeluarkan hasilnya dengan benar dalam fungsi panggilan balik .Enn (), tetapi kita tidak dapat mengeluarkan hasilnya dengan benar. Jika Anda melihat lebih dekat, output yang perlu output adalah objek permintaan. Ini karena kesalahan yang ceroboh. Fungsi .EnnD () tidak meneruskan nilai pengembalian ke objek permintaan, dan perlu mengembalikan hasilnya ke lapisan sebelumnya (pengguna).
Salinan kode adalah sebagai berikut:
// Temukan UserDetails
ep.after ('user_html', topicurls.length, function (pengguna) {
Users = Users.map (fungsi (pengguna) {
var userUrl = pengguna [0];
skor var;
superagent.get (userUrl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
//console.log(res.text);
var $ = cheeseio.load (res.text);
skor = $ ('. BIG'). TEXT (). TRIM ();
});
kembali ({
Judul: Pengguna [1],
href: pengguna [2],
Komentar1: pengguna [3],
penulis1: pengguna [4],
skor1: skor
});
});
Ekspor pengguna dengan baik dan menemukan bahwa selain SCORE1 adalah nilai yang benar. Setelah debugging yang cermat, saya menemukan bahwa program pertama kali melakukan console.log () dan kemudian melakukan .map (). Lebih tepatnya, dalam fungsi .map (), fungsi callback .get () tidak menyelesaikan skor penugasan, dan nilai pengembalian kembali dilakukan. Ini adalah fungsi panggilan balik asinkron, dan operasi sinkron luar tidak akan menunggu fungsi callback untuk menyelesaikan operasi.
{<4>}
Pendekatan saya adalah memancarkan lapisan pesan lain, dan meneruskan data yang diperlukan ke operasi pesan penerima bersama dengan pesan tersebut. After (), hanya ketika semua pesan diterima akan dicetak parameter yang diteruskan (hasil).
Salinan kode adalah sebagai berikut:
skor = $ ('. Big') text (). trim ();
// baru ditambahkan
ep.emit ('got_score', [pengguna [1], pengguna [2], pengguna [3], pengguna [4], skor]);
.....
ep.after ('got_score', 10, function (pengguna) {
console.log (pengguna);
});
{<6>}
Masalah ini telah diselesaikan, tetapi nilai SCORE1 tampaknya terlalu besar. Setelah melihat lagi, ternyata ada dua kelas = 'besar', dan koleksi topik pengguna juga termasuk dalam kelas ini. Kita harus memotong elemen pertama melalui Cheerio .slice (mulai, [end]) dan ubah skor menjadi skor = $ ('. Big'). Slice (0) .eq (0) .text (). Trim ();. Hasil yang benar ditunjukkan pada gambar.
{<7>}