これは、なにをしたくて書いたもの?
Webサイトをまるごとダウンロードしたいと思ったらwgetコマンドだと思いますが、使ったことは何度かあるものの大抵の
場合はコマンドを調べてそのまま使う、というパターンが多かったのでメモしておこうかなと。
環境
今回の環境はこちら。
$ wget --version
GNU Wget 1.21.4 built on linux-gnu.
-cares +digest -gpgme +https +ipv6 +iri +large-file -metalink +nls
+ntlm +opie +psl +ssl/openssl
Wgetrc:
/etc/wgetrc (system)
ロケール:
/usr/share/locale
コンパイル:
gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc"
-DLOCALEDIR="/usr/share/locale" -I. -I../../src -I../lib
-I../../lib -Wdate-time -D_FORTIFY_SOURCE=3 -DHAVE_LIBSSL -DNDEBUG
-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
-ffile-prefix-map=/build/wget-LWnKWI/wget-1.21.4=. -flto=auto
-ffat-lto-objects -fstack-protector-strong -fstack-clash-protection
-Wformat -Werror=format-security -fcf-protection
-fdebug-prefix-map=/build/wget-LWnKWI/wget-1.21.4=/usr/src/wget-1.21.4-1ubuntu4.1
-DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall
リンク:
gcc -DHAVE_LIBSSL -DNDEBUG -g -O2 -fno-omit-frame-pointer
-mno-omit-leaf-frame-pointer
-ffile-prefix-map=/build/wget-LWnKWI/wget-1.21.4=. -flto=auto
-ffat-lto-objects -fstack-protector-strong -fstack-clash-protection
-Wformat -Werror=format-security -fcf-protection
-fdebug-prefix-map=/build/wget-LWnKWI/wget-1.21.4=/usr/src/wget-1.21.4-1ubuntu4.1
-DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall -Wl,-Bsymbolic-functions
-flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -lpcre2-8
-luuid -lidn2 -lssl -lcrypto -lz -lpsl ../lib/libgnu.a
Copyright (C) 2015 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 あるいはそれ以降のバージョン
<http://www.gnu.org/licenses/gpl.html>.
このソフトウェアはフリーソフトウェアです。自由に変更、再配布ができます。
法律が許すかぎり、全くの無保証です。
Hrvoje Niksic <hniksic@xemacs.org> によって書かれました。
バグ報告や質問は<bug-wget@gnu.org>へ
--versionオプションの内容がとても丁寧ですね…。
wgetのヘルプを見てみる
1度、wgetコマンドのヘルプを見てみます。
$ wget --help
GNU Wget 1.21.4, 非対話的ネットワーク転送ソフト
使い方: wget [オプション]... [URL]...
長いオプションで不可欠な引数は短いオプションでも不可欠です。
スタートアップ:
-V, --version バージョン情報を表示して終了する
-h, --help このヘルプを表示する
-b, --background スタート後にバックグラウンドに移行する
-e, --execute=COMMAND `.wgetrc'形式のコマンドを実行する
ログと入力ファイル:
-o, --output-file=FILE ログを FILE に出力する
-a, --append-output=FILE メッセージを FILE に追記する
-d, --debug デバッグ情報を表示する
-q, --quiet 何も出力しない
-v, --verbose 冗長な出力をする (デフォルト)
-nv, --no-verbose 冗長ではなくする
--report-speed=TYPE 帯域幅を TYPE で出力します。TYPE は 'bits' が指定できます。
-i, --input-file=FILE FILE の中に指定された URL をダウンロードする
-F, --force-html 入力ファイルを HTML として扱う
-B, --base=URL HTML で入力されたファイル(-i -F)のリンクを
指定した URL の相対 URL として扱う
--config=FILE 設定ファイルを指定する
--no-config 設定ファイルを読みこまない
--rejected-log=FILE 拒否された理由をログ FILE に保存する
ダウンロード:
-t, --tries=NUMBER リトライ回数の上限を指定 (0 は無制限).
--retry-connrefused 接続を拒否されてもリトライする
--retry-on-http-error ホストのエラーは致命的なものとして扱う
--retry-on-http-error=ERRORS コンマ区切りで指定したHTTPのエラーの場合リトライする
-O, --output-document=FILE FILE に文書を書きこむ
-nc, --no-clobber 存在しているファイルをダウンロードで上書きしない
--no-netrc .netrc から認証情報を取得しない
-c, --continue 部分的にダウンロードしたファイルの続きから始める
--start-pos=OFFSET OFFSET からダウンロードを開始する
--progress=TYPE 進行表示ゲージの種類を TYPE に指定する
--show-progress どのモードでも進捗バーを表示する
-N, --timestamping ローカルにあるファイルよりも新しいファイルだけ取得する
--no-if-modified-since タイムスタンプモードの時に、
if-modified-since get リクエストを使わない
--no-use-server-timestamps ローカル側のファイルのタイムスタンプに
サーバのものを使わない
-S, --server-response サーバの応答を表示する
--spider 何もダウンロードしない
-T, --timeout=SECONDS 全てのタイムアウトを SECONDS 秒に設定する
--dns-timeout=SECS DNS 問い合わせのタイムアウトを SECS 秒に設定する
--connect-timeout=SECS 接続タイムアウトを SECS 秒に設定する
--read-timeout=SECS 読み込みタイムアウトを SECS 秒に設定する
-w, --wait=SECONDS ダウンロード毎に SECONDS 秒待つ
(2つ以上のURLを取得時のみ)
--waitretry=SECONDS リトライ毎に 1〜SECONDS 秒待つ
(2つ以上のURLを取得時のみ)
--random-wait ダウンロード毎に 0.5*WAIT〜1.5*WAIT 秒待つ
(2つ以上のURLを取得時のみ)
--no-proxy プロクシを使わない
-Q, --quota=NUMBER ダウンロードするバイト数の上限を指定する
--bind-address=ADDRESS ローカルアドレスとして ADDRESS (ホスト名か IP) を使う
--limit-rate=RATE ダウンロード速度を RATE に制限する
--no-dns-cache DNS の問い合わせ結果をキャッシュしない
--restrict-file-names=OS OS が許しているファイル名に制限する
--ignore-case ファイル名/ディレクトリ名の比較で大文字小文字を無視する
-4, --inet4-only IPv4 だけを使う
-6, --inet6-only IPv6 だけを使う
--prefer-family=FAMILY 指定したファミリ(IPv6, IPv4, none)で最初に接続する
--user=USER ftp, http のユーザ名を指定する
--password=PASS ftp, http のパスワードを指定する
--ask-password パスワードを別途入力する
--use-askpass=COMMAND 認証情報(ユーザ名とパスワード)を取得するハンドラを指定します。
COMMAND が指定されない場合は、
環境変数 WGET_ASKPASS か SSH_ASKPASS が
使われます。
--no-iri IRI サポートを使わない
--local-encoding=ENC 指定した ENC を IRI のローカルエンコーディングにする
--remote-encoding=ENC 指定した ENC をデフォルトのリモートエンコーディングにする
--unlink 上書きする前にファイルを削除する
--xattr 拡張ファイル属性へのメタデータ保存を有効にする
ディレクトリ:
-nd, --no-directories ディレクトリを作らない
-x, --force-directories ディレクトリを強制的に作る
-nH, --no-host-directories ホスト名のディレクトリを作らない
--protocol-directories プロトコル名のディレクトリを作る
-P, --directory-prefix=PREFIX ファイルを PREFIX/ 以下に保存する
--cut-dirs=NUMBER リモートディレクトリ名の NUMBER 階層分を無視する
HTTP オプション:
--http-user=USER http ユーザ名として USER を使う
--http-password=PASS http パスワードとして PASS を使う
--no-cache サーバがキャッシュしたデータを許可しない
--default-page=NAME デフォルトのページ名を NAME に変更します
通常は `index.html' です
-E, --adjust-extension HTML/CSS 文書は適切な拡張子で保存する
--ignore-length `Content-Length' ヘッダを無視する
--header=STRING 送信するヘッダに STRING を追加する
--compression=TYPE 圧縮アルゴリズムの指定: autoかgzipかnone(デフォルトはnone)
--max-redirect ページで許可する最大転送回数
--proxy-user=USER プロクシユーザ名として USER を使う
--proxy-password=PASS プロクシパスワードとして PASS を使う
--referer=URL Referer を URL に設定する
--save-headers HTTP のヘッダをファイルに保存する
-U, --user-agent=AGENT User-Agent として Wget/VERSION ではなく AGENT を使う
--no-http-keep-alive HTTP の keep-alive (持続的接続) 機能を使わない
--no-cookies クッキーを使わない
--load-cookies=FILE クッキーを FILE から読みこむ
--save-cookies=FILE クッキーを FILE に保存する
--keep-session-cookies セッションだけで用いるクッキーを保持する
--post-data=STRING POST メソッドを用いて STRING を送信する
--post-file=FILE POST メソッドを用いて FILE の中味を送信する
--method=HTTPMethod "HTTPMethod" をヘッダのメソッドとして使います
--body-data=STRING STRING をデータとして送る。--method を指定してください。
--body-file=FILE ファイルの中味を送る。--method を指定してください。
--content-disposition Content-Disposition ヘッダがあれば
ローカルのファイル名として用いる (実験的)
--content-on-error サーバエラー時に受信した内容を出力する
--auth-no-challenge サーバからのチャレンジを待たずに、
Basic認証の情報を送信します。
HTTPS (SSL/TLS) オプション:
--secure-protocol=PR セキュアプロトコルを選択する (auto, SSLv2, SSLv3, TLSv1, TLSv1_1, TLSv1_2, TLSv1_3, PFS)
--https-only 安全な HTTPS のリンクだけたどる
--no-check-certificate サーバ証明書を検証しない
--certificate=FILE クライアント証明書として FILE を使う
--certificate-type=TYPE クライアント証明書の種類を TYPE (PEM, DER) に設定する
--private-key=FILE 秘密鍵として FILE を使う
--private-key-type=TYPE 秘密鍵の種類を TYPE (PEM, DER) に設定する
--ca-certificate=FILE CA 証明書として FILE を使う
--ca-directory=DIR CA のハッシュリストが保持されているディレクトリを指定する
--crl-file=FILE CRL ファイルを指定する
--pinnedpubkey=FILE/HASHES 公開鍵 (PEM/DER) ファイル、もしくは、base64でエンコードした
sha256ハッシュ値(sha256//で始まりセミコロン区切り)を指定して、
相手を認証します。
--random-file=FILE SSL PRNG の初期化データに使うファイルを指定する
--ciphers=STR GnuTLSの優先度かOpenSSLの暗号リストを直接指定する
注意して使ってください。--secure-protocol を上書きします。
フォーマットや文法は SSL/TLS 実装に依存します。
HSTS オプション:
--no-hsts HSTS を使わない
--hsts-file HSTS データベースのパス (デフォルトを上書き)
FTP オプション:
--ftp-user=USER ftp ユーザとして USER を使う
--ftp-password=PASS ftp パスワードとして PASS を使う
--no-remove-listing `.listing' ファイルを削除しない
--no-glob FTP ファイル名のグロブを無効にする
--no-passive-ftp "passive" 転送モードを使わない
--preserve-permissions リモートのファイルパーミッションを保存する
--retr-symlinks 再帰取得中に、シンボリックリンクでリンクされた先のファイルを取得する
FTPS オプション:
--ftps-implicit implicit FTPS を使う (デフォルトポートは 990)
--ftps-resume-ssl 制御接続で開始した SSL/TLS セッションを
データ接続で再開する
--ftps-clear-data-connection 制御チャネルだけ暗号化する(データは平文になる)
--ftps-fallback-to-ftp サーバが FTPS に対応していない場合は FTP にする
WARC オプション:
--warc-file=FILENAME リクエスト/レスポンスデータを .warc.gz ファイルに保存する
--warc-header=STRING warcinfo record に STRING を追加する
--warc-max-size=NUMBER WARC ファイルのサイズの最大値を NUMBER に設定する
--warc-cdx CDX インデックスファイルを書く
--warc-dedup=FILENAME 指定した CDX ファイルに載っている record は保存しない
--no-warc-compression WARC ファイルを GZIP で圧縮しない
--no-warc-digests SHA1 ダイジェストを計算しない
--no-warc-keep-log WARC record にログファイルを保存しない
--warc-tempdir=DIRECTORY WARC 書込時の一時ファイルを置くディレクトリを指定する
再帰ダウンロード:
-r, --recursive 再帰ダウンロードを行う
-l, --level=NUMBER 再帰時の階層の最大の深さを NUMBER に設定する (0 で無制限)
--delete-after ダウンロード終了後、ダウンロードしたファイルを削除する
-k, --convert-links HTML や CSS 中のリンクをローカルを指すように変更する
--convert-file-only URLのファイル名部分だけ変換する (いわゆるbasename)
--backups=N ファイルに書きこむ時に N ファイルのバックアップをローテーションさせる
-K, --backup-converted リンク変換前のファイルを .orig として保存する
-m, --mirror -N -r -l 0 --no-remove-listing の省略形
-p, --page-requisites HTML を表示するのに必要な全ての画像等も取得する
--strict-comments HTML 中のコメントの処理を厳密にする
再帰ダウンロード時のフィルタ:
-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 HTML 文書中の FTP リンクも取得対象にする
--follow-tags=LIST 取得対象にするタグ名をコンマ区切りで指定する
--ignore-tags=LIST 取得対象にしないタグ名をコンマ区切りで指定する
-H, --span-hosts 再帰中に別のホストもダウンロード対象にする
-L, --relative 相対リンクだけ取得対象にする
-I, --include-directories=LIST 取得対象にするディレクトリを指定する
--trust-server-names ファイル名としてリダイレクト先のURLの最後の部分を使う
-X, --exclude-directories=LIST 取得対象にしないディレクトリを指定する
-np, --no-parent 親ディレクトリを取得対象にしない
バグレポートや質問、議論などは <bug-wget@gnu.org> に送るか、
https://savannah.gnu.org/bugs/?func=additem&group=wget に issue をオープンしてください。
けっこう大量に出てきて面食らうのですが、ダウンロードに関するオプションはよくよく見るとまとめられています。
ダウンロード:
-t, --tries=NUMBER リトライ回数の上限を指定 (0 は無制限).
--retry-connrefused 接続を拒否されてもリトライする
--retry-on-http-error ホストのエラーは致命的なものとして扱う
--retry-on-http-error=ERRORS コンマ区切りで指定したHTTPのエラーの場合リトライする
-O, --output-document=FILE FILE に文書を書きこむ
-nc, --no-clobber 存在しているファイルをダウンロードで上書きしない
--no-netrc .netrc から認証情報を取得しない
-c, --continue 部分的にダウンロードしたファイルの続きから始める
--start-pos=OFFSET OFFSET からダウンロードを開始する
--progress=TYPE 進行表示ゲージの種類を TYPE に指定する
--show-progress どのモードでも進捗バーを表示する
-N, --timestamping ローカルにあるファイルよりも新しいファイルだけ取得する
--no-if-modified-since タイムスタンプモードの時に、
if-modified-since get リクエストを使わない
--no-use-server-timestamps ローカル側のファイルのタイムスタンプに
サーバのものを使わない
-S, --server-response サーバの応答を表示する
--spider 何もダウンロードしない
-T, --timeout=SECONDS 全てのタイムアウトを SECONDS 秒に設定する
--dns-timeout=SECS DNS 問い合わせのタイムアウトを SECS 秒に設定する
--connect-timeout=SECS 接続タイムアウトを SECS 秒に設定する
--read-timeout=SECS 読み込みタイムアウトを SECS 秒に設定する
-w, --wait=SECONDS ダウンロード毎に SECONDS 秒待つ
(2つ以上のURLを取得時のみ)
--waitretry=SECONDS リトライ毎に 1〜SECONDS 秒待つ
(2つ以上のURLを取得時のみ)
--random-wait ダウンロード毎に 0.5*WAIT〜1.5*WAIT 秒待つ
(2つ以上のURLを取得時のみ)
--no-proxy プロクシを使わない
-Q, --quota=NUMBER ダウンロードするバイト数の上限を指定する
--bind-address=ADDRESS ローカルアドレスとして ADDRESS (ホスト名か IP) を使う
--limit-rate=RATE ダウンロード速度を RATE に制限する
--no-dns-cache DNS の問い合わせ結果をキャッシュしない
--restrict-file-names=OS OS が許しているファイル名に制限する
--ignore-case ファイル名/ディレクトリ名の比較で大文字小文字を無視する
-4, --inet4-only IPv4 だけを使う
-6, --inet6-only IPv6 だけを使う
--prefer-family=FAMILY 指定したファミリ(IPv6, IPv4, none)で最初に接続する
--user=USER ftp, http のユーザ名を指定する
--password=PASS ftp, http のパスワードを指定する
--ask-password パスワードを別途入力する
--use-askpass=COMMAND 認証情報(ユーザ名とパスワード)を取得するハンドラを指定します。
COMMAND が指定されない場合は、
環境変数 WGET_ASKPASS か SSH_ASKPASS が
使われます。
--no-iri IRI サポートを使わない
--local-encoding=ENC 指定した ENC を IRI のローカルエンコーディングにする
--remote-encoding=ENC 指定した ENC をデフォルトのリモートエンコーディングにする
--unlink 上書きする前にファイルを削除する
--xattr 拡張ファイル属性へのメタデータ保存を有効にする
再帰ダウンロード:
-r, --recursive 再帰ダウンロードを行う
-l, --level=NUMBER 再帰時の階層の最大の深さを NUMBER に設定する (0 で無制限)
--delete-after ダウンロード終了後、ダウンロードしたファイルを削除する
-k, --convert-links HTML や CSS 中のリンクをローカルを指すように変更する
--convert-file-only URLのファイル名部分だけ変換する (いわゆるbasename)
--backups=N ファイルに書きこむ時に N ファイルのバックアップをローテーションさせる
-K, --backup-converted リンク変換前のファイルを .orig として保存する
-m, --mirror -N -r -l 0 --no-remove-listing の省略形
-p, --page-requisites HTML を表示するのに必要な全ての画像等も取得する
--strict-comments HTML 中のコメントの処理を厳密にする
再帰ダウンロード時のフィルタ:
-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 HTML 文書中の FTP リンクも取得対象にする
--follow-tags=LIST 取得対象にするタグ名をコンマ区切りで指定する
--ignore-tags=LIST 取得対象にしないタグ名をコンマ区切りで指定する
-H, --span-hosts 再帰中に別のホストもダウンロード対象にする
-L, --relative 相対リンクだけ取得対象にする
-I, --include-directories=LIST 取得対象にするディレクトリを指定する
--trust-server-names ファイル名としてリダイレクト先のURLの最後の部分を使う
-X, --exclude-directories=LIST 取得対象にしないディレクトリを指定する
-np, --no-parent 親ディレクトリを取得対象にしない
よく使いそうなのは-r、-np、-k、-p、-l、-Nあたりでしょうか。必要に応じて-A、-Rなどもですね。
-mが便利でしょう。
-m, --mirror -N -r -l 0 --no-remove-listing の省略形
あとはこのあたりからも。ダウンロード対象のサイトに対して、負荷を与えないようにはしたいですね。
-E, --adjust-extension HTML/CSS 文書は適切な拡張子で保存する
--limit-rate=RATE ダウンロード速度を RATE に制限する
-w, --wait=SECONDS ダウンロード毎に SECONDS 秒待つ
(2つ以上のURLを取得時のみ)
--random-wait ダウンロード毎に 0.5*WAIT〜1.5*WAIT 秒待つ
(2つ以上のURLを取得時のみ)
--random-waitは--waitと合わせて使います。
Webサイトをダウンロードする
このブログに対して実行する場合はこんな感じで。
※QueryStringやRSSなどを拾うとページ数が倍以上になるので拒否対象にしました…
$ wget -m -np -k -p -E --reject-regex='\?|/feed/|/rss/category/' https://kazuhira-r.hatenablog.com
ダウンロードしたディレクトリにホスト名(ポート)を入れない場合の例。
$ wget -m -np -k -p -E -nH --reject-regex='\?|/feed/|/rss/category/' https://kazuhira-r.hatenablog.com
ダウンロードごとに0.5〜1.5秒待つ例。
$ wget -m -np -k -p -E --reject-regex='\?|/feed/|/rss/category/' --wait=1 --random-wait https://kazuhira-r.hatenablog.com
これで80分弱かかりました…。
なのですが、実際に試してみたらリンク内のhttps://kazuhira-r.hatenablog.comの部分がそのままだったので、
後で文字列置換することに…。
$ grep -rl https://kazuhira-r.hatenablog.com kazuhira-r.hatenablog.com | xargs perl -wpi -e 's!https://kazuhira-r.hatenablog.com/?!/!g'
個人的には、これでも目的は達したのでOKなのですが。