準備
プロジェクトを作成する準備が完了したので、プロジェクトの作成を始めましょう。
武漢大学コンピュータサイエンス学部ニュースクローラーコード以下は武漢大学コンピュータサイエンス学院のニュースのクローラーコードです。作成した.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 です。
テキストリソース: 画像リソース: Caoliu テクノロジーフォーラムクローラー武漢大学のニュースをクロールしても満足できなかったので、Caoliu の技術ディスカッション フォーラムをクロールしてみました (もちろん、皆さんが理解していることもいくつかクロールできます)。いくつかの問題が発生しました。 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Dockerfile を使用して Docker イメージをカスタマイズする方法
>>: MYSQLデータベーステーブル構造の最適化方法の詳細な説明
テーブルヘッダーでは、暗い境界線の色を個別に定義できます。基本的な構文<TH 境界線の色を暗く...
この記事では、Echartsを使用して3次元棒グラフを実装するVueの具体的なコードを参考までに共有...
目次1. 即時フィードバック1.1 ボタンからの即時フィードバック1.2 継続的なフィードバック1....
この記事では、適切な形式を使用して IP アドレス データをデータベースに保存し、IP アドレスを簡...
序文ヒント: ここで、この記事に記録するおおよその内容を追加できます。例えば、人工知能の継続的な発展...
目次1. 挿入のいくつかの構文1-1. 通常の挿入文1-2. 挿入または更新1-3. 挿入または交換...
目次MySQL 結果のソート - 集計関数環境クエリ結果の並べ替えクエリのグループ化と集約生徒の平均...
コンテナの起動時に Docker コンテナ内のアプリケーション サービスを自動的に起動する場合。 D...
前のセクションでは、コンテンツ、サーバー、JavaScript、CSS など、Web サイトのパフォ...
この記事では、画像を読み込むためのJavaScriptキャンバスの具体的なコードを参考までに紹介しま...
Web ページでは、基本的に <input type="file">...
CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...
データ ボリューム コンテナーは、データ ボリュームをマウントするために特別に使用されるコンテナーで...
序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...
目次序文異なるコンピュータ上の 2 つの Node.js プロセス間の通信TCPソケットの使用HTT...