ホームページ > ウェブフロントエンド > jsチュートリアル > NodeJSでクローラを作る全過程(続き)_node.js

NodeJSでクローラを作る全過程(続き)_node.js

WBOY
リリース: 2016-05-16 16:25:02
オリジナル
956 人が閲覧しました

前の章から引き続き、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(); に変更されます。

{}

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート