wgetでWebページをまるごとローカルに保存する
はじめに
エンジニアの皆さんにとっては今更過ぎるだろってぐらい定番ですよね。wgetはWebサイトなどをローカルにダウンロードして保存するためのツールです。プロジェクトでWebサイトに読み込まれているファイルがほしい時、「ファイル一式ください」というのも面倒だし、もらえないことも多々あります。そんなときに使えるのがwgetです。
wgetの利点と類似ツールのcurl
簡単に言うとwgetはページ内のURLを見て再帰的に下層ページなどもチェックしてダウンロードできます。curlはこれができませんが、代わりに連番のファイルなどをダウンロードすることができます。わかりやすく解説してくれているページ「wgetとcurlの根本的な違い」があるのでここもチェックしてみてください。
wgetの注意点
注意点として、JavaScriptから呼び出されている画像などはダウンロードの対象になりません。また、再帰を使って全リソースのダウンロードを行う場合は対象サイトのサーバーに負荷を与えないよう十分に注意してください。時間はかかりますがwaitオプションを指定するのも有効だと思います。
インストール(要Homebrew)
この記事ではwgetをインストールするためにHomebrewを使います。Homebrewの詳しいインストール方法はここのドキュメントをチェックしてみてください。
また、Homebrewについて知りたい方はここのまとめHomebrewについてがわかりやすいです。
wgetのインストール
Homebrewさえあればインストールはとても簡単です。
$ brew install wget
wgetを使ってみる
それでは早速wgetを使ってみましょう。今回は需要のありそうなあるWebページをローカルでも閲覧できる状態でダウンロードし保存してみます。
保存の条件
Webページを保存する条件を以下のように設定します。括弧の中は条件を満たすために指定するコマンドオプションです。
- 対象のURLのみ保存する
- ページに必要なCSSやJS、画像をダウンロードする(
-p
) - アセットのディレクトリ構造を維持した上で保存する
- ホスト名のディレクトリを作らない(
-nH
) - 別のホストのダウンロード対象にする(
-H
) - HTMLのリンクをローカルを指すよう書き換える(
-k
) - HTML文書は
.html
の拡張子で保存する(-E
)
サンプルコマンド
コマンドを試す前に、保存先のディレクトリを作っておきます。
$ mkdir example.com
$ cd example.com
それでは実際に実行してみましょう。
$ wget -p -H -E -nH -k http://whiskers.nukos.kitchen/
--2014-09-24 19:58:31-- http://whiskers.nukos.kitchen/
Resolving whiskers.nukos.kitchen... 54.231.226.19
Connecting to whiskers.nukos.kitchen|54.231.226.19|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9128 (8.9K) [text/html]
Saving to: 'index.html'
...
FINISHED --2014-09-24 19:58:34--
Total wall clock time: 2.7s
Downloaded: 17 files, 956K in 0.5s (2.07 MB/s)
Converting index.html... 12-13
Converting ns.html?id=GTM-NQ7B2J.html... nothing to do.
Converting assets/css/style.css... 5-4
Converted 3 files in 0.01 seconds.
保存できたらディレクトリの中身をチェックしてみてください。
保存されたWebページ
このサイトを保存してみたわけですが、対象のページに読み込まれている要素はこんな構造になっています。index.html
をブラウザにドラッグしてみるとしっかりページが表示されていると思います。
.
├── assets
│ ├── css
│ │ └── style.css
│ ├── fonts
│ │ └── font-awesome
│ │ ├── fontawesome-webfont.eot?
│ │ ├── fontawesome-webfont.eot?v=4.1.0
│ │ ├── fontawesome-webfont.svg?v=4.1.0
│ │ ├── fontawesome-webfont.ttf?v=4.1.0
│ │ └── fontawesome-webfont.woff?v=4.1.0
│ ├── images
│ │ └── favicon.png
│ └── js
│ └── app.js
├── index.html
├── ns.html?id=GTM-NQ7B2J.html
├── robots.txt
└── uploads
└── eyecatch
└── thumb-2x
├── analytics.png
├── google_analytics.png
├── monotony.png
├── rails.png
└── wordpress.png
wgetのオプション
wgetはオプションが豊富に用意されています。$ wget --help
ですべてのオプションをチェックできますが、とりあえず日本語で見たい方はhttp://blog.layer8.sh/ja/2012/03/31/wget_command/が参考になります。
以下がhelpで表示される情報です。
$ wget --help
GNU Wget 1.15, a non-interactive network retriever.
Usage: wget [OPTION]... [URL]...
Mandatory arguments to long options are mandatory for short options too.
Startup:
-V, --version display the version of Wget and exit.
-h, --help print this help.
-b, --background go to background after startup.
-e, --execute=COMMAND execute a `.wgetrc'-style command.
Logging and input file:
-o, --output-file=FILE log messages to FILE.
-a, --append-output=FILE append messages to FILE.
-q, --quiet quiet (no output).
-v, --verbose be verbose (this is the default).
-nv, --no-verbose turn off verboseness, without being quiet.
--report-speed=TYPE Output bandwidth as TYPE. TYPE can be bits.
-i, --input-file=FILE download URLs found in local or external FILE.
-F, --force-html treat input file as HTML.
-B, --base=URL resolves HTML input-file links (-i -F)
relative to URL.
--config=FILE Specify config file to use.
Download:
-t, --tries=NUMBER set number of retries to NUMBER (0 unlimits).
--retry-connrefused retry even if connection is refused.
-O, --output-document=FILE write documents to FILE.
-nc, --no-clobber skip downloads that would download to
existing files (overwriting them).
-c, --continue resume getting a partially-downloaded file.
--progress=TYPE select progress gauge type.
-N, --timestamping don't re-retrieve files unless newer than
local.
--no-use-server-timestamps don't set the local file's timestamp by
the one on the server.
-S, --server-response print server response.
--spider don't download anything.
-T, --timeout=SECONDS set all timeout values to SECONDS.
--dns-timeout=SECS set the DNS lookup timeout to SECS.
--connect-timeout=SECS set the connect timeout to SECS.
--read-timeout=SECS set the read timeout to SECS.
-w, --wait=SECONDS wait SECONDS between retrievals.
--waitretry=SECONDS wait 1..SECONDS between retries of a retrieval.
--random-wait wait from 0.5*WAIT...1.5*WAIT secs between retrievals.
--no-proxy explicitly turn off proxy.
-Q, --quota=NUMBER set retrieval quota to NUMBER.
--bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host.
--limit-rate=RATE limit download rate to RATE.
--no-dns-cache disable caching DNS lookups.
--restrict-file-names=OS restrict chars in file names to ones OS allows.
--ignore-case ignore case when matching files/directories.
-4, --inet4-only connect only to IPv4 addresses.
-6, --inet6-only connect only to IPv6 addresses.
--prefer-family=FAMILY connect first to addresses of specified family,
one of IPv6, IPv4, or none.
--user=USER set both ftp and http user to USER.
--password=PASS set both ftp and http password to PASS.
--ask-password prompt for passwords.
--no-iri turn off IRI support.
--local-encoding=ENC use ENC as the local encoding for IRIs.
--remote-encoding=ENC use ENC as the default remote encoding.
--unlink remove file before clobber.
Directories:
-nd, --no-directories don't create directories.
-x, --force-directories force creation of directories.
-nH, --no-host-directories don't create host directories.
--protocol-directories use protocol name in directories.
-P, --directory-prefix=PREFIX save files to PREFIX/...
--cut-dirs=NUMBER ignore NUMBER remote directory components.
HTTP options:
--http-user=USER set http user to USER.
--http-password=PASS set http password to PASS.
--no-cache disallow server-cached data.
--default-page=NAME Change the default page name (normally
this is `index.html'.).
-E, --adjust-extension save HTML/CSS documents with proper extensions.
--ignore-length ignore `Content-Length' header field.
--header=STRING insert STRING among the headers.
--max-redirect maximum redirections allowed per page.
--proxy-user=USER set USER as proxy username.
--proxy-password=PASS set PASS as proxy password.
--referer=URL include `Referer: URL' header in HTTP request.
--save-headers save the HTTP headers to file.
-U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.
--no-http-keep-alive disable HTTP keep-alive (persistent connections).
--no-cookies don't use cookies.
--load-cookies=FILE load cookies from FILE before session.
--save-cookies=FILE save cookies to FILE after session.
--keep-session-cookies load and save session (non-permanent) cookies.
--post-data=STRING use the POST method; send STRING as the data.
--post-file=FILE use the POST method; send contents of FILE.
--method=HTTPMethod use method "HTTPMethod" in the header.
--body-data=STRING Send STRING as data. --method MUST be set.
--body-file=FILE Send contents of FILE. --method MUST be set.
--content-disposition honor the Content-Disposition header when
choosing local file names (EXPERIMENTAL).
--content-on-error output the received content on server errors.
--auth-no-challenge send Basic HTTP authentication information
without first waiting for the server's
challenge.
HTTPS (SSL/TLS) options:
--secure-protocol=PR choose secure protocol, one of auto, SSLv2,
SSLv3, TLSv1 and PFS.
--https-only only follow secure HTTPS links
--no-check-certificate don't validate the server's certificate.
--certificate=FILE client certificate file.
--certificate-type=TYPE client certificate type, PEM or DER.
--private-key=FILE private key file.
--private-key-type=TYPE private key type, PEM or DER.
--ca-certificate=FILE file with the bundle of CA's.
--ca-directory=DIR directory where hash list of CA's is stored.
--random-file=FILE file with random data for seeding the SSL PRNG.
--egd-file=FILE file naming the EGD socket with random data.
FTP options:
--ftp-user=USER set ftp user to USER.
--ftp-password=PASS set ftp password to PASS.
--no-remove-listing don't remove `.listing' files.
--no-glob turn off FTP file name globbing.
--no-passive-ftp disable the "passive" transfer mode.
--preserve-permissions preserve remote file permissions.
--retr-symlinks when recursing, get linked-to files (not dir).
WARC options:
--warc-file=FILENAME save request/response data to a .warc.gz file.
--warc-header=STRING insert STRING into the warcinfo record.
--warc-max-size=NUMBER set maximum size of WARC files to NUMBER.
--warc-cdx write CDX index files.
--warc-dedup=FILENAME do not store records listed in this CDX file.
--no-warc-compression do not compress WARC files with GZIP.
--no-warc-digests do not calculate SHA1 digests.
--no-warc-keep-log do not store the log file in a WARC record.
--warc-tempdir=DIRECTORY location for temporary files created by the
WARC writer.
Recursive download:
-r, --recursive specify recursive download.
-l, --level=NUMBER maximum recursion depth (inf or 0 for infinite).
--delete-after delete files locally after downloading them.
-k, --convert-links make links in downloaded HTML or CSS point to
local files.
--backups=N before writing file X, rotate up to N backup files.
-K, --backup-converted before converting file X, back up as X.orig.
-m, --mirror shortcut for -N -r -l inf --no-remove-listing.
-p, --page-requisites get all images, etc. needed to display HTML page.
--strict-comments turn on strict (SGML) handling of HTML comments.
Recursive accept/reject:
-A, --accept=LIST comma-separated list of accepted extensions.
-R, --reject=LIST comma-separated list of rejected extensions.
--accept-regex=REGEX regex matching accepted URLs.
--reject-regex=REGEX regex matching rejected URLs.
--regex-type=TYPE regex type (posix).
-D, --domains=LIST comma-separated list of accepted domains.
--exclude-domains=LIST comma-separated list of rejected domains.
--follow-ftp follow FTP links from HTML documents.
--follow-tags=LIST comma-separated list of followed HTML tags.
--ignore-tags=LIST comma-separated list of ignored HTML tags.
-H, --span-hosts go to foreign hosts when recursive.
-L, --relative follow relative links only.
-I, --include-directories=LIST list of allowed directories.
--trust-server-names use the name specified by the redirection
url last component.
-X, --exclude-directories=LIST list of excluded directories.
-np, --no-parent don't ascend to the parent directory.
Mail bug reports and suggestions to <bug-wget@gnu.org>
オプションを上手く活用することで、無駄な手作業を減らせますね。
以上、wgetの使い方でした。