動機

Webから情報を得て、その情報を再加工したいことは良くあると思います。私は、以下のようなプログラムを用意して利用しています。
  • 「毎朝6時に、Yahoo天気予報から厚木の天気を調べ、今日または明日雨が降る予報だったら、携帯電話にメールをする」プログラム(リンク)
  • 「毎週火曜日に、テレビ番組表からテレビで放映する映画を調べ、携帯電話にメールをする」プログラム(リンク)
  • 「本に付いたバーコードを読み込ませ本を識別し、Webからこの本のタイトル、著者名、値段などを調べる」プログラム(*1)
  • 必要な情報をまとめて持ってくる(著者情報を取得するときに)(リンク)
(*1)経費で本を買うと、定型のフォーマットに必要な情報を買わないといけません。これを自動で埋めてくれるソフトです。

Webから情報を得る

[データの入手]

まず、WebにあるHTMLファイルを取得しなければいけません。

データの入手方法は、簡単です。wgetコマンドを使って、URLを指定するだけです。

wget [URL]

本学の環境ではProxyを設定しないといけません。そのため、以下のように環境変数にProxyの情報を与え、実行してしまうと良いでしょう。

http_proxy='http://プロキシーサーバ名' wget [URL]

Webから取り出した情報をプログラム中で利用する

[プログラムでの利用]

C言語で入出力の説明で、標準入力から入力し、標準出力へ出力し、という説明を聞いたかと思います。 なぜ、キーボードから入力しとか、画面へ出力しではなかったのでしょうか。これは、C言語では、入力も出力もファイルなのです。 そしてそのファイルが、標準入力と標準出力なのです。そしてそれがデフォルトで、キーボードが標準入力、画面が標準出力になっているのです。 ファイルへの入出力と抽象化されているため、C言語(Unix)では非常にプログラムが作りやすくなっています。

同様にネットワークの入出力もファイルとして抽象化されています。そのため、Webから取得した情報も、ファイル操作として扱うことができます。

Perlを例に、Webから得た情報をファイルとして扱うためには以下のようにします。

open(IN, "http_proxy='http://プロキシーサーバ名' wget -O - -o /dev/null [URL]|");

このサンプルプログラムでは、INというファイル識別子を与えてファイルを開いています。

wgetにたくさんオプションが付いていますが。それぞれ以下のような意味です。

  • 「-O -」取得した情報を指定されたファイル名に保存する。ここでは「-」という特殊なファイル名を指定している。「-」を指定すると、標準出力へ出力される
  • 「-o /dev/null」情報を取得したときの実行結果は、標準エラーに出力される。この標準エラーの出力先を指定している。「/dev/null」は何も無い仮想のファイルで、ここに出力すると、出力結果が捨てられる
最後に「|」が付いているのを見落とさないでください。これで、wgetが出力した結果をパイプで、次のコマンドにつなげています。 この場合はファイル識別子INで、情報が取得できるようにしています。

実行例

天気予報のプログラム(リンク)で、プログラムを完全に公開していますので、それを見ると参考になるでしょう。 この天気予報のプログラムは長いのですが、ほとんどが携帯電話用に見た目をきれいにするコマンドです。 大事なところは非常に短いプログラムです。