今日は、AlsotangのCrawlerチュートリアルを学び、単にCnodeをクロールしましょう。
プロジェクトCraelr-Demoを作成します
最初にExpressプロジェクトを作成し、次にapp.jsファイルのすべてのコンテンツを削除します。もちろん、空のフォルダーに直接npm install expressが必要とするExpress関数を使用することもできます。
ターゲットWebサイト分析
図に示すように、これはCNodeホームページのDivタグの一部です。この一連のIDとクラスを使用して、必要な情報を見つけます。
SuperAgentを使用してソースデータを取得します
SuperAgentは、Ajax APIで使用されるHTTPライブラリです。 jqueryと同様に使用されます、それを通じてGETリクエストを開始し、結果をコールバック関数に出力します。
コードコピーは次のとおりです。
var Express = require( 'Express');
var url = require( 'url'); //操作URLを解析します
var superagent = require( 'superagent'); // npmインストールを忘れないでください
var cheeseio = require( 'chereio');
var eventProxy = require( 'eventProxy');
var targeturl = 'https://cnodejs.org/';
superagent.get(targeturl)
.end(function(err、res){
console.log(res);
});
そのres結果は、ターゲットURL情報を含むオブジェクトであり、Webサイトのコンテンツは主にそのテキスト(文字列)にあります。
Cheatioを使用して解析します
Cheerioは、サーバー側のjQuery関数として機能します。最初にその.load()を使用してHTMLをロードし、次にCSSセレクターを介して要素をフィルタリングします。
コードコピーは次のとおりです。
var $ = cheeseio.load(res.text);
// CSSセレクターを介してデータをフィルターします
$( '#topic_list .topic_title')。各(function(idx、element){
console.log(要素);
});
結果はオブジェクトであり、 .each(function(index, element))関数が呼び出され、各オブジェクトを繰り返し、HTML DOM要素が返されます。
出力console.log($element.attr('title'));广州2014年12月06日NodeParty 之UC 场です
このようなタイトルの場合、output console.log($element.attr('href'));その結果、URLのような/topic/545c395becbcb78265856eb2です。次に、nodejs1のurl.resolve()関数を使用して、完全なURLを完了します。
コードコピーは次のとおりです。
superagent.get(turl)
.end(function(err、res){
if(err){
return Console.Error(err);
}
var toputurls = [];
var $ = cheeseio.load(res.text);
//ホームページですべてのリンクを取得します
$( '#topic_list .topic_title')。各(function(idx、element){
var $ element = $(element);
var href = url.resolve(turl、$ element.attr( 'href'));
console.log(href);
//topicurls.push(href);
});
});
EventProxyを使用して、各トピックからコンテンツを同時にクロールします
チュートリアルでは、深いネストされた(シリアル)方法とカウンターメソッドの例を示しています。 EventProxyは、イベント(パラレル)メソッドを使用してこの問題を解決します。すべてのクロールが完了した後、EventProxyはイベントメッセージを受信すると自動的に処理関数を呼び出します。
コードコピーは次のとおりです。
//ステップ1:EventProxyのインスタンスを取得します
var ep = new EventProxy();
//ステップ2:イベントを聴くコールバック関数を定義します。
//メソッドが繰り返された後、リスニング
// params:eventname(string)イベント名、時間(数)聴取の数、コールバックコールバック関数
ep.after( 'topic_html'、topopurls.length、function(topics){
// Topicsは、ep.emit( 'topic_html'、ペア)の40ペアを含む配列です。
//。地図
Topics = topics.map(function(topicpair){
// Cheerioを使用します
var topopurl = toppair [0];
var topichtml = topicpair [1];
var $ = cheeseio.load(topichtml);
戻る ({
タイトル:$( '。TOPIC_FULL_TITLE')。text()。trim()、
href:Toppurl、
コメント1:$('。Reply_Content ')。eq(0).text()。trim()
});
});
//結果
console.log( 'outcome:');
console.log(トピック);
});
//ステップ3:イベントメッセージのリリースを決定します
topopurs.foreach(function(topicurl){
superagent.get(topopurl)
.end(function(err、res){
console.log( 'fetch' + toputurl + 'success');
ep.emit( 'topic_html'、[topicurl、res.text]);
});
});
結果は次のとおりです
拡張エクササイズ(課題)
メッセージのユーザー名とポイントを取得します
記事ページのソースコードでコメントのユーザークラス名を見つけ、クラス名はReply_Authorです。 console.log first element $('.reply_author').get(0)ここで物事をすべて取得する必要があることがわかります。
まず、記事をcraい回って、必要なものをすべて一度に入手できます。
コードコピーは次のとおりです。
var userhref = url.resolve(turl、$('。Reply_Author ')。get(0).attribs.href);
console.log(userhref);
console.log($('。Reply_Author ')。get(0).children [0] .data);
https://cnodejs.org/user/usernameを介してポイント情報を取得できます
コードコピーは次のとおりです。
$('。Reply_Author ')。各(function(idx、element){
var $ element = $(element);
console.log($ element.attr( 'href'));
});
ユーザー情報ページ$('.big').text().trim()ポイント情報です。
Cheatioのfunction.get(0)を使用して、最初の要素を取得します。
コードコピーは次のとおりです。
var userhref = url.resolve(turl、$('。Reply_Author ')。get(0).attribs.href);
console.log(userhref);
これは単一の記事をrawっているだけであり、40の記事で変更する必要があるものがまだいくつかあります。