情報アイランド

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

Node.jsでRequestを使ってWebサイトからテキストデータを取得する

2016/08/15

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

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

  • http(s)
  • request

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

テキストデータの取得

Webサイトからテキストデータを取得するにはrequest関数を使用します。

var request = require('request');

request('xxx', function (err, res, data) {
});
//or
request({
    url: 'xxx', 
    encoding: null
}, function (err, res, data) {
});

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

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

単純にWebサイトからデータを取得するのに重要なオプションには下のようなものがあります。

  • url・・・URLです。
  • uri・・・urlと同じです。
  • encoding・・・データの文字コードです。nullを指定します。

第2引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトであり、第2引数はHTTP(S)レスポンスを表すhttp(s).IncomingMessageクラスのインスタンスであり、第3引数はWebサイトから取得したデータです。このデータは文字列又はバッファとなります。オプションのencodingnullを指定した場合にはバッファとなります。

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

また、http(s).IncomingMessage.headersにHTTP(S)レスポンスヘッダがオブジェクトとして格納されています。ヘッダのフィールド名がプロパティ名となり、フィールドの値がプロパティの値となります。

そして、ヘッダのContent-TypeフィールドにHTTP(S)レスポンスボディのデータのMIMEタイプが格納されています。

このフィールドが存在する場合にはmimelib.parseHeaderLine関数を使ってMIMEタイプをパースし、文字コードを取得します。

また、iconvLite.decode関数を使用してこの関数の第3引数のデータの文字コードをUTF-8に変換します。

ただし、HTTP(S)レスポンスヘッダから文字コードを取得することができなかった場合にはjschardet.detect関数を使用してデータの文字コードを判定します。

これにより、Webサイトのデータをテキストデータとして取得することができます。

サンプルコード1

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

データの文字コードがiconv-liteモジュールがサポートしていないものである場合にはエラーとします。

request-text.js

var request = require('request');
var mimelib = require('mimelib');
var jschardet = require('jschardet');
var iconvLite = require('iconv-lite');

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

request({
    url: process.argv[2], 
    encoding: null
}, function (err, res, data) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        if (res.statusCode === 200) {
            var encoding = undefined;
            if (res.headers['content-type'] !== undefined) {
                encoding = mimelib.parseHeaderLine(res.headers['content-type']).charset;
            }
            if (encoding === undefined) {
                encoding = jschardet.detect(data).encoding;
            }
            if (encoding !== undefined && iconvLite.encodingExists(encoding)) {
                console.log(iconvLite.decode(data, encoding));
            }
            else {
                console.error('can\'t detect encoding.');
                process.exit(1);
            }
        }
        else {
            console.error('can\'t process.');
            process.exit(1);
        }
    }
});

使用パッケージ

実行結果

下ではHTMLドキュメントをテキストデータとして取得しています。

C:\work\node>node request-text.js http://www.archives.pref.fukui.jp/fukui/07/zusetsu/D01/D011.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML lang="ja">
<HEAD>
<META name="GENERATOR" content="IBM HomePage Builder 2001 V5.0.2 for Windows">
<TITLE>図説福井県史 近代1 維新と民衆(1)</TITLE>
<STYLE type="text/css">
<!--
TABLE{
  font-size : 9pt;
  line-height : 1.5em;
}
-->
</STYLE>
</HEAD>
<BODY bgcolor="#ecead7" text="#666666" link="#009900" vlink="#006666" alink="#99ff00">
<CENTER>
<TABLE width="760">
  <TBODY>
    <TR>
      <TD colspan="2" style="font-size : 16pt;font-weight : bold;color : #476b55;font-family : HG丸ゴシックM-PRO;">1 維新と民衆(1)</TD>
    </TR>
    <TR>
      <TD style="font-size : 11pt;line-height : 1.7em;" width="547"> 1871年(明治4)7月、廃藩置県が行われ、越前と若狭には旧藩の名称を引き継ぐ合計10県の管轄地が置かれました。しかし、それらは11月に至り、福井県(すぐに足羽県と改称)と敦賀県という2つの大きな県に統合されます。このとき、江戸時代の細分化した領地支配の枠組みを取り払い、地域的にまとまりをもった新しい統治体制が築かれたのです。<BR>
      <BR>
       これがさらに73年に入ると、足羽県を併合するかたちで敦賀県の拡大が図られ、地域社会では新政策の徹底がより強く求められることになりました。そして、敦賀県政の発足を契機に、旧来の生活様式の改編・刷新を訴える政府や県と、これに不満や憤りを抱く地域住民との対立がにわかに表面化したのです。<BR>
      </TD>
      <TD valign="top" width="197"> <IMG src="d011zus.gif" width="173" height="160" border="0" align="top" alt="騒動による受刑者の分布"><BR>
       ▲騒動による受刑者の分布<BR>
       「越前国大野外二郡暴動附和<BR>
       随行人罪案」(法務省図書館<BR>
       蔵)による。 <A href="D0111.htm">拡大図 39KB</A></TD>
    </TR>
    <TR>
      <TD style="font-size : 11pt;line-height : 1.7em;" width="547"> 73年3月、敦賀県の発足直後、大野郡で真宗門徒を中心とする大騒動がおき、その波紋がさらに今立郡、坂井郡へと広がりました。政府や県はこの事件を「暴動」とよび、当時の『撮要新聞』は「無知蒙昧」の徒が引きおこした「一揆」と報じました。騒動の引き金となったのは、政府(教部省)がすすめる教化政策にもとづく宗教の統制、つまり弱小な寺院を廃合し、従来の私的な説教を禁止するという措置でした。これに誰より不満をもった真宗の僧侶や門徒が事件を先導したのです。<BR>
      <BR>
       しかし、騒動に加わった多くの人びとは、宗教にかかわる事柄ばかりを問題にしていたのではありません。散髪の奨励や太陽暦の採用、新しい学校教育の開始など、地域住民の側からみれば一方的な新政策の押しつけに激しい憤りを抱いていたのです。大野郡では、政府の方針に従う寺院や学校、また散髪を行なう者などを「ヤソ」(江戸時代に禁制とされたキリスト教徒)とよんで、これらを忌みきらう風潮が広がっていました。それが、ついに「ヤソの退治」を名目にかかげて実力に訴えることになり、大野町を中心に建物の打ちこわしや放火などを行なったのです。<BR>
      <BR>
       この騒動には、政府や県によってたいへんきびしい弾圧が加えられました。拷問のすえに、首謀者として死刑に処せられた6名をはじめ、処分者の数は大野・今立・坂井・吉田の4郡で8000名にも達します。当然、拒んでいた新政策の実施も受諾を余儀なくさせられました。このように維新を推進する権力と旧習を墨守しようとする地域民衆とが直接ぶつかりあうことで、新しい時代の社会秩序がより明瞭に人びとの意識に広がっていったのです。</TD>
      <TD valign="top" width="197"> <IMG src="d0111.jpg" width="166" height="401" border="0" alt="村境の標識の書き換えを指示した敦賀県の布令"><BR>
       ▲村境の標識の書換えを指示し<BR>
        た敦賀県の布令<BR>
           敦賀市 那須伸一郎氏蔵</TD>
    </TR>
  </TBODY>
</TABLE>
</CENTER>
<P><STRONG><A href="../D00/D00.htm" style="font-size : 9pt;text-decoration : none;">←概観近代</A>/<A href="D012.htm" style="font-size : 9pt;text-decoration : none;">→次ページ</A></STRONG><STRONG>/</STRONG><A href="../indexzu.htm" style="text-decoration : none;font-size : 9pt;"><B>目次</B></A></P>
</BODY>
</HTML>

関連

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

-Node.js