wget

作成日 : 2005-09-26
最終更新日 :

wget の紹介

wgetは、httpを利用して、 インターネット上のファイルをローカルコンピュータに保存するソフトだ。 よくできたソフトだと感嘆する。 UNIX ならば http://ftp.gnu.org/gnu/wget/ からダウンロードしてコンパイルすればよい。 最新版は 2013 年 10 月現在 1.14 、2014 年 6 月現在では 1.15 のようだ。 2016 年 12 月現在は 1.18、2017 年 5 月現在は 1.19.1 、 2022 年 9 月現在は 1.21.2 になっている。

Windows 版は、gnuwin32.sourceforge.net にもあるがバージョンが古めである。 下記ページからのほうが、最新のバージョンがダウンロードできる可能性が高い。

http://eternallybored.org/misc/wget/

wget のオプション

以下は wget Ver 1.21.2 のオプションである。wget --help とは少し異なる日本語である

スタートアップ

短いオプション長いオプション説明備考
-V--versionバージョン情報
-h--helpこのヘルプを表示
-v--backgroundバックグラウンドで実行
-e--execute=COMMAND.wgetrc 形式のコマンドを実行

ログファイル・入力ファイル

短いオプション長いオプション説明備考
-o--output-file=FILEメッセージを FILE に書き出す
-a--append-file=FILEメッセージを FILE に追記する
-dデバッグ情報を大量にプリントする
-q静かにする(表示しない)
-v饒舌(デフォルト)
-nv-q ではないが非饒舌
--report-speed=TYPE
-i--input-file=FILEローカルまたは外部の FILE に URL をダウンロードする
-F--force-html入力ファイルを html して扱う
-B--base=URL
--config=FILE使う config ファイルを指定する
--no-configconfig ファイルを読まない
--rejected-log=FILEURL を拒否した理由を FILE に書き出す

ダウンロード(抜粋)

短いオプション長いオプション説明備考
--spider何もダウンロードしない
-N--timestampingローカルにあるファイルよりも新しいファイルだけ取得する

ディレクトリ(抜粋)

短いオプション長いオプション説明備考
-nd--no-directoriesディレクトリを作らない
-x--force-directoriesディレクトリを強制的に作る

HTTP オプション(抜粋)

短いオプション長いオプション説明備考
-U--user-agent=AGENTユーザエージェントとして Wget/VERSION ではなく AGENT を使う
--load-cookies=FILEクッキーを FILE から読み込む

HTTPS (SSL/TLS) オプション(抜粋)

短いオプション長いオプション説明備考
--https-only安全な HTTPS のリンクのみたどる

HSTS オプション(省略)

HSTS とは HTTP Strict Transport Security の略であり、Webサーバが HTTPヘッダ の中で指定する項目の一つ。 Web エージェントに対して以降は常に HTTPS による通信を行うよう指示するもの。

FTP オプション(抜粋)

短いオプション長いオプション説明備考
--no-remove-listing`.listing' ファイルを削除しない

FTPS オプション(省略)

WARC オプション(省略)

WARC とは Web ARChive (ウェブアーカイブ)の略。仕様については https://archive-access.sourceforge.net/warc/ 他を参照のこと。 日本語では、https://warp.da.ndl.go.jp/contents/reccommend/mechanism/mechanism_warc.html などがある。

再帰ダウンロード(抜粋)

短いオプション長いオプション説明備考
-r--recursive再帰的にダウンロードする
-l--level=NUMBER再帰時の階層の最大の深さを NUMBER に設定する (0 で無制限)
-m--mirror-N -r -l 0 --no-remove-listing の省略形

再帰ダウンロードの受理/拒否

短いオプション長いオプション説明備考
-A--accept=LIST受理する拡張子をコンマ区切りで指定する
-R--reject=LIST拒否する拡張子をコンマ区切りで指定する
--accept-regex=REGEX受理する URL を正規表現で指定する
--reject-regex=REGEX拒否する URL を正規表現で指定する
--regex-type=TYPE正規表現のタイプ(posix|pcre)
-D--domains=LISTダウンロードするドメインをコンマ区切りで指定する
--exclude-domains=LISTダウンロードしないドメインをコンマ区切りで指定する
--follow-ftp文書中の FTP リンクも取得対象にする
--follow-tags=LIST取得対象にするタグ名をコンマ区切りで指定する
--ignore-tags=LIST取得対象にしないタグ名をコンマ区切りで指定する
-H--span-hosts再帰中に別のホストもダウンロード対象にする
-L--relative相対リンクだけ取得対象にする
-I--include-directories=LIST許可ディレクトリの一覧
--trust-server-namesファイル名としてリダイレクト先の URL の最後の部分を使う
--exclude-directories=LIST除外ディレクトリの一覧
--no-parent親ディレクトリを取得対象としない

-m オプション

-m オプションは --mirror オプションの省略形である。 これは、さらにいえば -N -r -l 0 --no-remove-listing の省略形である。

-N ローカルにあるファイルよりも新しいファイルだけ取得する
-r 再帰ダウンロードを行う
-l NUMBER 再帰時の階層の最大の深さをNUMBER に設定する。NUMBER が 0 のときは無制限。
--no-remove-listing `.listing' ファイルを削除しない

wget の利用法

例 1 : 私のホームページ(まりんきょ学問所)をダウンロードする

$ wget -m -A "*.??" -R js -P PREFIX/ -np http://www.ne.jp/asahi/music/marinkyo/index.html.ja

-m : mirror を表す。
-A : 受理する拡張子を表す。私のホームページでは拡張子は .ja, .eo, .en などのように言語に応じた 2 文字の拡張子を使っている。
-R : 拒否する拡張子を表す。上記の通り 2 文字の拡張子を受理しているが、.js は JavaScript 言語のスクリプトなので拒否する
-P : ファイルを PREFIX/ 以下に保存する。PREFIX は変数。
-np: 親ディレクトリには上らない。

これに合わせて --spider オプションを指定すると、何もダウンロードをしない。

例 2 : 私のブログ(まりんきょの音楽室)の記事一覧を wget.log に書き出す

$ wget -nv -m -np -o "wget.log" --accept-regex '[0-9][0-9][0-9][0-9][0-9]$' --spider http://marinkyo.asablo.jp/blog

-nv : 非饒舌モード。
-m : mirror (前述)
-np : 親ディレクトリには上らない(前述)。
-o: 出力をファイル wget.log に出力する。
-accept-regex: ダウンロードするファイルを末尾が数字 5 文字のものに絞る。
--spider : 何もダウンロードしない(前述)。

例 3 : 私のホームページ内(まりんきょ学問所)のリンク切れ一覧を表示する

$ wget --spider --level=0 --recursive --no-parent -R "js,svg,ico,css,png,jpg,gif,txt" --no-verbose http://www.ne.jp/asahi/music/marinkyo/index.html.ja

--spider : 何もダウンロードしない(前述)。
--level=0 : 再帰時の階層の最大の深さを無制限に設定
--recursive : 再帰的に適用
--no-parent : 親ディレクトリには上らない(前述)。
-R "js,svg,ico": 拡張子 js, svg, ico は対象外
--no-verbose : 非饒舌モード。

wgetのどこが気に入らないか

さて、wget を自分なりに改良したいと思うこともある。 以下、wgetをどのように改造するかを考えたことを載せる。

404の呪い

wget の機能はいろいろあるが、今回話題にするのは表示である。 あるファイルをダウンロードするとき、表示も一緒に行われる。 典型的な表示は次の通りである。


--21:41:18--  http://www.ne.jp/asahi/music/marinkyo/index.html.eo
           => `www.ne.jp/asahi/music/marinkyo/index.html.eo'
www.ne.jp:80 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2,218 (2.2K) [text/html]

    0K ..                                                    100%    1.78 MB/s

21:41:18 (1.78 MB/s) - `www.ne.jp/asahi/music/marinkyo/index.html.eo' を保存しました [2218/2218]

一方、リンク先のファイルが見つからない場合は、404 Not Found エラーが出てしまう。

--21:41:22--  http://www.ne.jp/asahi/music/marinkyo/taglibroj/vortaro.html.ja
           => `www.ne.jp/asahi/music/marinkyo/taglibroj/vortaro.html.ja'
www.ne.jp:80 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
21:41:22 エラー 404: Not Found。

問題は、このつながらないリンクが、どのファイルに書かれているかを探すことだ。 このメッセージからは、どのファイルに書かれているかはわからない。 そこで、どのファイルからのリンクかを正常、エラーを問わず、表示させたい。

では、どこをどう直せばいいか。 イメージの一例を次に示す。

--21:41:18--  http://www.ne.jp/asahi/music/marinkyo/index.html.eo
           => `www.ne.jp/asahi/music/marinkyo/index.html.eo'
           <= `www.ne.jp/asahi/music/marinkyo/index.html.ja'
www.ne.jp:80 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2,218 (2.2K) [text/html]

    0K ..                                                    100%    1.78 MB/s

21:41:18 (1.78 MB/s) - `www.ne.jp/asahi/music/marinkyo/index.html.eo' を保存しました [2218/2218]

ではソースコードで、=>が出ている箇所を探す。

% grep '=>' *.c



(前略)
http.c:   logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n",
(後略)

これは、1073行と1074行の変更になる。 なお、現在はバージョンが変わっているので別の行になっているはずだ。


logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n  <= '%s'\n",
  tms, hurl, tmp, locf, referer);

さて、結果はどうだったか。


--22:46:40--  http://www.ne.jp/asahi/music/marinkyo/taglibroj/vortaro.html.ja
           => `www.ne.jp/asahi/music/marinkyo/taglibroj/vortaro.html.ja'
 <= 'http://www.ne.jp/asahi/music/marinkyo/taglibroj/hodiaux.html.ja'
www.ne.jp:80 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
22:46:40 エラー 404: Not Found。

思った通り、リンク元も表示されるようになった。

なお、この変更により、最初に指定したファイルはどのように表示されるかが問題となる。

--22:46:36--  http://www.ne.jp/asahi/music/marinkyo/index.html.ja
           => `www.ne.jp/asahi/music/marinkyo/index.html.ja'
 <= '(null)'
www.ne.jp をDNSに問いあわせています... 202.224.39.35
www.ne.jp|202.224.39.35|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 6,393 (6.2K) [text/html]

    0K ......                                                100%   92.38 MB/s

22:46:37 (92.38 MB/s) - `www.ne.jp/asahi/music/marinkyo/index.html.ja' を保存しました [6393/6393]

NULL をそのまま表示してしまうのはまずいと思うが、いい方法が見付からない。 (2005-09-26)

--debug オプションを使う

ソースを変更せずにリンク元を示すために、--debug オプションをつける方法もある。 この場合は大量の情報が出力されるので、気をつけてほしい。


コンパイルのしかた

バージョン 1.12 のコンパイル

私が使っているレンタルサーバは2つある。1つは wget が標準で備えられているが、 もう一つは備えられていない。仕方なく自分でインストールした。 wget のソースを展開したディレクトリで、次のコマンドを入力する。

  % ./configure --prefix=$HOME/local --with-libintl-prefix=/usr/local -with-libiconv-prefix=/usr/local
  % make
  % make install

./configure で2つの --with で始まるオプションを忘れてしまうと、多言語対応ができないことがわかった。 このときインストールした wget のバージョンは 1.12 である。


バージョン 1.14 のコンパイル

2013 年、wget の最新版は 1.14 である。これを上記の手順でインストールしようとしたが、 このようなエラーが出た。

configure: error: --with-ssl was given, but GNUTLS is not available.

1.13 からは ssl のライブラリとして GNUTLS をデフォルトで使うようになったが、 そのライブラリがないといっている。GNUTLS を使うのはあきらめ、弱く OpenSSL を使うことにした。

  % ./configure --prefix=$HOME/local --with-libintl-prefix=/usr/local -with-libiconv-prefix=/usr/local --with-ssl=openssl
  % make
  % make install

バージョン 1.18 のコンパイル

2016 年、バージョン 1.18 を Vine Linux 6.3 でコンパイルしようとしたが、次のエラーが出た。

$ ./configure
(中略)
$ make
(中略)
gnutls.c:41:29: error: gnutls/abstract.h: No such file or directory
gnutls.c: In function 'pkp_pin_peer_pubkey':
gnutls.c:703: error: 'gnutls_pubkey_t' undeclared (first use in this function)
gnutls.c:703: error: (Each undeclared identifier is reported only once
gnutls.c:703: error: for each function it appears in.)
gnutls.c:703: error: expected ';' before 'key'
gnutls.c:717: error: 'key' undeclared (first use in this function)
make[3]: *** [gnutls.o] Error 1

検索してみると、 https://lists.gnu.org/archive/html/bug-wget/2016-05/msg00000.html で、次の回答がある。

	> It looks like it isn't
	> compatible with older versions of GnuTLS.
	>
	> Is it possible for you to update to libgnutls28 (plus -dev package) ?

では、私の Vine Linux ではどうなっているか。 /usr/lib/libgnutls.so.26 である。つまり、古いためにコンパイルできない。 Vine には新しいものはないので、ここで引き下がろう。(2016-12-17)

バージョン 1.19.1 のコンパイル

2017 年、バージョン 1.19.1 を Vine Linux 6.5 でコンパイルしようとしたが、 configure の段階ではねられた。

$ ./configure
(中略)
checking for ZLIB... yes
checking for GNUTLS... no
configure: error: Package requirements (gnutls) were not met:

No package 'gnutls' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GNUTLS_CFLAGS
and GNUTLS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
$

Synaptic でみると、gnutls と gnutls-devel はどちらも 2.10.5-12 が入っていたが、 gnutls-utils は入っていなかった。gnutls-guile もあわせてインストールした。 再度 ./configure を実行したが、結果は同じだった。

やっぱり --with-ssl=openssl を指定する。

$ ./configure --with-ssl=openssl
checking for OPENSSL... no
configure: error: Package requirements (openssl) were not met:

No package 'openssl' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables OPENSSL_CFLAGS
and OPENSSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

それでも入らない。いったん諦める。

再度挑戦した。wget openssel no packages で検索すると、次のページがヒットする。
https://superuser.com/questions/895295/ssl-not-available-when-attempting-to-compile-wget-from-source

どうも英語で書いてあることをみると、 まず ldconfig -p | grep ssl を調べろ、とある。

私のところにはこれだけ入っている。

$ ldconfig -p | grep ssl
	libssl3.so (libc6,x86-64) => /usr/lib64/libssl3.so
	libssl3.so (libc6) => /usr/lib/libssl3.so
	libssl.so.10 (libc6,x86-64) => /lib64/libssl.so.10
	libssl.so.10 (libc6) => /lib/libssl.so.10
	libssl.so (libc6,x86-64) => /usr/lib64/libssl.so
	libgnutls-openssl.so.26 (libc6,x86-64) => /usr/lib64/libgnutls-openssl.so.26
	libgnutls-openssl.so.26 (libc6) => /usr/lib/libgnutls-openssl.so.26
	libgnutls-openssl.so (libc6,x86-64) => /usr/lib64/libgnutls-openssl.so
	libevent_openssl-2.0.so.5 (libc6,x86-64) => /usr/lib64/libevent_openssl-2.0.so.5

ということは、ライブラリそのものは入っているわけだ。ということは、 英語の上記のメッセージのどちらかを行わないといけないのだろう。

もし非標準のソフトウエアをインストールするのなら、 PKG_CONFIG_PATH 環境変数を修正すべきだ。 もう一つ、環境変数 OPENSSL_CFLAGS と OPENSSL_LIBS の環境変数を設定する方法がある。 この方法では、pkg-config を呼ぶのを避けることができる。詳しくは pkg-config のマニュアルページを参照のこと。

ということでなんとか下記のオプションで configure は無事成功した。 なお、CC の行はコンパイラの指定である。ここを指定しないと homebrew でインストールした最新の C コンパイラを使うことになる。そうして得られた Makefile をコンパイルするとエラーになるためである。

$ ./configure CC=/usr/bin/gcc --with-ssl=openssl --with-libssl-prefix=/usr/lib64 $ make $ sudo make install

HTML の HEAD 要素の取得

先の章で説明したように、レンタルサーバの wget は、 備え付けのものと自力でインストールしたものとの2種類がある。 自力でインストールした wget のバージョンは 1.12 だが、 備え付けの wget のバージョンは 1.10.2 だ。

さて、この両者には違いがあるようだ。1.10.2 では、HEAD 要素に記述されているリンクを取得するが、 1.12 では取得しない。HEAD 要素に記述されているリンクとは、 たとえば、<head> と </head> に囲まれた個所にあるLINK要素
<link rel="top" href="../index.html.ja" />
で示される href のリンク先のことである。

たとえば、$HOMEPAGE/faure/barkaroloj.html.eo のページでは、 HEAD 要素に次のように記述している。


  <link rel="alternate" lang="en" title="angla" href="./barkaroloj.html.en" />

ところが、上記のリンク先である barkaroloj.html.en がダウンロードされていない。 wget 英語のバージョン情報を見たがわからない。まず、実験することにした。

  % wget -i http://www.ne.jp/asahi/music/marinkyo/faure/barkaroloj.html.eo
  % ls
  (前略)
  barkaroloj.html.en
  (後略)

このようにダウンロードはできている。 従って、問題は私が使っている wget のコマンドオプションにあったか、他の問題と思われる。

その後、備え付けの wget バージョンも 1.12 になった。

debug モード

wget にデバッグモード --debug のオプションを付けると、 一つのページに長い情報を出してくれる。こんな感じだ。

--2013-11-17 22:08:46--  http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja
Reusing existing connection to www.ne.jp:80.
Reusing fd 3.

---request begin---
HEAD /asahi/music/marinkyo/prezento/sercxilo.html.ja HTTP/1.0
Referer: http://www.ne.jp/asahi/music/marinkyo/index.html.ja
User-Agent: Wget/1.12 (freebsd8.1)
Accept: */*
Host: www.ne.jp
Connection: Keep-Alive

---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 200 OK
Date: Sun, 17 Nov 2013 13:08:46 GMT
Server: Apache/2.2.16 (Debian)
Content-Location: sercxilo.html.ja.utf8
Vary: negotiate
TCN: choice
Last-Modified: Wed, 02 Oct 2013 13:03:59 GMT
ETag: "4d3833-2626-4e7c1b3e7026d;4e7c1b3df51c9"
Accept-Ranges: bytes
Content-Length: 9766
Keep-Alive: timeout=5, max=93
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Content-Language: ja

---response end---
200 OK
URI content encoding = `utf-8'
Length: 9766 (9.5K) [text/html]
Remote file exists and could contain links to other resources -- retrieving.

ここで確認してもらいたいのは、--request begin-- で始まる区画だ。 HEAD の行のあとに Referer: がある。これは、HEAD 行にあるページは、 Referer: にあるページから参照されている、ということを表している。 したがって、wget で参照していたが見つからなかったページが、 どのページで参照されているかを調べることができる。

実際には、wget を --debug モードつきで動作させて、 標準エラー出力から得られたデータを egrep "^HEAD|^Referer" でパイプ出力させればよい。

フォーム認証

ベーシック認証以外に、自前のフォームで認証を行うシステムがある。 このようなシステムで Wget によるダウンロードを行うにはどうすればよいか。 もっか調査中である。

以下、 wgetの使い方:認証してFORMを送信するようなページでダウンロードする [コンピュータ] (shigekun.blog.so-net) の内容に即して記述する。 なお、これからの私の実験は、Windows の wget 1.15 built on mingw32 である。

1.認証

--keep-session-cookies、 --save-cookies、 --post-dataを付けて、認証させクッキーをファイルに保存しておく


wget \
 --keep-session-cookies \
 --save-cookies=cookies.txt \
 --post-data 'POSTするデータ(UserId=...&Password=...)' \
 ログインページのPOST先URL

ログインページの POST 先 URL や POST する情報は、ページのソースを見て調べる。 しかし、この方法では、POST する情報を決めづらい。また、hidden 情報も調べておく必要がある。

2.ダウンロード

--load-cookies、--post-data、-Oを付けてダウンロードする。


wget \
 --referer=リファラ(ダウンロードページのURL) \
 --load-cookies cookies.txt \
 --post-data 'POSTするデータ(key1=value1&key2=value2...)' \
 -O 保存するファイル名 \
 ダウンロードページのPOST先のURL

リファラは必要に応じて付加する。

ユーザーエージェントの指定

ユーザーエージェント(User-Agent)は設定できる。--user-agent を使う。

ユーザーエージェントを設定する理由は以下のとおりである。 ブラウザそしてより拡大した概念であるユーザーエージェントは、WEB サーバーに接続するときに 自分のブラウザなりユーザーエージェントなり名前やバージョンを伝える。この名前は正確な名前であるべきだ。 ところが、サーバーの設定によって、「見ていいのはこのブラウザだけだ」と勝手に決め付け、 決めたブラウザ以外を排除していることがある。これは問題である。 この問題を避けるために、見ていいブラウザのふりをするために、 仕方なく使うものである。


認証付きサイトのダウンロード

認証付きサイトを wget でダウンロードするには、いろいろな方法を使い分ける必要がある。

Basic 認証

Basic認証のあるページを wget でダウンロードするには、 ユーザー名として --http-user を、パスワードとして --http-passwd を使えばいい。

Basic 認証以外の認証付きサイトのダウンロード

例として Openpne という、SNS を自前で構築するためのプラットフォームを対象とする。 この入口は、メールアドレスが ID でパスワードが付加されていて、これらが認証情報となっている。 さて、これらの認証情報をわきまえたうえで、SNS の必要な情報をバックアップする(エクスポートする、ダウンロードする、コピーする)には、 どうすればいいだろうか。 いちいち手でダウンロードするのはとんでもないことになる。日記だけで 1 万件を超えるのだ。 wget で認証付きサイトをダウンロードする(webos-goodies.jp)を参考にして、 考えたことを試してみた。いわゆる、クロールに近い。 スクレイピングとも関係がある。

結論から先に言えば、私の場合は、上記サイトで、wget を使った場合、永続的な Cookie による認証の場合でうまくいった。 これについて注釈を加える。

認証情報を wget で得るためには、既存のブラウザでクッキー情報を作成し、それを wget で使える形式の cookies.txt をエクスポートしておく必要がある。 しかし現在、Firefox で Cookie を保存しているのは cookies.sqlite であり、 cookies.txt ではない。 cookies.txt を得たければ Internet Explorer (IE) を使うか、Firefox アドオンで Export Cookies という拡張機能を使うしかない。 なお、私は前者の IE を使う方法で対応した。Firefox のアドオンは使っていない。

なお、wget を使うという条件を無視すれば、いくつかの方法が考えられる。

ブラウザのプラグイン

Firefox のプラグイン scarpbook

Firefox のプラグイン scrapbook は、今見ている該当ページはもちろん、そのページからたどっていけるリンクの情報まで保存することができる。 まず、Mixi で試してみた。欲しいのは、自分が書いた日記だけである。 なお、Mixi では、自分の書いた日記は、http://mixi.jp/view_diary.pl?id=(記事のID番号)&owner_id=(自分のID番号) で表示されることに注意する。 のちのために、この自分のID番号を控えておく。これは 7 桁の数字のはずである。

このプラグインを導入すると、プルダウンメニューに Scrapbook(C) が新たにできる。 ここをプルダウンすると[ページを詳細に保存...]というメニューがあるのでここを選ぶ。 すると、次の <ScrapBook - 保存の詳細>というダイアログウインドウが出てくる。左側のタブが表示されているが、 右側の[コメント]タブへいけば、任意のコメントを書くことができる。 左側のタブに戻ると、 一番下に掘り下げ保存の欄があり、リンクをたどる深さが 0 1 2 3 と出ている。0 を選べば該当ページだけだが、 1 を選ぶと該当ページにリンクしているページまで取り込むことができる。1 を選んで[取り込む]ボタンをクリックすると、 <保存 - ScrapBook>というダイアログウィンドウが出てくる。ここですぐに[一時停止]をクリックする。 これは、保存するファイルを選ぶためだ。

さて、この状態でほしいページは自分の日記だけであるから、[フィルタ]ボタンを選んで[文字列でフィルタ...]を選び、 1 行のテキスト欄にさきほど控えた7桁の数字を入力し、[OK]ボタンをクリックする。 すると、チェックされたファイルが減ったことがわかるだろう。この状態で[開始]ボタンをクリックすれば、保存が始まる。

保存が終わった後のページは、フォルダ
C:\Users\Windowsのログオン名\AppData\Roaming\Mozilla\Firefox\Profiles\固有のディレクトリ名\ScrapBook\data\YYYYMMDDhhmmss
に保管されている。私の場合、次の通りだった。

favicon.ico はファビコンである(_001がついているのも同じ)。index.dat はこの ScrapBook で保存したときの情報である。 ここの comment 行は、ダイアログウィンドウでコメントを入力した場合に残る。 index.html は該当ページそのもの。複数あるのは、他のページを見た後、該当ページに戻ったときのページを律儀に保存している (と思うがよくわからない)。 list_wall.html は伝言板へのリンク。 sb-file2url.txt は、このScrapBook で保存したファイル名とURL の関係が書かれたファイルである。。 sb-url2name.txt は、URL のタイトル名。 show_diary_picture.htmlは、日記の画像表示であろうが、よくわからない。 show_profile.htmlは自己紹介。 sitemap.xml は、サイトマップを XML 形式で表現したファイル。 そして、view_diary.html 関係が日記の内容である。

以上で、mixi の保存はうまくいくことがわかった。

「リンクが壊れています」の対応

spider モードでリンク切れを検出したあとの対策である。リンク切れは途中でも表示されるが、 最後にも表示される。この表示順序は必ずしも整序されていない。

	47 個のリンクが壊れています。

http://www.ne.jp/asahi/music/marinkyo/ml/faure/indekso.html.ja
http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja%22
(中略)
http://www.ne.jp/asahi/music/marinkyo/ml/libroj/riryo-sangetsuki.html.ja

wget とは直接関係ないが、私が検出に手こずった例をあげよう。まず、次のリンク http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja%22 が壊れているという表示を受けて、このリンクがどのファイルかを調べた。%22 というのは ASCII で " (ダブルクォーテーション) の記号を表す。さんざん考えて、エラーが出るときのリンクはダブルクォーテーションの対がないのだろう。つまり、正しくは、
<a href="sercxilo.html.ja">
となるところを誤って
<a href=sercxilo.html.ja">
としているに違いないと想像した。そこで
$ egrep 'href=[^"]+sercxilo\.html\.ja' */*.?? として検索した。その結果、一か所だけ、思った通り href= の次に ダブルクォーテーションがない記述があった。

まりんきょ学問所UNIX 手習い > wget


MARUYAMA Satosi