Node.js で簡単なクローラーケースを作成するチュートリアル

Node.js で簡単なクローラーケースを作成するチュートリアル

準備

  1. まず、nodejs をダウンロードする必要がありますが、これは問題ないはずです。
  2. 原文はwebstromをダウンロードする必要があります。私のパソコンにはすでに入っていますが、ダウンロードする必要はありません。コマンドラインで操作するだけです。

プロジェクトを作成する

準備が完了したので、プロジェクトの作成を始めましょう。

  1. まず、リソースを配置するフォルダーを作成します。たとえば、E ドライブに myStudyNodejs フォルダーを作成しました。
  2. 図に示すように、コマンドラインで作成したフォルダーを入力し、Eドライブを入力します:E:
    フォルダに移動します: cd myStudyNodejs (作成したフォルダの名前)
    すべて英語の記号であることに注意してください
  3. プロジェクトを初期化します。作成したフォルダーで npm init を実行します。Enter キーを押し続けてプロジェクトを初期化します。最後に yes と入力します。
  4. 実行後、プロジェクトの基本情報を含む package.json ファイルがフォルダー内に生成されます。
  5. 必要なパッケージをインストールし、作成したフォルダのディレクトリで実行します。
    npm をインストール Cheerio –save
    npm インストール リクエスト保存
    武漢大学に登る場合は、この2つのパッケージで十分です。Caoliuに登る場合は、追加のエンコード変換パッケージが必要です。Windowsの場合は
    npm インストール iconv-lite -save
    Macの場合は、npm install iconv -saveを使用します。
    結果は2番目の写真のようになるはずですが、真ん中の文字が抜けています。
  6. 作成したフォルダーの下にファイルを作成し、クロールしたテキスト データを保存するデータ フォルダーを作成します。
    画像データを保存するための画像フォルダを作成します。
    プログラムを記述するためのjsファイルを作成します。たとえば、study.js。 (メモ帳ファイルを作成し、.txt を .js に変更します)
    –save の目的は、プロジェクトのパッケージへの依存関係を package.json ファイルに書き込むことです。

図1

図2

武漢大学コンピュータサイエンス学部ニュースクローラーコード

以下は武漢大学コンピュータサイエンス学院のニュースのクローラーコードです。作成した.jsファイルにコピーして保存します。

var http = require('http');
var fs = require('fs');
var cheerio = require('cheerio');
var リクエスト = require('リクエスト');
var i = 0;
//初期URL 
var url = "http://cs.whu.edu.cn/a/xinwendongtaifabu/2018/0428/7053.html"; 

function fetchPage(x) { //function startRequest(x) のレイヤーをカプセル化します。 
}

関数startRequest(x) {
     //httpモジュールを使用してサーバーへのGETリクエストを開始します http.get(x, function (res) {     
        var html = ''; // 要求された Web ページの HTML コンテンツ全体を保存するために使用されます var titles = [];    
        res.setEncoding('utf-8'); //中国語の文字化けを防ぐ //データイベントをリッスンし、一度に1つのデータを取得する res.on('data', function (chunk) {   
	      html += チャンク;
	 });
     //終了イベントをリッスンします。Webページコンテンツ全体のHTMLが取得された場合、コールバック関数を実行します res.on('end', function () {
         var $ = cheerio.load(html); //cheerioモジュールを使用してhtmlを解析します
         var ニュースアイテム = {
          //記事のタイトルを取得します。タイトル: $('div#container dt').text().trim(),
          i: i = i + 1、     
       };

	  console.log(news_item); //ニュース情報を印刷します var news_title = $('div#container dt').text().trim();
	  savedContent($,news_title); //各記事の内容とタイトルを保存 savedImg($,news_title); //各記事の画像とタイトルを保存 //次の記事のURL
       var nextLink="http://cs.whu.edu.cn" + $("dd.Paging a").attr('href');
       str1 = nextLink.split('-'); // URLの後の中国語の文字を削除します str = encodeURI(str1[0]);  
       //これはハイライトの1つです。Iを制御することで、クロールする記事の数を制御できます。武漢大学には記事が8つしかないため、8に設定されています
       もし (i <= 8) {                
          ページをフェッチします(str);
       }
	});
}).on('エラー', 関数 (err) {
      コンソールログ(エラー);
    });
 }
//この関数は、クロールされたニュースコンテンツリソースをローカルに保存します。 function savedContent($, news_title) {
	$('dd.info').each(関数(インデックス, 項目) {
		var x = $(this).text();       
		var y = x.substring(0, 2).trim();
		y == ''の場合{
			x = x + '\n';   
			// ニュースのテキストコンテンツを /data フォルダに少しずつ追加し、ニュースのタイトルをファイルに付けます fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function (err) {
				もし(エラー){
				コンソールログ(エラー);
				}
			});
		}	
	})
}       
//この関数はクロールされた画像リソースをローカルに保存します function savedImg($,news_title) {
  $('dd.info img').each(関数(インデックス、項目) {
        var img_title = $(this).parent().next().text().trim(); //画像のタイトルを取得します if(img_title.length>35||img_title==""){
         	img_title="Null";
        }
        var img_filename = img_title + '.jpg';
        var img_src = 'http://cs.whu.edu.cn' + $(this).attr('src'); //画像のURLを取得します

		//リクエストモジュールを使用して、画像リソースを取得するためのサーバーへのリクエストを開始します request.head(img_src,function(err,res,body){
		  もしエラーが起きたら
		    コンソールログ(エラー);
		  }
		});
		request(img_src).pipe(fs.createWriteStream('./image/'+news_title + '---' + img_filename)); // ストリーミングを通じてローカルの /image ディレクトリに画像を書き込み、ニュースのタイトルと画像のタイトルを画像の名前として使用します。
	})
}

fetchPage(url); //メインプログラムの実行が開始されます

いよいよ面白い瞬間です。現在のフォルダーで、作成された js ファイルを実行します。たとえば、私の場合は news.js です。

npmニュース.js

図3

テキストリソース:

図4

画像リソース:

図5

Caoliu テクノロジーフォーラムクローラー

武漢大学のニュースをクロールしても満足できなかったので、Caoliu の技術ディスカッション フォーラムをクロールしてみました (もちろん、皆さんが理解していることもいくつかクロールできます)。いくつかの問題が発生しました。
草むらをクロールする場合、HTTPリクエストメッセージヘッダーにUser-Agentフィールドを含める必要があるため、初期URLを次のように変更する必要があります。

var url = {
	ホスト名: 'cl.5fy.xyz',
	パス: '/thread0806.php?fid=7',
	ヘッダー: {
		'コンテンツタイプ': 'text/html',
  	//このフィールドがないとアクセスできません 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',  
  }};

次に、Node.jsはUTF-8文字エンコードのWebサイトのクロールのみをサポートしているため、エンコードを変換するための追加パッケージをインストールする必要があります。コードを次のように変更します。

/*
* @著者: ユーザー
* @日付: 2018-04-28 19:34:50
* @最終更新者: ユーザー
* @最終更新日時: 2018-04-30 21:35:26
*/
var http = require('http');
var fs = require('fs');
var cheerio = require('cheerio');
var リクエスト = require('リクエスト');
var iconv = require('iconv-lite');
var i = 0;
  //保存するかアクセスするかを決定するために使用されます var temp=0;
  let startPage=3;//クロールを開始するページ let page=startPage;
  let endPage=5;//クロールするページ let searchText='';//必要に応じて、デフォルトですべてクロールされるキーワード //初期 URL 
  var url = {
  ホスト名: '1024liuyouba.tk',
  パス: '/thread0806.php?fid=16'+'&search=&page='+startPage,
  ヘッダー: {
    'コンテンツタイプ': 'text/html',
    //このフィールドがないと、「User-Agent」にアクセスできません: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',  
  }};
//ホームページのURLを保存する
urlList=[];
//関数のレイヤーをカプセル化します function fetchPage(x) { 
  setTimeout(関数(){  
    開始リクエスト(x); },5000)
}
//まずアクセスするインターフェースのURLを保存します
関数 getUrl(x){
  温度++;
  http.get(x,function(res){
    var html = ''; 
    res.setEncoding('バイナリ');
    res.on('data', 関数(チャンク) {   
      html += チャンク;
    });
    res.on('end', 関数() {
      var buf = 新しいバッファ(html, 'binary');
      var str=iconv.decode(buf,'GBK');
          var $ = cheerio.load(str); //cheerioモジュールを使用してHTMLを解析する                
          $('tr.tr3 td.tal h3 a').each(function(){
            var search = $(this).text();
            if(search.indexOf(searchText)>=0){
            var nextLink="http://cl.5fy.xyz/" + $(this).attr('href');
            str1 = nextLink.split('-'); // URLの後の中国語文字を削除します str = encodeURI(str1[0]); 
            urlList.push(str); }
          })
          ページ++;
          if(ページ<endPage){
            //次のページのURLを保存する
            x.path='/thread0806.php?fid=16'+'&search=&page='+ページ,
            getUrl(x);
          }そうでない場合(urlList.length!=0){
            urlList をフェッチします。
          }それ以外{
            console.log('キーワードが見つかりません!');
          }
        })
  }).on('エラー', 関数 (err) {
    コンソールログ(エラー);
  });

}
関数startRequest(x) {
  温度===0の場合{
    getUrl(x);     
  }   
  それ以外{
     //httpモジュールを使用してサーバーへのGETリクエストを開始します http.get(x, function (res) {     
        var html = ''; // 要求された Web ページの HTML コンテンツ全体を保存するために使用されます res.setEncoding('binary');
        var タイトル = [];        
	     //データイベントをリッスンし、一度にデータのチャンクを取得します res.on('data', function (chunk) {   
	      html += チャンク;
	    });
	     //終了イベントをリッスンします。Webページコンテンツ全体のHTMLが取得された場合、コールバック関数を実行します res.on('end', function () {
	    	var buf = 新しいバッファ(html, 'binary');
	    	var str=iconv.decode(buf,'GBK');
	        var $ = cheerio.load(str); //cheerioモジュールを使用してHTMLを解析する
	        var ニュースアイテム = {
	          	//記事のタイトルを取得します。タイトル: $('h4').text().trim(),
	        	//iは取得された記事の数を決定するために使用されます i: i = i + 1、     
	      	};
	    console.log(news_item); //情報を印刷 var news_title = $('h4').text().trim();
		
	  	savedContent($,news_title); //各記事の内容とタイトルを保存します		
	  	savedImg($,news_title); //各記事の画像とタイトルを保存する		
	  	//アクセスが完了していない場合はアクセスを続行します if (urlList.length!=0) {
	    	urlList をフェッチします。
	  	}
	});
}).on('エラー', 関数 (err) {
    コンソールログ(エラー);
  });
 }
}
       //この関数はクロールされたテキストコンテンツリソースをローカルに保存します function savedContent($, news_title) {
	$("div.t2[style].tpc_content.do_not_catch").each(関数(インデックス、項目) {
          var x = $(this).text();       
          x = x + '\n';   
		  // ニュースのテキストコンテンツを /data フォルダに少しずつ追加し、ニュースのタイトルをファイルに付けます fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function (err) {
			  もし(エラー){
			    コンソールログ(エラー);
			  }
		  });
		})
 }
//この関数はクロールされた画像リソースをローカルに保存します function savedImg($,news_title) {
  //フォルダーを作成する fs.mkdir('./image/'+news_title, function (err) {
        if(err){console.log(err)}
      });
  $('.tpc_content.do_not_catch input[src]').each(関数(インデックス、項目) {
        var img_title = index; //各画像に番号を追加します var img_filename = img_title + '.jpg';
        var img_src = $(this).attr('src'); //画像のURLを取得する
//リクエストモジュールを使用して、画像リソースを取得するためのサーバーへのリクエストを開始します request.head(img_src,function(err,res,body){
  もしエラーが起きたら
    コンソールログ(エラー);
  }
});
setTimeout(関数(){
  リクエスト({uri: img_src, エンコーディング: 'binary'}, 関数(エラー, レスポンス, 本文) {
    if (!エラー && response.statusCode == 200) {
      fs.writeFile('./image/'+news_title+'/' + img_filename, body, 'binary', function (err) {
        if(err){console.log(err)}
      });
    }
  })
});
})
}
fetchPage(url); //メインプログラムの実行が開始されます

結果:

ここに写真の説明を記入してください

これで、node.js で簡単なクローラーを作成する方法についての記事は終了です。node.js で簡単なクローラーを作成する方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • node.js クローラー フレームワーク node-crawler の初体験
  • Node.js クローラーで天気と日々の挨拶を取得する方法
  • Cheerio をベースにした node.js クローラーツールの実装 (ログイン権限が必要なクローラーツール)
  • node.js ベースのクローラー実装の説明
  • Node.js 学習ノート: koa フレームワークと簡単なクローラー演習
  • Node.jsクローラーを使用してウェブサイトのデータをクロールする方法を教えます
  • Node.js は Cheerio を使用してシンプルな Web クローラーの例を作成します
  • Node.jsクローラーのWebページリクエストモジュールについての簡単な説明

<<:  Dockerfile を使用して Docker イメージをカスタマイズする方法

>>:  MYSQLデータベーステーブル構造の最適化方法の詳細な説明

推薦する

HTML テーブルタグチュートリアル (20): 行の背景色属性 BGCOLOR

BGCOLOR 属性を使用して、行の背景色を設定できます。基本的な構文<TR BGcolor...

CSS トップに戻る コード例

最近のウェブサイトのほとんどはページが長く、4 画面または 5 画面の長さのものもあれば、2 画面ま...

Vue 天気予報入門

この記事では、参考までに天気予報を実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

CentOS7 に MySQL データベースをインストールしてデバッグする詳細な手順 [例]

この例では、デバッグ用の MySQL データベースをダウンロードしてインストールする必要があります。...

Reactでカスタムフックを作成する方法を教えます

1. カスタムフックとは何かロジックの再利用簡単に言えば、カスタム フックを使用すると、特定のコンポ...

Vue サーバーに js 構成ファイルをインポートする方法

目次背景成し遂げるvue-cli2.0での設定方法の補足要約する背景プロジェクトにはローカル構成ファ...

MySqlデータベースの基礎知識のまとめ

目次基本的なデータベース操作2) データベースを表示する3) データベースを選択する4) データベー...

html-cssタグのスタイル設定が機能しない2つの理由

1 セミコロン「;」のない CSS スタイル2 タグが閉じられておらず、「>」がありません...

MySQL 5.7.16 ZIP パッケージのインストールと設定のチュートリアル

この記事では、MySQL 5.7.16 ZIPパッケージのインストールと設定のチュートリアルを参考ま...

MySQL Installer Community 5.7.16 インストール詳細チュートリアル

この記事では、MySQL インストールの詳細なチュートリアルを記録し、全員と共有します。 1. バー...

MySQL 5.7.17 無料インストールバージョンの設定方法グラフィックチュートリアル (Windows10)

1. 概要ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージ...

ウェブページ作成時に標準 HTML コードを使用する際のポイント

多くの Web サイト デザイナーが犯す最も一般的な間違いは、Web ページが IE で正常に表示さ...

Reactスロットの使い方

目次必要コアアイデアReactでスロットを実装する2つの方法必要コンポーネントを自分で書きました。コ...

XHTML 入門チュートリアル: テーブルタグの応用

<br />テーブルは XHTML では扱いにくいタグなので、このセクションで理解するだ...

MySQL 5.5 で範囲パーティションを追加および削除する例

導入RANGE パーティション分割は、指定された連続した間隔範囲に基づいています。RANGE の初期...