この本は前回続いています。40ページのコンテンツを連続してcraうするプログラムを変更する必要があります。つまり、タイトル、リンク、最初のコメント、コメントユーザー、および各記事のフォーラムポイントを出力する必要があります。
図に示すように、 $('.reply_author').eq(0).text().trim();正しい最初のコメントユーザーです。
{<1>}
EventProxyでコメントとユーザー名のコンテンツを取得した後、ユーザーポイントのクロールを続けるために、ユーザー名を介してユーザーインターフェイスにジャンプする必要があります
コードコピーは次のとおりです。
var $ = cheeseio.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()。置換(// n/g、 "");;
var href = topopurl;
var comment1 = $('。Reply_Content ')。eq(0).text()。trim();
var著者1 = $('。Reply_Author ')。eq(0).text()。trim();
//パラメーターを次の同時クロールに渡します
ep.emit( 'user_html'、[usershref、title、href、comment1、著者1]);
今回のeventProxyでは、スコアが配置される場所を見つけたいと思います(class = "big")。
{<2>}
クラス名を見つけるだけで、最初に結果を出力してみましょう
コードコピーは次のとおりです。
var outcome = superagent.get(userurl)
.end(function(err、res){
if(err){
return Console.Error(err);
}
var $ = cheeseio.load(res.text);
var score = $('。big ')。text()。trim();
console.log(user [1]);
console.log(user [2]);
console.log(user [3]);
console.log(user [4]);
console.log($('。big ')。text()。trim());
戻る ({
タイトル:ユーザー[1]、
HREF:ユーザー[2]、
コメント1:ユーザー[3]、
著者1:ユーザー[4]、
スコア1:スコア
});
});
});
プログラムを実行すると、結果はこのコードによって取得されます。
{<3>}
しかし、問題は、.end()のコールバック関数に結果を正しく出力できることですが、結果を正しく出力できないことです。よく見ると、出力である必要がある出力はリクエストオブジェクトです。これは不注意な間違いのためです。 .end()関数はリクエストオブジェクトに戻り値を渡さず、結果を前のレイヤー(ユーザー)に返す必要があります。
コードコピーは次のとおりです。
// userdetailsを見つけます
ep.after( 'user_html'、topopurls.length、function(users){
users = users.map(function(user){
var userurl = user [0];
varスコア;
superagent.get(userurl)
.end(function(err、res){
if(err){
return Console.Error(err);
}
//console.log(res.text);
var $ = cheeseio.load(res.text);
score = $('。big ')。text()。trim();
});
戻る ({
タイトル:ユーザー[1]、
HREF:ユーザー[2]、
コメント1:ユーザー[3]、
著者1:ユーザー[4]、
スコア1:スコア
});
});
ユーザーをよくエクスポートし、SCORE1以外が正しい値であることがわかります。慎重にデバッグした後、プログラムが最初にconsole.log()を実行してから.map()を実行したことがわかりました。より正確には、.map()関数内で、.get()コールバック関数は割り当てスコアを完了せず、返品返品値が実行されます。これは非同期コールバック関数であり、外側の同期操作は、コールバック関数が操作を完了するのを待ちません。
{<4>}
私のアプローチは、メッセージの別のレイヤーを放出し、必要なデータをメッセージとともに受信メッセージ操作に渡すことです。後()、すべてのメッセージが受信された場合にのみ、渡されたパラメーター(結果)が印刷されます。
コードコピーは次のとおりです。
score = $('。big ')text()。trim();
//新しく追加されました
ep.emit( 'got_score'、[user [1]、user [2]、user [3]、user [4]、score]);
.....
ep.after( 'got_score'、10、function(users){
console.log(users);
});
{<6>}
この問題は解決されましたが、SCORE1の値は大きすぎるようです。もう一度見た後、2つのclass = 'big'があり、ユーザーのトピックコレクションもこのクラスに属していることがわかります。 Cheerioの.slice(Start、[End])を使用して最初の要素をカットし、スコアをスコア= $( '。ビッグ')。正しい結果が図に示されています。
{<7>}