node.jsによるWebページの読み込みと情報の抽出

January 28, 2017 – 3:40 pm

JavaScriptを基本から学習することにし,いろいろ試しているところ。習うより慣れろということで具体的にプログラミングすることにした。

手始めに、表題の「node.js によるWebページの読み込みと情報の抽出」を例としてトレーニング、具体的には、日経電子版速報のページを読み込み、これからニュースのタイトルを抽出するプログラムを書いてみた。

個人的なメモとして作成したJavaScriptのソースをmemoしておいた。

情報抽出のためのJavaScriptソース read_extract.js:

  var http = require('http');

  var strng='';

  var re_top = /<:div class=\"l-header_date\">:(\d*)年(\d*)月(\d*)日.*<:\/div>:/;
  var re01 = /<:a href=\"\/([^<:]+)\/\">:<:span class=\"cmnc-middle\">:([^<:]+)<:\/span>:<:\/a>:/;
  var re02 = /<:a href=\"\/([^<:]+)\/\">:<:span class=\"cmnc-small\">:([^<:]+)<:\/span>:<:\/a>:/;
  var re_t = /<:span class=\"cmnc-time\">:((\d*日 )?(\d*:\d*).*)<:\/span>:/

  var re01g = new RegExp( re01, 'g' );
  var re02g = new RegExp( re02, 'g' );
  var re_tg = new RegExp( re_t, 'g' );

  var myArray_01=[];
  var myArray_02=[];
  var myArray_t =[];

  var Array_out = [];

  var url= 'http://www.nikkei.com/news/category/';
  //var url= 'http://www.nikkei.com/news/category/?bn=881';

  http.get( url, function(res) {
     res.on('data', function(chunk) {
       strng += chunk;
     });
     res.on('end', function() {

         strng.match(re_top);
         var year  = RegExp.$1;
         var month = RegExp.$2;
         var day   = RegExp.$3;

         var myArray_01 = strng.match(re01g);
         var myArray_02 = strng.match(re02g);
         var myArray_t  = strng.match(re_tg);
         if( myArray_t ) var len = myArray_t.length;
         else len = 0;
         if( myArray_01 ) var len01 = myArray_01.length;
         else len01 = 0;
         if( myArray_02 ) var len02 = myArray_02.length;
         else len02 = 0;
         if ( len != len01+len02 ) return; 
         for (var i=0; i<:len; i++) {
             Array_out[i] = [];
             myArray_t[i].match(re_t);
             time_entry = RegExp.$2;
             if ( RegExp.$1 != '' ) {
                      RegExp.$1.match(/(\d*)日/);
                      day = RegExp.$1;
             }

             var datepubl = year +'-';
             if( month <: 10 ) datepubl += '0'+month +'-';
             else datepubl += month +'-';
             if( day <: 10 ) day += '0'+day;
             else datepubl += day;

             time_entry.match(/(\d*):(\d*)/);
             var hh = RegExp.$1;
             if( hh <: 10 ) hh = '0'+ hh;
             var mm = RegExp.$2;
             var time_entry = hh + ':' + mm;
             Array_out[i][0] = datepubl + ' ' + time_entry;

             if( i <: len01 ) myArray_01[i].match(re01);
             else        myArray_02[i-len01].match(re02);

             Array_out[i][1] = 'http://www.nikkei.com/' + RegExp.$1;
             Array_out[i][2] = RegExp.$2;

             console.log( Array_out[i][0] );
             console.log( Array_out[i][1] );
             console.log( Array_out[i][2] );
         }                 
     });
  });

一応、上記ソースはnodeの環境下で動作することを確認した。

以下、出力例:

# node read_extract.js
2017-01-23 10:24
http://www.nikkei.com/article/DGXLASGM23H24_T20C17A1EAF000
韓国特別検事、梨花女子大前総長の逮捕状請求
2017-01-23 10:21
http://www.nikkei.com/article/DGXLASS0ISS12_T20C17A1000000
東証10時、下げ幅を縮小 押し目買い、米政策は引き続き警戒
2017-01-23 10:20
http://www.nikkei.com/article/DGXLASGM23H18_T20C17A1MM0000
トランプ米大統領、イスラエル首相と2月に会談へ
2017-01-23 10:20
http://www.nikkei.com/article/DGXLASS0IMF03_T20C17A1000000
外為10時 円、続伸 113円台後半、ユーロは対ドルで上げ幅拡大
2017-01-23 10:18
http://www.nikkei.com/article/DGXLASGM23H22_T20C17A1000000
英国女性の禁錮刑確定 イラン裁判所、控訴棄却
2017-01-23 10:15
http://www.nikkei.com/article/DGXLASGM23H1Z_T20C17A1000000
NZ首相「TPP、代替案に取り組んでいる」
2017-01-23 10:06
http://www.nikkei.com/article/DGXLASDJ23H08_T20C17A1000000
ドバイ原油・23日午前、続伸 53.70ドル前後
2017-01-23 10:04
http://www.nikkei.com/article/DGXLASGM23H0Q_T20C17A1EAF000
仏大統領選の左派予備選、前教育相と前首相が決選投票に
2017-01-23 10:04
http://www.nikkei.com/article/DGXLASQ7IAB01_T20C17A1000000
商品9時30分 原油が続伸 ガソリンは反発 金は反落
2017-01-23 10:02
http://www.nikkei.com/article/DGXLASGM23H0T_T20C17A1MM0000
トランプ米大統領、NAFTA再交渉開始を表明
2017-01-23 10:00
http://www.nikkei.com/article/DGXLASGM23H0C_T20C17A1000000
ブルガリア新大統領が就任 解散総選挙の意向
2017-01-23 09:59
http://www.nikkei.com/article/DGXLASGM23H0E_T20C17A1000000
ローマ法王、欧米のポピュリズムに警鐘
2017-01-23 09:58
http://www.nikkei.com/article/DGXLASGM23H0A_T20C17A1000000
ミサイル試験で失敗隠しか 英政府、下院投票を前に
2017-01-23 09:37
http://www.nikkei.com/article/DGXLASFS23H06_T20C17A1EAF000
天皇退位の有識者会議、午後に論点整理公表へ
2017-01-23 09:35
http://www.nikkei.com/article/DGXLSSXK10047_T20C17A1000000
石川は50位、スワフォード初優勝 米男子ゴルフ
2017-01-23 09:31
http://www.nikkei.com/article/DGXLASFL23H7J_T20C17A1000000
大和、SBIと確定拠出年金で資本業務提携 子会社株を取得
2017-01-23 09:25
http://www.nikkei.com/article/DGXLASS0ISS11_T20C17A1000000
東証寄り付き、反落で始まる トランプ演説後円高、下げ幅200円超
2017-01-23 09:10
http://www.nikkei.com/article/DGXLASFL23H73_T20C17A1000000
日経平均、反落して始まる 下げ幅一時200円超、円高進行が重荷
2017-01-23 08:49
http://www.nikkei.com/article/DGXLASS0IMF01_T20C17A1000000
外為8時30分 円が続伸、113円台に上昇 対ユーロは反発
2017-01-23 08:30
http://www.nikkei.com/article/DGXLSSXK10022_T20C17A1000000
武藤が4カ月ぶり復帰、大迫・酒井宏らフル出場 欧州サッカー

プログラミングの詳細はいつか解説の予定。

因みに、日経さんには何のことわりもしてないので、ご注意。


Post a Comment