Buho No.214 目次

無限ダウンロード

〜世界の全てを手に入れる計画〜

ぱらぐらふ


0.  本計画の概要

0.1  無限ダウンロードとは?

無限ダウンロードとは、 HTML のリンクをたどって見つかるリソースを落としきろうという壮大な計画です。 本稿では、その無謀^H^H無限ダウンロードロボットを作成する際の 注意点について述べたいと思います。 ちなみに、以下の仕様のダウンロードロボットは現在制作中です (ただし完成時期は未定です)。

0.2  いまなぜ自作ロボットなのか?

窓の杜(http://www.forest.impress.co.jp/)や ベクター(http://www.vector.co.jp/)には 多数の「ホームページダウンロードプログラム」が掲載されています。 なぜこれらを利用するだけではだめなのでしょうか。 それは、

使えないから

です。 残念ながら、 本稿で挙げる「真のダウンロードロボット」の条件を 満たしているものは皆無といってよいでしょう。 そもそも作者が自分で使っているのかどうか怪しいものすらあります。 やはり自作するしかないのです。

0.3  専用線利用に関するこころゑ

専用線、あるいは準専用線環境の場合は 一日中ダウンロードしつづけることができます。 しかし、これはお薦めできません(というか禁止)。 特に太い回線の場合は相手方のホスト、 およびそこまでの経路にダメージを与える可能性があります。 so-net 相手とかなら一つの接続あたり 200KB/Sec くらい 軽く出してしまうような東京大学の回線の最上位付近にある某マシンとかを 利用すれば、弱小プロバイダを事実上機能停止に追い込んでしまうかもしれません。 とある会社でロボットを三つ並列動作させたところ、 周囲の LAN が檄重になったこともあります。 電話モデムより強力な回線を利用する時は、それなりの注意が必要です。

1.  前置き

1.0  前置きの前置き

1.0.1  真無限ダウンロードと限定無限ダウンロード

無限ダウンロードの本来の意味を尊重するならば、 ダウンロード先を限定してはいけません。 ですが本当に世界中のリソースを落としきることは不可能なので、 実際にはダウンロードするサイトを限定することになります。 日吉研の場合は電話モデムしか使えないうえに

テレホーダイすら使えない

ので、サイト の限定は死活問題となります。 1 1.0.2  と、ゆーわけで

本稿では『CG 描きさんのページをダウンロードする』 ことを主眼において説明します。 基本的にはそれぞれの CG 描きさんのルートページ以下のみを ダウンロードするか、 CG 描きさんのリンクページを指定して 『外部リンク最大 1 、内部リンク無限』設定でダウンロードすることになります。 そんなもん無限ちゃうわという意見もあるでしょうが :D

1.1  用語解説

以降に出てくる固有名詞や便宜上使用する用語の説明をします。 なお、もちろんですが HTML 3.2 の知識は前提とさせていただきます。

外部リンク/内部リンク

<A HREF=...><IMG SRC=...> で 指定されているリンクが現在とは違うサーバへのリンクだった場合を 便宜上『外部リンク』と呼ぶことにします。 同様に同じサーバでの相対指定リンクを『内部リンク』と呼ぶことにします。

同時接続数

TCP/IP では同時に多数ペアのソケット間で接続を行うことができます。 単一ファイルに対してのみ転送を行うと転送要求にかかる時間が無駄になったり 転送効率が落ちる(ある程度は多数のファイルを落とすほうが合計速度が上がる) ため、ダウンロードロボットは一般的に同時に複数のファイルに対して 転送を行います。 同時に何ファイル転送するかを便宜上『同時接続数』とします。

ルートページ

無限ダウンロードを行う最初のページのことを便宜上 『ルートページ』と呼ぶことにします。

上限ファイルサイズ

まちがって 50MB の .AVI ファイルとかを 落としはじめたりしないように設定するのが『上限ファイルサイズ』です。 同様に『下限ファイルサイズ』も設定できる必要があります(滅多に使いませんが)。

Macromedia Flash

米国 Macromedia 社が作成した HTML ブラウザ用プラグイン。 比較的容易に動きのあるホームページを作成できるため、 最近急速に普及しつつあります。 Windows 98 にプラグインが付属しているため見るだけなら無料ですが、 作成ツールは実売 38k くらいで市販されています。 ただし、30 日間無料試食版(機能限定なし/オンラインヘルプ完備)が http://www.macromedia.com/ で配布されています。 ……製品版、売れてるのかなぁ。

2.  巡回

2.1  巡回対象外指定

むげな^H^Hむげんダウンロードロボットは、 基本的に HTML ファイルのリンクタグをたどって ダウンロードを続けていく仕様になっています。 ですから以下のようなURL は巡回対象外にしないとまずいことになります。

サーチエンジン

最も頻繁にリンクが張られているけど最も不要(失礼)な URL は、 やはりサーチエンジンでしょう。 サーチエンジンのトップページを落とすくらいなら害はありませんが、 たいていサーチエンジンには「お薦めリンク集」ページがありますから (Yahoo に至ってはリンク集そのものですし)、 外部リンク巡回制限をかけているとはいえ対象外指定するのが無難です。 ルートページだけでなく配下のページも禁止しておきましょう。

http://www.yahoo.co.jp/
言わずと知れた Yahoo JAPAN
http://www.infoseek.co.jp/
Infoseek JAPAN
http://www.goo.ne.jp/
goo
http://odin.ingrid.org/
:D

次の三つは少し偏ったサーチエンジンですが、 CG 描きさんのページからは頻繁にリンクが張られています。

http://www.tamon.co.jp/TINAMI/
CG 描きさんサーチエンジン "TINAMI"
http://tinami.nerv.ne.jp/
TINAMI のミラー
http://sp.cup.com/
サーファーズパラダイス

ブラウザのホームページ

こんなのにリンク張ってどうするんだろうと思いますが、 よくあるのがブラウザのホームページへのリンクです。 ご丁寧にバナーまで貼ってあったりするんですよね。

http://www.microsoft.com/
性格がわるいやつ
http://home.netscape.com/
旗色がわるいやつ

普通は巡回する際にダウンロード上限ファイルサイズを設定していますから、 いきなり DirectX SDK とか Netscape Communicator なんぞを 落としはじめる心配はないのですが、 HTML ファイルだけでも十分被害になります。

ファイルライブラリ

ときどきリンクが張られているのがファイルライブラリの類です。 あんまり巡回したくはありません。

http://www.forest.impress.co.jp/
窓の杜
http://www.vector.co.jp/
ベクターデザイン
http://download.goo.ne.jp/
ASCII Software Download
http://softplaza.biglobe.ne.jp/
SoftPlaza

プロバイダのホームページ

プロバイダのホームページによくあるのが 「会員ホームページ一覧」のページです。 プロバイダのホームページから会員のホームページは 下位ディレクトリになりますから、外部リンク制限では止められません。 しかもプロバイダは星の数ほどありますから、 個別に対処するのも大変です。

http://web.kyoto-inet.or.jp/
筆者被害 2 位「京都インターネット」

これを防ぐには、ロボット側で 『「.ne.jp」「.or.jp」ドメイン直下は落とさない』設定が できる必要がありますね。

さて、筆者被害 1 位は、もちろん

http://www.geocities.co.jp/
Geocities

です。 ここは無料でページ容量をくれるため一部を間借りしているページが 多かったりするのですが、 「お世話になってます」リンクを張ってくださる人も多かったりするのです。 しかしそれは外部リンク巡回禁止設定で防げなくもないわけで、 本当に困るのは Geocities にあるページを落とすときです。 なぜなら Geocities は無料で Quota をくれる代わりに、

<body bgcolor="#ffffff" background="back.gif"> <DIV ALIGN=CENTER><table border="0" cellpadding="0" cellspacing="0" bgcolor=#FFFFFF width=468><tr><td width="99"><a href="http://www.geocities.co.jp/" target="_top"><img width="99" height="12"src="http://www.geocities.co.jp/images/geoguideII/logo_b.gif" border="no" LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="GO TopPage"></a></td><td nowrap rowspan=2><a href="/cgi-bin/geoguide/geoguide_rank" target="_top"><img width="78" height="12" src="http://www.geocities.co.jp/images/geoguideII/rank_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="Ranking"></a><img width="78" height="12" src="http://www.geocities.co.jp/images/geoguideII/tour_ghost_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="Surfing"><img width="84" height="12" src="http://www.geocities.co.jp/images/geoguideII/guestbook_ghost_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="GuestBook"><a href="/features/chat/" target="_top"><img width="104" height="12" src="http://www.geocities.co.jp/images/geoguideII/chat_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="Chat"></a><br><a href="/cgi-bin/search/direct_topic" t arget="_top"><img width="78" height="12" src="http://www.geocities.co.jp/images/geoguideII/pages_b.gif" border=" no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="Theme"></a><a href="/search/" target="_to p"><img width="78" height="12" src="http://www.geocities.co.jp/images/geoguideII/search_b.gif" border="no" hspac e=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="Search"></a><a href="/cgi-bin/geoguide/geoguide_se ndform" target="_top"><img width="84" height="12" src="http://www.geocities.co.jp/images/geoguideII/send_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="Sendform"></a><a href="/bbs2/Play town-Denei/" target="_top"><img width="104" height="12" src="http://www.geocities.co.jp/images/geoguideII/forums _b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="BBS"></a></td><td rowspan =2><a href="/cgi-bin/geoguide/emailMe" target="_top"><img width="25" height="23" src="http://www.geocities.co.jp /images/geoguideII/email_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.co.jp/images/pixel.gif" ALT="E -mail"></a></td></tr><tr><td><a href="/Playtown-Denei/" target="_top"><img width="99" height="12" src="http://ww w.geocities.co.jp/images/geoguideII/nh_playtown-denei_b.gif" border="no" hspace=0 LOWSRC="http://www.geocities.c o.jp/images/pixel.gif" ALT="GO Playtown-Denei"></a></td></tr><tr></tr><tr></tr></table> <!-- %%Vector ADServer%% --> <A HREF="http://www.geocities.co.jp/cgi-bin/nph-clickad?adnum=F0000061&banum=1&channel=ptown_u&program=ptown_u_main&url=" TARGET="_top"><IMG SRC="http://www.geocities.co.jp/advertise/image/f0000061/profilerenual.gif" WIDTH=468 HEIGHT=60 BORDER=0></A> <!-- %%Vector ADServer%% --> </DIV>

……といった広告を </HEAD> のうしろに 自動挿入してくれるのです。 この中に(改行すら入っていないので読めたもんではありませんが) 2

Geocities のルートへ飛ぶ

リンクが混ざっているんですね、はい。 というわけで、Geocities禁止です。

大学ページ

プロバイダと同様、大学のトップページも巡回禁止にしたいところです。

http://www.komaba.ecc.u-tokyo.ac.jp/
外部からは滅多にリンクされてないが

2.2  ダウンロードロボットが認識すべきタグ

<A HREF=...> や <IMG SRC=> を 認識するのは当然ですが、 真のダウンロードロボットは以下のタグも認識しなければなりません。

2.2.1  <FRAME SRC=...>

フレーム定義のタグです。 これが書かれている HTML ファイルにはページの実体が記述されていませんので、 このタグを認識できないと何も落とせないことになります。 ところが意外にも認識できない巡回プログラムが多いようです。 そんなのはポイです :D

(例) Pastime(http://www7.peanet.ne.jp/~cho/index.html)より

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Draft//EN">
<HTML>
<HEAD>
<TITLE>Pastime</TITLE>
</HEAD>
<FRAMESET ROWS="*,25" frameborder="0" framespacing="0" border="0"
 bordercolor="#ffffff">
<FRAMESET COLS="65,*" frameborder="0" framespacing="0" border="0">
<FRAME SRC="page.html" NAME="PAGE" scrolling="no" noresize MARGINWIDTH="0">
<FRAME SRC="main.html" NAME="MAIN" MARGINWIDTH="0"></FRAMESET>
<FRAME SRC="music.htm" NAME="MUSIC" SCROLLING="NO" MARGINWIDTH="0"
 MARGINHEIGHT="0">
   <noframes>
        <body bgcolor="#ffffff">
            <br><br><br><br><br><br>
            <center><font size=5><a href="main.html">enter</a></font></center>
            <br><br><br><br><br><br>
        </body>
    </noframes>
</FRAMESET>
</html>

幸いにして <NOFRAMES> タグに main.html への リンクが張ってあるので、<A HREF=...>だけ見ていても 主要ページだけは落とせますが、 他のフレーム部分は落とせません。 というか、ホームページ作成ツール(PageMill とか)を使っているから 期せずして対応しているのではないかという気がします。 だいたい <NOFRAMES> タグを書いてあっても

(例) Atelier TATA-BOX!(http://www02.so-net.ne.jp/~tata-box/html/index.html)より

<frameset cols="120,*" border="0">
  <frameset rows="*,60" border="0">
    <frame src="./contents.htm" name="contents"
     scrolling="no" marginwidth="0" marginheight="0">
    <frame src="./bgm02.htm"    name="bgm"
     scrolling="no" marginwidth="0" marginheight="0">
  </frameset>
    <frame src="../menu.htm"    name="main">
</frameset>
<norframe>
  <body bgcolor="#ffffff">
  <h2>『Atelier TATA-BOX!』は、フレーム対応ブラウザでご覧ください。</h2>
  </body>
</norframe>

みたいに、つれないメッセージを出してくれるだけとか結構あるし……。

2.2.2  <META HTTP-EQUIV="refresh"> タグ

HTML の再ロード指定タグです。 「移動しました」という目的で意外と使用されています。

(例) TSG Homepage(http://www.komaba.ecc.u-tokyo.ac.jp/~g740340/tsg/)より

<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://www.246.ne.jp/~para/tsg/">
<TITLE>TSG Homepage</TITLE>
<A HREF="http://www.246.ne.jp/~para/tsg/">
<CENTER><H2>TSG Homepage</H2></CENTER>
</A>

普通は <A HREF=...> で非対応ブラウザ対策がされているので たどれないことはありませんが、<A HREF=...> では 単なる外部リンクになってしまい巡回制限されてしまうかもしれません。 <META HTTP-EQUIV=...> を認識していれば 外部リンク扱いにならずにすみます。

2.2.3  クライアントサイドクリッカブルマップ

<IMG> タグで USEMAP=... を使うことで クリッカブルマップを実現することができます。 クリッカブルマップにみえても実は TABLE で実装されていることが 多いのですけどね(実例を探すのに苦労した(^_^;))。

(例)あっちー さんのページ(http://www.tg.rim.or.jp/~atchy/index.html)より

<CENTER><IMG src="graph/ac_tl015.jpg" useMap=#bunnkimap><BR><MAP 
    name=bunnkimap><AREA coords=10,10,100,32 href="whatsnew.html" 
    shape=RECT><AREA coords=10,140,70,165 href="profile.html" shape=RECT><AREA 
    coords=10,265,52,285 href="cg1.html" shape=RECT><AREA coords=10,390,55,410 
    href="cg2.html" shape=RECT><AREA coords=200,10,315,32 
    href="http://www.tg.rim.or.jp/~atchy/cgi-bin/bbs2.cgi" shape=RECT><AREA 
    coords=270,145,305,165 href="link.html" shape=RECT><AREA 
    coords=265,265,310,289 href="junk.html" shape=RECT><AREA 
    coords=230,388,310,408 href="uruuru.html" shape=RECT><AREA coords=0,0,0,0 
    shape=RECT></MAP></CENTER><BR><BR>

実はこのページは他に通常の <A HREF=...> が あったりするのでちゃんとたどれるのですが、 次のページはクリッカブルマップ以外では進入できません。

(例)三日月あきら さんのページ(http://www.nsknet.or.jp/~mikazuki/index.html)より

<MAP NAME="URAPAGE"><AREA SHAPE="POLYGON"
 COORDS="142, 20, 239, 1, 258, 99, 163, 116"
 HREF="http://www.sa.sakura.ne.jp/~usr/mik/URA/FUTOMOMO.htm"></MAP>
<IMG SRC="CG/HIHOU.GIF" WIDTH=400 HEIGHT=120 ALT="HIHOU"
 BORDER=0 USEMAP="#URAPAGE"><BR>

さらにこの裏ページへのリンクは、 別サーバへの外部リンクであるうえにパスワード保護がかかっていたりして ロボット泣かせの仕様になっています:-)

2.2.4  <EMBED SRC=...>

ときどきあるのが MIDI ファイルの EMBED です。

(例)Pastime(http://www7.peanet.ne.jp/~cho/) より

<embed src="./journey.mid" autostart=true loop=99 volume=60
 width=144 height=17 controls=smallconsole>

ページ内に再生コントロールが表示されて MIDI ファイルが勝手に演奏されます。 <EMBED SRC=...> に対応しているダウンロードロボットは 現存しないようですが、これに対応しないと曲を落とせません。

そして、MIDI よりも深刻な <EMBED SRC=...> が次の項です。

2.2.5  Macromedia Flash

最近急速に普及しつつあるのが、この Macromedia Flash を利用したページです。 試食版を落としてみましたが、スクリプトファイルのサイズを気にしなければ (画像を入れると平気で数百KBいってしまう)結構使えてしまうので 人気なのもわからなくはありません。
(例)東海女子短期大学ホームページ(http://www1.tokai-wjc.ac.jp/index.html)より

<EMBED SRC="top.swf" WIDTH="525" HEIGHT=450"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash2" QUALITY="HIGH" BASE="." LOOP="FALSE" SCALE="showall" MENU="TRUE">
</EMBED>

goo で Macromedia Flash をキーワードに探してみつけた実例です。 深い意味はありません :D

Macromedia Flash のファイルは拡張子が .swf.fla に するのが一般的のようです。 3

また、基本的に単一ファイルで動作するようですのでダウンロードするだけで 動くはずです。 PLUGINSPACE= はプラグインの場所を指定しているだけなので、 ダウンロードの必要はありません(プラグインがあれば)。

上のページは自力で記述したもののようですが、 Macromedia Flash に書かせると下のような記述になるようです。

(例)Tea Room entrance(http://www.din.or.jp/~ko-cha/menu.html)より

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width=124 height=240 codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=2,0,0,0" ><param name="MOVIE" value="menu.swf" ><param name="PLAY" value="TRUE" ><param name="LOOP" value="FALSE" ><param name="QUALITY" value="HIGH" ><param name="BGCOLOR" value="#FFFFFF" ><param name="SCALE" value="SHOWALL" ><param name="SALIGN" value="TL" ><param name="BASE" value="." ><param name="MENU" value="TRUE" ><embed src="menu.swf" width=124 height=240 pluginspage="http://www-asia.macromedia.com/jp/shockwave/download/index.cgi?Lang=Japanese&P1_Prod_Version=ShockwaveFlash" PLAY="TRUE" LOOP="FALSE" QUALITY="HIGH" BGCOLOR="#FFFFFF" SCALE="SHOWALL" SALIGN="TL" BASE="." MENU="TRUE"></embed> <noembed></noembed> </object>

<OBJECT> タグでスクリプトファイル menu.swf を 指定していますが <EMBED SRC=,,,>でも menu.swf を 指定してくれていますから、とりあえず認識できます。

2.2.6  JavaScript

(例)窓の杜(http://www.forest.impress.co.jp/)より

<SCRIPT LANGUAGE="JavaScript">
<!--
function GoTo(X) {
  if (SEL) { location.href = URL[SEL] + X; } else { NotCookie(); }
}
//-->
</SCRIPT>

<DIV ALIGN=RIGHT>
<TABLE WIDTH="92%" BORDER=0 CELLSPACING=0 CELLPADDING=1><TR></TR>
<TR ALIGN=RIGHT BGCOLOR="#AACCAA">
 <TD WIDTH="12%" ALIGN=LEFT>
 <A HREF="JavaScript:GoTo('inet/mail/becky/bk12416j.zip');">
 <IMG SRC="/gif/dl.gif" BORDER=0></A><BR></TD>
 <TD WIDTH="4%"><IMG SRC="/gif/95.gif"><IMG SRC="/gif/nt.gif"></TD>
 <TD WIDTH="58%" ID=Name ALIGN=LEFT>Becky! Internet Mail v1.24.16</TD>

上の例は窓の杜ですから自動巡回できなくても別に構いませんが、 普通は HREF にJavaScript コードを書かれてしまうと 困ったことになります。JavaScript を解釈しなければならないので、 はっきりいって対応は無理でしょう(*_*)

2.2.7  Java

動きのあるページ作成という点では Macromedia Flash が 普及してしまったようですが、 Java が使用されているページも時々あります。

(例)せつら赤王 さんのページ(http://www.cyborg.ne.jp/~setsura/)より

<FONT COLOR="#6571A4" SIZE=5><B>■ サ ー ク ル 情 報 ■</B></FONT>
<P>
<TABLE BORDER=0><TR><TD WIDTH=320>
<DIV ALIGN=CENTER>
<applet code="ExImgMap.class" width=240 height=336>
<param name=bgcolor value="FFFFFF">
<param name=image value="http://www.cyborg.ne.jp/~setsura/g000.jpg">
<param name=area1 value="0,0,240,48,komado.html,_top,こまどのおもちゃ">
<param name=area2 value="0,48,240,96,komado2.html,_top,こまどのおもちゃ2">
<param name=area3 value="0,96,240,144,yat.html,_top,YAT安心!うぃんどうず">
<param name=area4 value="0,144,240,192,komado3g.html,_top,こまどのおもちゃ3緑">
<param name=area5 value="0,192,240,240,komado3r.html,_top,こまどのおもちゃ3赤">
<param name=area6 value="0,240,240,288,komado3b.html,_top,こまどのおもちゃ3青">
<param name=area7 value="0,288,240,336,kotobuki.html,_top,寿 - KOTOBUKI -">
</applet>
</DIV>
</TD><TD WIDTH=320>
<IMG SRC="image/el_douj1.gif" WIDTH=280 HEIGHT=257>
</TD></TR></TABLE><P>

実はこのページは、現在では Java を使用せずに <TABLE> タグでクリッカブルマップを実装していますが、 上の例のころには Java によるクリッカブルマップしかありませんでした。 つまり、自動巡回が事実上できなかったのです。 Java のクラスファイルだけでもダウンロードしたいと思っても、 <APPLET CODE=...> で指定されているファイルを落とすだけでは 多くの場合動作しません。 Java の .class ファイルは APPLET とはいえ 複数に分かれていたりするからです。 ですが、幸いにして必要な .class ファイルを知ることくらいは 比較的容易にできます。

Java の .class ファイルの構造はこんな感じです。 下の情報だけでは使い物になりませんので、 詳しくは Java VM の本を参照してください。

(SUN ですから Big-endian です。また説明上、1word は 2Bytes です。)

4Bytes.class ファイル識別子 "CA FE BA BE"
1WordJava Major Version "00 03"
1WordJava Minor Version "00 2D"
1Wordコンスタントテーブルの要素数
不定長コンスタントテーブル
1Byte: 識別子
不定長: データ
の集合
不定長Java byte-code

このコンスタントテーブル識別子のうち 07 がクラス参照で、 この時のデータは参照しているクラス名を格納している コンスタントテーブル要素番号を示すword 値です。 これを利用すれば、 必要な .class ファイルを列挙することができます。

とはいえ、その .class ファイルが 使用している .gif ファイルなんかはダウンロードできませんが、 ここは仕様ということで :D

2.3  パスワード

パスワードが必要なページも存在します。 さきほどユーザサイドクリッカブルマップで紹介した 裏ページを普通に読もうとすると、エラーが返ってきます。

ecc-as50//home/g740340>telnet www.sa.sakura.ne.jp 80
Trying 210.155.3.201 ...
Connected to sa.sakura.ne.jp.
Escape character is '^]'.
GET /~usr/mik/URA/FUTOMOMO.htm HTTP/1.0

HTTP/1.1 401 Authorization Required
Date: Sun, 04 Oct 1998 12:10:17 GMT
Server: Apache/1.3b6
WWW-Authenticate: Basic realm="シークレットページ"
Connection: close
Content-Type: text/html

<HTML><HEAD>
<TITLE>401 Authorization Required</TITLE>
</HEAD><BODY>
<H1>Authorization Required</H1>
This server could not verify that you
are authorized to access the document you
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.<P>
</BODY></HTML>
Connection closed by foreign host.

従って、こういうページにはユーザ名とパスワードが必要ですから、 巡回プログラムはこのプロトコルに対応している必要があります。

3.  さらなる賢さを求めて

3.1  課金を越えて、届けこの想い

回線に関する注意点というか何というか。

3.1.1  同時接続数

巡回プログラムは、同時に複数のファイルに対して転送を行うのが普通ですが、 相手の回線が細いような場合に多数の転送要求を出しても Time Out になるのがオチです。 従って一つのサーバに対して多数の転送を行うのではなく、 複数のサーバに対して一つずつ転送を行えるようにできるべきです。 一つのサーバへの同時接続数は、最大でも 4 ファイル程度に抑えるべきでしょう。

3.1.2  転送速度制限

GetRight などのダウンロード支援プログラムに搭載されているのが 「転送速度制限」です。 各ファイルの合計転送速度を指定された数値以下におさえることができます。 この機能はマルチユーザーな LAN 環境では必須の機能であることが 某所での実験の結果判明しました(^^; 4

3.1.3  混雑時間帯

日本における混雑時間帯 22:30 〜 26:00 頃は、重くてダウンロードには向き ませんし、たぶんダウンロードすることで他人に迷惑がかかっています。 草の根 BBS 以来の道徳「混雑時間帯はDLしない」を守って、 このような時間帯はダウンロードを一時停止する機能があってもよいでしょう。

3.1.4  Time Out

Time Out 設定に関しては、サーバ毎/時間帯毎での設定ができると便利です。 Time Out を 1200 Sec にしないとまともにダウンロードできないサイトに あわせて Time Out を 1200 Sec にしていると、 高速なサーバでも Dead Linkに遭遇した際に効率が低下してしまいます (同時接続数が一つ分、足留めを食らう)。 また、GetRight のように、GET コマンド送信から ヘッダが返ってくるまでのTime Out と、 Content 受信中の Time Out を別々に設定できると便利でしょう。 さらに、Content 受信中の Time Out をファイルサイズに応じて 設定できるとなお良いのですが (大型ファイルなら待ったほうが良いし、3KB 程度の.gif ファイルとか なら再送したほうが早いことが多い)。

3.2  再巡回

ふつう、一度巡回して完全に落としきれるということはまずありません。 あるいは更新されたページをダウンロードしたいこともあります。 なので再巡回が必要となります。

3.2.1  レジューム

最近はレジューム機能を装備した HTTP サーバが多くなってきましたので、 ダウンロードロボット側もレジュームに対応すべきでしょう。 途中までダウンロードしたものの接続が切れてしまったという事故は結構あるもので、 特に大きいファイルを 50MB 中 40MB まで落としたところで Windows が過負荷のため CPU 時間を巡回プログラムに渡さず 接続が切れたとかいう場合は泣くに泣けません(;_;)

3.2.2  更新チェック

再巡回の際に既に落としたファイルを落とすのは馬鹿なので、 落としていないか更新されているファイルのみを落とすことになります。 が、実は更新チェック自体が面倒だったりします。 HTTP の GET コマンドに対して返ってきたヘッダから更新が判別できるとは 限らないのです。 更新されているかはファイルサイズから判別できることが多いのですが、 HTMLファイルに関してはファイルサイズを返さないという極めてけしからん サーバが数多くあります。 ファイルサイズを返さない設定のサーバは多くの場合最終更新日時も返さないので、 実際にダウンロードしないと更新チェックができません (つまり、転送量の節約にならない)。

(例)Last-ModifiedContent-Length を返す設定のサーバ(www.din.or.jp

HEAD /~ko-cha/ HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 10 Oct 1998 11:27:16 GMT
Server: Apache/1.3.3 (Unix)
Last-Modified: Wed, 07 Oct 1998 14:40:30 GMT
ETag: "41821-5d4-361b7d5e"
Accept-Ranges: bytes
Content-Length: 1492
Connection: close
Content-Type: text/html

(例)なんにも返さないサーバ(www7.peanet.ne.jp

HEAD /~cho/ HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 10 Oct 1998 11:29:10 GMT
Server: Apache/1.2.6
Connection: close
Content-Type: text/html

実は、ファイルのヘッダを取得するだけでもたいがいな時間がかかります。混雑 時間帯になるとそれが顕著になりますが、HTML ファイルだとヘッダの取得に かかる時間と中身の転送にかかる時間が同じだったりすることもありますので ヘッダを取得せずに更新チェックを行えるものはそのほうがよいでしょう。 .GIF.JPG は一般にファイル名が同じなら更新されていない場合が多いので、 更新チェックすら省くというのは悪い考えではないでしょう (日替わりタイトルCG の場合などでは、画像ファイルに変更があると 親 HTML ファイルにも変更が加えられていることがほとんどと考えられるので、 親 HTML に変更があった場合のみ 画像ファイルの更新チェックをすれば十分でしょう)。

3.2.3更新ファイルのオーバーライト

更新されていると分かったファイルはダウンロードしなおしますが、 そのまま前のファイル名でダウンロードすると上書きしてしまうことになります。 よくあるのが「日替わりタイトル CG」の類で、せっかく毎日巡回して落としても 上書きしたら意味がありません(だから、手動で巡回する羽目になる)。 「旧ファイルはリネームして保存」設定ができるべきだと思うのですが、 これのできるものはなかなかないようです。

3.3  巡回中動的変更

現存する巡回プログラムの多くは、設定を巡回中に変更することができません。 回線の自動切断設定を忘れたために巡回を中止して 再設定しなければならないようなものがほとんどですし、 普通は巡回禁止 URL を巡回中に変更することができません (geocities みたいな破壊的サイトへ突入したとわかっていても、 巡回中止以外に対策がない)。 途中経過の表示も重要です。巡回状況をリアルタイムに見ながら、 巡回中止や優先巡回を指定できると非常に便利です。

3.4  分散保存

現存するダウンロードプログラムの多くは、 「既にダウンロードしたファイルはダウンロードしない」という機能を、 実際にファイルがローカルディスクに存在するかを調べることで実現していますが、 これは不便です。どこにでも 10GB のハードディスクがあるわけではありません。 出先でも細切れにダウンロードできるように、 あるいは MO に分散して保存できるように、 インデックスファイルを別に持っているべきでしょう。

3.5  リンク先の自動書換

HTML ファイルの中には相対指定のリンクだけでなく http:// から始まる絶対指定のリンクもあります。 このようなリンクもローカルディスク上に保存する際には 相対指定に書き換える機能が必要です。 例えばhttp://hogehoge.foo.bar/~moemoe/ から http://hogehoge.bar.baz/~damedame/なら、 <A HREF="../hogehoge.bar.baz/~damedame/index.html"> となります。 また、この例のように、末尾がスラッシュで終わっている URL には "index.html"を付加する必要があります。

3.6  機械的巡回からの脱却

下のような賢い機能をつけるとさらに便利です。

3.6.1  外部リンク判定

ページの一部だけが Quota の関係で別プロバイダに置かれていることがあります。 タグの記述を見て内部リンクと同列に扱われているようなら準内部リンクとして あつかう機能がほしいところです。

3.6.2  クオリティ評価

ある CG 作家さんのページから 「外部リンク最大1・内部リンク無限」設定で巡回するような場合、 リンク先は数十になります。 CG 作家さんには非常に失礼ですが、 星の数ほどある CG ページにはピンからキリまであります。 日吉研のように電話代が従量制の世界では、 どうしても質の高いページに限定してダウンロードしたいところですが、 手動巡回でクオリティを識別しつつダウンロード設定をするのも面倒です。 ですからロボットが自動でクオリティを識別して ダウンロード順序を決定してくれれば非常に便利です。 CG のクオリティを判別してくれればそれがベストですが、それは難しいので

クオリティの高い CG が置かれているページは一般的に
文法的な見た目もクオリティが高い、という仮定

のもとに、タグの数やネスト数、フレーム・テーブルの使い方、 Shockwave の有無などで判別できないものでしょうか。

4.  キミノヒヨシニ、サヨナラ

巡回プログラムの目指すべき道?を書いてみました。 最近忙しくて開発が進んでいないのですが、 そのうちお披露目できるように努力するつもりです :-)


1) 従量制の世界に住んでいるのにテレホーダイでないことを全く感じさせない日吉研の某氏(電話代 20K/Month)のような人もいますが:-)
2) 【編註】字もつぶれてるんじゃないでしょうか。
3) おそらく、Macromedia Flash 2 は .swf で Flash 3 が .fla だと思います。まだ .fla が置かれているのは見かけませんね。
4) 33.6K モデムの 3 倍程度の回線を 3 人で奪いあってダウンロードしたところ、完全に殺し合いになりました(合掌)

今野 俊一 (こんの, knn) <toknn@ijk.com>, <knn@ebony.plala.or.jp>
東京大学 工学部 計数工学科(内定), TSG(理論科学グループ)