情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでhttp(s)を使ってWebサイトからバイナリデータを取得する

2016/08/14

Webサイトからデータを取得するにはデータを取得したいURLに対してHTTP(S)のGETリクエストを送信しなければなりません。

これには下のようなモジュールを利用する方法があります。

  • http(s)
  • request

この記事ではhttp(s)モジュールを利用する方法を取り上げます。

バイナリデータの取得

HTTP(S)のGETリクエストを送信するにはhttp(s).get関数を使用します。

var http = require('http');

var client = http.get(process.argv[2], function (res) {
});

第1引数

第1引数にURLを指定します。

あるいは、URLの代わりにオプションをオブジェクトとして指定することもできます。

主なオプションには下のようなものがあります。

  • hostname・・・ホスト名又はIPアドレスです。デフォルトはlocalhostです。
  • port・・・ポート番号です。デフォルトは80です。
  • path・・・クエリ文字列を含むパスです。デフォルトは/です。
  • header・・・HTTPリクエストヘッダです。オブジェクトとして指定します。ヘッダのフィールド名をプロパティ名とし、フィールドの値をプロパティの値とします。

第2引数

第2引数にHTTP(S)コネクションが確立した時(正確にはHTTP(S)レスポンスヘッダの受信が完了した時)に呼び出される関数を指定します。この関数の第1引数はHTTP(S)レスポンスを表すhttp(s).IncomingMessageクラスのインスタンスです。このインスタンスはHTTP(S)レスポンスボディのデータを読み込むストリームでもあります。

http(s).IncomingMessage.statusCodeにHTTP(S)レスポンスのステータスコードが格納されています。このステータスコードが200の場合、データの取得が可能です。

返り値

返り値としてHTTP(S)クライアントを表すhttp(s).ClientRequestクラスのインスタンスが得られます。

タイムアウト時間

HTTP(S)クライアントのタイムアウト時間を設定するにはhttp(s).ClientRequest.setTimeout関数を使用します。

client.setTimeout(1000, function () {
});

第1引数にタイムアウト時間をミリ秒単位で指定します。

第2引数にタイムアウトが発生した時に呼び出される関数を指定します。

タイムアウトが発生した場合であっても、クライアントはそのまま動き続けます。

そのため、タイムアウトが発生した場合にはクライアントを強制終了しなければなりません

強制終了

HTTP(S)クライアントを強制終了するにはhttp(s).ClientRequest.abort関数を使用します。

client.abort();

クライアントが強制終了された場合にはクライアントのerrorイベントが発生します。

サンプルコード1

3つ目のコマンドライン引数として与えられたURLからバイナリデータを取得し、標準出力に出力します。

URLに応じてhttpモジュールとhttpsモジュールの何れか適切なものを使用します。

なお、ストリームの処理のためにconcatStream関数とpump関数を使用しています。

http-get-binary.js

var url = require('url');
var http = require('http');
var https = require('https');
var concatStream = require('concat-stream');
var pump = require('pump');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

var client = (url.parse(process.argv[2], false).protocol === 'https:' ? https : http).get(process.argv[2], function (res) {
    if (res.statusCode === 200) {
        var writable = concatStream(function (data) {
            console.log(data);
        });
        pump(res, writable, function (err) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
        });
    }
    else {
        console.error('can\'t process.');
        process.exit(1);
    }
});
client.setTimeout(10000, function () {
    console.error('timeouted.');
    client.abort();
});
client.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • concat-stream
    npm install concat-streamでインストールします。
  • pump
    npm install pumpでインストールします。

実行結果

下ではHTMLドキュメントをバイナリデータとして取得しています。

C:\work\node>node http-get-binary.js http://www.archives.pref.fukui.jp/fukui/07/zusetsu/D01/D011.htm
<Buffer 3c 21 44 4f 43 54 59 50 45 20 48 54 4d 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 2f 2f 44 54 44 20 48 54 4d 4c 20 34 2e 30 20 54 72 61 6e 73 69 ... >

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js