前の章から引き続き、40 ページのコンテンツを継続的にキャプチャするようにプログラムを修正する必要があります。つまり、各記事のタイトル、リンク、最初のコメント、コメントしたユーザー、フォーラムのポイントを出力する必要があります。
図に示すように、$('.reply_author').eq(0).text().trim();
で得られる値が最初にコメントをした正しいユーザーです。
{}
eventproxy がコメントとユーザー名のコンテンツを取得した後、ユーザーのポイントを取得し続けるために、ユーザー名を介してユーザー インターフェイスにジャンプする必要があります
var $ = Cheerio.load(topicHtml);
//この URL は次のステップのターゲット URL です
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();
//パラメータを次の同時クロールに渡します
ep.emit('user_html', [userHref, title, href, comment1, author1]);
今回は、eventproxy で、スコアが配置される場所 (class="big") を見つける必要があります。
{}
クラス名を見つけるのは簡単です。まず結果を出力してみましょう。
var 結果 = superagent.get(userUrl)
.end(function (err, res) {
(エラー) {
の場合
return console.error(err);
}
var $ = Cheerio.load(res.text);
var スコア = $('.big').text().trim();
console.log(user[1]);
console.log(user[2]);
console.log(user[3]);
console.log(user[4]);
console.log($('.big').text().trim());
return ({
タイトル: user[1]、
href: user[2],
コメント1: ユーザー[3]、
author1: user[4],
スコア1: スコア
});
});
});
プログラムを実行して、このコードの結果を取得します。
{}
しかし、ここで問題が発生します。.end() のコールバック関数では結果を正しく出力できますが、結果を正しく出力できません。よく見ると、出力する必要がある結果は Request オブジェクトです。これはうっかりミスです。.end() 関数は戻り値を Request オブジェクトに渡さないため、結果を前の層 (ユーザー) に返す必要があります。
// userDetails を検索
ep.after('user_html', topicUrls.length, function(users){
users = users.map(function(user){
var userUrl = ユーザー[0];
var スコア;
superagent.get(userUrl)
.end(function (err, res) {
if (エラー) {
return console.error(err);
}
//console.log(res.text);
var $ = Cheerio.load(res.text);
スコア = $('.big').text().trim();
});
戻る ({
タイトル: ユーザー[1]、
href: user[2]、
コメント1: ユーザー[3]、
author1: ユーザー[4]、
スコア1: スコア
});
});
は、スコア 1 以外の値をユーザーに好意的に表示します。内部では、.get() の回帰関数は実行完了スコアを持たず、戻り値を返すことで実行されます。これは回帰関数の動作であり、層の同期操作は回帰関数の完了動作を待機しません。
{}
私たちのやり方は、eventproxy が再度メッセージを送信し、メッセージに必要なデータを送信してメッセージ受信操作を行うことです。after()、メッセージが完全に受信された場合にのみ、送信パラメータ (結果) を再出力します。
スコア = $('.big')text().trim();
//新追加
ep.emit('got_score', [ユーザー[1], ユーザー[2], ユーザー[3], ユーザー[4], スコア]);
......
ep.after('got_score', 10, function(users){
console.log(ユーザー);
});
{}
この問題は解決されましたが、score1 の数値はポイントを大きく上回っています。さらに、元の class='big' には 2 つがあり、ユーザーのアクセスもこのクラスに属します。cheerio の .slice( start, [end] ) で最初の要素が取り出されます。つまり、スコアはスコア = $('.big').slice(0).eq(0).text().trim(); に変更されます。
{}