準備
プロジェクトを作成する準備が完了したので、プロジェクトの作成を始めましょう。
武漢大学コンピュータサイエンス学部ニュースクローラーコード以下は武漢大学コンピュータサイエンス学院のニュースのクローラーコードです。作成した.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データベーステーブル構造の最適化方法の詳細な説明
最近、Textrea に転送したときに、データが本当に行ごとに保存できるかどうかという問題に遭遇しま...
webpack-dev-server コアコンセプトWebpack の ContentBase と ...
概要データベースは通常、複数のトランザクションを同時に実行します。複数のトランザクションが、同じデー...
MySQL データベースがエラー 1045 (28000): ユーザー 'ODBC'...
目次1. 応答原理の基盤2. コアオブジェクト: Dep と Watcher 3. 依存関係を収集し...
IE6 は PNG の透明度をサポートしていないと多くの人が言っています。実際、IE は 100%...
Dockerコンテナ接続1. ネットワークポートマッピングPythonアプリケーション用のコンテナを...
Nginx は同じドメイン名で構成されており、http と https の両方でアクセスできます。証...
以前、MySQL クエリ文の実行プロセスについての記事がありました。ここでは、更新文の実行プロセスを...
目次非同期を理解するフェッチ(url)レスポンス.json() asyncとawaitを組み合わせる...
404 を避けるべきだとどうして言えるのでしょうか? その理由は、ほとんどの 404 ページが粗雑す...
この記事では、例を使用して MySQL トリガーの簡単な使用方法を説明します。ご参考までに、詳細は以...
JPQL は Java Persistence Query Language の略です。 Java ...
目次1. Centosイメージを取得する2. nginxイメージをビルドする3. MySQLイメージ...
目次1. ReactJS の紹介2. ReactJSの理解とReactJSの利点1. ReactJS...