blog

wgetでWebページをまるごとローカルに保存する

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    はじめに

    エンジニアの皆さんにとっては今更過ぎるだろってぐらい定番ですよね。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の使い方でした。

    コメント・フィードバック