サイバー法研究会

HTMLに関するFAQ

(文責 : 岡村久道,小松 弘,白田秀彰,夏井高人,養老真一)


<注 意>

 これは,サイバー法研究会のメーリングリストで情報交換されたノウハウ等の一部を,夏井の責任においてFAQ形式に編集したものです。

 プログラム等については,実行環境の相違その他の原因によって所期の動作をしないこともありますので,ご注意ください。


Q 特定のURLが最後に更新された日付を調べる方法を教えてください。

A−1−1(プログラムの作成による場合1)

  いわゆる「ホームページへのアクセス」というのは,「HTTPサーバにGETコマンドを送り付ける」ということですが,GETに対してサーバは、HTMLの本文を送る前に,ヘッダとして次のような情報を返してきます。

HTTP/1.0 200 OK
Date: Sun, 9 Jan 1998 21:15:05 GMT
Server: NCSA/1.3
MIME-version: 1.0
Content-type: text/html
Last-Modified: Sun, 9 Jan 1998 21:15:03 GMT
Content-lengh: 1144

 電子メールのヘッダに似たようなものです。このうち,Last-Modified:というのがアップロードの日時です。HTMLの中にそのHTMLの作成者が任意に書き込んだ作成日付とは関係ありません。

 このヘッダの情報を獲得するためには,UNIX か Windows-NT の環境で、Perl 5.004 以上がインストールされていれば,LWP という WWW 関係のライブラリがあるので,これを使用します。

 次のような正味 15 行のコードで OK です。

use HTTP::Status;
require LWP;
require LWP::UserAgent;

$ua = new LWP::UserAgent;
$ua->agent("LWP::GETHEAD");
$url = $ARGV[0];
$request = new HTTP::Request HEAD => $url;
$response = $ua->request($request);

print "Content-Type:\t", $response->header("Content-Type"),"\n";
print "Content-Length:\t", $response->header("Content-Length"),"\n";
print "Last-Modified:\t", $response->header("Last-Modified"),"\n";
print "Expires:\t", $response->header("Expires"),"\n";
print "Server: \t", $response->header("Server"),"\n";

getprint ($url);

 このプログラムを実行すると,たとえば,次のような結果を得ることができます。

> F:\Home >perl myget.pl http://leo.misc.hit-u.ac.jp/hideaki/indexj.htm
> Content-Type: text/html
> Content-Length: 18439
> Last-Modified: Sun, 13 Sep 1998 08:59:12 GMT
> Expires:
> Server: Microsoft-PWS/2.0
> <HTML> <HEAD> <title>Research Papers of Hideaki Shirata</title> <META name="desc
> ription" content="Full text articles on History of Copyright in England and Cybe
> rlaw in America, written in Japanese."> </HEAD> <BODY BGCOLOR="#ffffff" LINK="#0
> 000ff" VLINK="#ff0000" ALINK="#ff0000" TEXT="#000000">
>
> <center>

 また,出力結果を分かりやすく表示するためのプログラムとして,次のようなプログラムも考えることができます。

use LWP::Simple;
use HTTP::Status;
require LWP;
require LWP::UserAgent;

$ua = new LWP::UserAgent;
$ua->agent("LWP::GETHEAD");
$url = $ARGV[0];
$request = new HTTP::Request HEAD => $url;
$response = $ua->request($request);

print "Url=\"$url\"\, Date=\"";
print $response->header('Last-Modified');
print "\"\n";

 このプログラムを実行すると,たとえば,次のような結果を得ることができます。

> Url="http://otohime.comrover.or.jp", Date="Mon, 28 Oct 1996 15:00:00 GMT"

 これを、たとえば、myhead.pl というファイル名でセーブして,DOS 窓から,引数に URL を入れて起動すると,標準出力にヘッダーと HTML本体が表示されます。リダイレクトでファイルに落とすこともできます。Winsock とか,そういうややこしいことは何にもしなくて OK です。全部 Perl がやってくれます。電話でプロバイダにコールアップしておいてから,コマンドを起動するだけです。

 なお,Perl については,とりあえず,

CPAN
http://www.rarf.riken.go.jp/archives/lang/perl/CPAN/CPAN.html

にあります。Windows95上(というより正確にはwin32上)で動作するJperl for WIN32 の最新版(perl 5.003ベースです。)は,

http://www.yk.rim.or.jp/~hizumi/perl/index.html

を御覧下さい。

 

A−1−2(プログラムの作成による場合2)

 以下は,javaの参考書を見て書いたHeader情報を取得するプログラムです。ただし,debugも何もしていません。httpのポートが80であることも前提にしています。

 第一引数にホスト名,第2引数にファイル名を絶対パスで指定すると,ヘッダ情報を出力します。

java header www.law.osaka-u.ac.jp /index.html

import java.net.*;
import java.io.*;
public class header{
  public static void main(String arg[]) {
    Socket sock=null;
    String host;
    String file;
    host="www.law.osaka-u.ac.jp";
    file="/index.html";
    if (arg.length >=2 ) {
      file=arg[1];
    }
    if (arg.length >=1) {
      host=arg[0];
    }
    try{
      sock =new Socket(host,80);
    }
    catch (UnknownHostException e) {
      System.out.println("Cannot find host");
      System.exit(1);
    }
    catch (IOException e) {
      System.out.println("Error connecting to host");
      System.exit(1);
    }
    try{
      InputStream in=sock.getInputStream();
      OutputStream out=sock.getOutputStream();
      PrintStream pout=new PrintStream(out);
      pout.print("HEAD "+file+" HTTP/1.0\n\n");
      DataInputStream din=new DataInputStream(in);
      while(true) {
        String resp=din.readLine();
        if (resp==null) break;
        System.out.println(resp);
      }
      sock.close();
    }
    catch (IOException e) {
    }
  }
}

このヘッダ取得プログラムのperl版です。perlのラクダ本のサンプルプログラムほとんどそのままです。

socket interfaceを実装しているperlなら、動作するはずです。(perl for win32で動作確認を一応しました。)

ヘッダの取得はwgetでできるとの事ですので、あまり意味はないかもしれませんが,参考になれば幸いです。

使い方はjava版と同じで,第一引数にホスト名,第2引数にファイル名を絶対パスで指定すると,ヘッダ情報を出力します。

例:

perl head.pl www.center.osaka-u.ac.jp /index.html

 

use Socket;
($them,$file)=@ARGV;
$file='/' unless $file;
$them='www.isc.meiji.ac.jp' unless $them;

$port=80;
$proto=getprotobyname('tcp');

$port=getservbyname($port,'tcp')
  unless $port =~ /^\d+$/;;

$that=sockaddr_in($port,inet_aton($them));

if (socket(S,PF_INET,SOCK_STREAM,$proto)) {
#   print "socket ok\n";
} else {
  die $!;
}

if (connect(S,$that)) {
#   print "connect ok\n";
} else {
  die $!;
}

select(S); $|=1;select(STDOUT);

print S "HEAD ",$file," HTTP/1.0\n\n";
while(<S>) {
  $line.=$_;
}
close(S);
print $line;

A−2−1(既存のツールを利用する場合1)

GUI 環境でホームページの更新情報を取得できるツールがあります。WGET と合体させると,より強力です。WIN32 環境で使えるフリーウェアです。NT 4.0では、動作を確認しました。便利です。

WWWC v0.93 URL: http://www.kinet.or.jp/naka/tomo/wwwc.html 

A−2−2(既存のツールを利用する場合2)

 リンク先ページの更新日時を取得するツールというのがあるようです。詳細は,次のURLをご覧下さい。

http://nit.nikkeibp.co.jp/column/19980904/

 


Last Modified : Nov/12/1998