ホーム >  JavaScript >  node.jsでwebページのダウンロード


Posted:2016/11/14 9:00:15 AM|Category : JavaScript

node.jsでwebページのダウンロード

node.jsを利用してwebページのダウンロードしてみます。

node-js-736399_640

webページのダウンロード

Webページは基本的に「名前をつけて保存」でダウンロード可能ですが、複数のページをいちいち開いてダウンロードするのは面倒です。node.jsを使って複数のページを一括ダウンロードしたり、繰り返しダウンロードします。これを自作プログラムで実行します。

※以下の書籍を参考にしています。

準備

①vagrantインストール済みです。

Vagrantをインストールしてテスト環境を作る for Ubuntu

②NVMとNode.jsもインストール済みです。

NVMを使用してNode.jsをインストールする

※もしvagrant1.8.5でエラーが発生する場合はアップグレードしましょう。

Vagrant 1.8.6にアップグレードしてvagrant sshのバグを解決

③コードの記述に便利です。

atomをUbuntuにインストールする

私の環境

ホストOS Ubuntu 14.04.4 LTS 64bit
ゲストOS CentOS7 64bit
CPU Core i5 2520M 2.50GHz
vagrant 1.8.6

実行

①以下のコードを記述し、保存します。

//urlにあるファイルをダウンロードする

//ダウンロード元URLの指定
var url = "http://kujirahand.com";
//保存先のパス
var savepath = "test.html";

//利用モジュールの取り込み
var http = require('http');
var fs = require('fs');

//出力先を指定
var outfile = fs.createWriteStream(savepath);

//非同期でURLからファイルをダウンロード
http.get(url, function(res){
  res.pipe(outfile);
  res.on('end', function () {
    outfile.close();
    console.log("ok");
  });
});

var http = require(‘http’);、var fs = require(‘fs’);
「require()」は、外部ライブラリ・モジュールを参照します。
「require(‘http’)」はhttpプロトコルの機能を持つ「http」モジュールを取り込みます。

var outfile = fs.createWriteStream(savepath);
「fs.createWriteStream()」は、出力先を指定します。

http.get(url, function(res){・・・
「http.get()」は、指定のURLにアクセスします。

function(res){}
「http.get()」の第2引数で、コールバック関数を指定します。node.jsは非同期処理のため、処理の完了まで待つのではなく、処理が完了した際にコールバック関数で通知します。戻り値は、http.ClientRequestのインスタンスが返されます。

res.pipe(outfile);
ダウンロードしたデータをファイルに保存するよう指定を行います。保存の指定のみで、保存は完了していません。

res.on(‘end’, function () {}
ダウンロード完了後、「end」で指定した関数が実行されます。サーバからのレスポンスを取得するにも時間がかかるため、処理が完了した時に改めてコールバック関数で通知します。

②保存したファイルを、vagrantの共有フォルダに「download-node.js」を配置します。ホストのsrcディレクトリに配置すると、ゲストOSのgit_clonerディレクトリに反映されます。

・ホストOS(ubuntu)側

  • home/
  • user/
  • vagrant/
  •  src/
  • download-node.js

・ゲストOS(centos7)側

  • home/
  • vagrant/
  • git_cloner/
  • download-node.js

③以下の手順でコマンドを入力し、vagrantの仮想環境にログインします。

cd vagrant
vagrant up
vagrant ssh

④以下の手順でコマンドを入力し、「download-node.js」を実行します。成功すれば「OK」と表示されます。

node download-node.js
OK

⑤以下のコマンドを入力し、ファイルの詳細一覧を見てみましょう。

ll test.html

ll コマンド  ls -lと同じ

ls コマンド  自分がアクセスしているディレクトリ内のファイル一覧を表示する

-l コマンド  詳細情報を表示する

ブラッシュアップ

プログラムをブラッシュアップします。「青空文庫」からHTMLファイルをダウンロードします。

①以下のコードを記述し、保存します。

download(
  "http://www.aozora.gr.jp/index_pages/person81.html",
  "miyazawakenji.html",
  function(){ console.log("ok, kenji."); });
download(
  "http://www.aozora.gr.jp/index_pages/person148.html",
  "natumesouseki.html",
  function(){ console.log("ok, soseki."); });

//urlをsavepathにダウンロードする関数
function download(url, savepath, callback) {
  var http = require('http');
  var fs = require('fs');
  var outfile = fs.createWriteStream(savepath);
  var req = http.get(url, function(res){
    res.pipe(outfile);
    res.on('end', function () {
      outfile.close();
      callback();
    });
  });
}

②保存したファイルを、vagrantの共有フォルダに「download-node-func.js」を配置します。そしてvagrantの仮想環境にログインします。

③以下の手順でコマンドを実行します。成功すれば「OK, soseki. OK, kenji.」と表示されます。

node download-node-func.js
ok, kenji.
ok, soseki.

実際にダウンロードされるもの

「青空文庫」からHTMLファイルをダウンロードしますが、HTML本体ではなく「リダイレクトするように」との指示が書かれたhtmlファイルがダウンロードされます。Webブラウザであれば自動的にリダイレクトされますが、node.jsではされません。

実際にダウンロードするには、サーバからのレスポンスを調べてリダイレクトするようにプログラムを書き換える必要があります。


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 2008年04月 金融機関系I

最近の投稿
人気記事
カテゴリー
広告