使用 wget 制作网站镜像

发表于2017-03-12   6568次阅读

Linux 下的 wget 其实非常强大,可以制作网站镜像,或者来备份你的网站,相关参数如下:

  • -r, --recursive

    递归循环下载整个站点。

  • -m, --mirror

    制作网站镜像模式。

  • --no-clobber

    避免重复现在相同文件。

  • -A, --accept=LIST

    允许下载的扩展名,逗号分隔。

  • -k, --convert-links

    让下载得到的 HTML 或 CSS 中的链接指向本地文件,只有完成下载之后才进行转换。

  • -E, --adjust-extension

    根据 content-type 类型,以合适的扩展名保存 HTML/CSS 文档。

  • -p, --page-requisites

    下载所有用于显示 HTML 页面的图片、CSS之类的元素。

  • -np, --no-parent

    不追溯至父目录,只在当前和子目录中进行抓取。不过对于一些样式文件、js文件可能都在上级目录中,使用时需要注意。

  • -w, --wait=SECONDS

    等待间隔为 SECONDS 秒。避免把对方服务器压垮。

  • --waitretry=SECONDS

    在获取文件的重试期间等待 1..SECONDS 秒。

  • --random-wait

    获取多个文件时,每次随机等待间隔。

  • -O, --output-document=file

    对下载文件进行重命名

  • -o, --output-file=FILE

    记录下载日志,并将日志信息写入 FILE。

  • -U, --user-agent=AGENT

    标识为 AGENT 而不是 Wget/VERSION。比如使用Chrome流量器的Agent “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36”,这样可以避免被对方网站。

  • -D, --domains=LIST , --exclude-domains=LIST

    逗号分隔的可接受或不可接受(--exclude-domains)的域列表。

  • --restrict-file-names=modes

    其中OS的值可以为: unix, windows, nocontrol, ascii, lowercase, and uppercase

    限定文件名中的字符为 modes 允许的字符。比如你的本地操作系统是Windows,对方服务器使用的是linux,由于操作系统的差异,有些字符在Linux下可以作为文件名的一部分,但在Window下不允许。

    比如你的本地系统是windows则用法如下方式:

    --restrict-file-names=windows

    如果你的本地系统为Linux或者MacOS,则可以使用如下方式:

    --restrict-file-names=unix
  • -c, --continue

    断点续传,如果一个站点的页面很多,建议使用该选项。

  • --connect-timeout

    请求超时时间。

  • -t, --tries=NUMBER

    设置重试次数为 NUMBER (0 代表无限制)。

  • --limit-rate

    控制下载速度,如:

    --limit-rate=100k
  • -b, --background

    按照后台模式运行,启动后转入后台。

  • -P, --directory-prefix=PREFIX

    将下载的所有文件保存在 PREFIX 目录中。

  • -R, --reject=LIST

    屏蔽某类扩展名的文件,用逗号分隔。比如不下载gif如图片:

    --reject=gif
  • --reject-regex=REGEX

    以正则表达式的方式屏蔽某些url。

  • -e robots=off

    不遵循robots协议。默认情况下wget遵循robots协议。

    关于robots协议可以参考本博客的另外一篇文章《Robots.txt 文件写法、生成、检测工具》

  • -I, --include-directories=LIST

    允许抓取的目录列表,逗号分隔,可以使用通配符“*”。

  • -X, --exclude-directories=LIST

    排除目录的列表,逗号分隔,可以使用通配符“*”。

例子:

wget
    -m  \
    -np \
    -E  \
    -k  \
    -c  \
    -r  \
    --directory-prefix=/tmp/pagespeed_doc \
    -e robots=off \
    --random-wait \
    --restrict-file-names=unix  \
    --domains=developers.google.com \
    --include-directories=speed/ \
    --user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36" \
    --output-file=/tmp/developers.google.com.log \
    "https://developers.google.com/speed/pagespeed/module/"

下载过程中查看下载日志:

下载完成后,查看 /tmp/pagespeed_doc 中的内容如下:

本例的镜像页面可以点击这里来访问。

注意:wget 不支持 socks 代理,如需走代理请和 tsocks 配套使用,tsocks 的安装参见本博客的另外一篇文章《 Mac 下安装 tsocks 前置代理工具 》

另外,wget 对 gzip 压缩的 css 文件支持的不好,不能自动解压,需要手动解压,比如:

$ wget https://developers.google.com/_static/254aea64a1/css/devsite-google-blue.css
$ file devsite-google-blue.css
devsite-google-blue.css: gzip compressed data, max compression

直接 cat devsite-google-blue.css 会显示乱码。

多线程下载

axel

wget 不支持多线程下载,对于较大文件 wget 有时候显得力不从心。axel 可以解决这个问题。axel 的安装方法如下:

$ wget -O axel.zip https://github.com/angelj-a/axel/archive/master.zip

$ unzip axel.zip

$ cd axel-master/

$ sudo ./configure 
Configuration done:
  Internationalization enabled.
  Debugging disabled.
  Binary stripping enabled.

$ sudo make
$ sudo make install

用法

$ axel -v -a -n 10 http://github.com/naver/pinpoint/archive/1.6.0.zip

mytget

myget 是另外一个Linux下的多线程下载工具。

安装

$ wget http://myget.sourceforge.net/release/myget-0.1.2.tar.gz
$ tar -zxvf myget-0.1.2.tar.gz
$ cd myget-0.1.2
$ sudo ./configure
$ sudo make
$ make install

用法:

$sudo mytget -n 5 http://github.com/naver/pinpoint/archive/1.6.0.zip
Redirect to: https://github.com/naver/pinpoint/archive/1.6.0.zip
Redirect to: https://codeload.github.com/naver/pinpoint/zip/1.6.0
Begin to download: pinpoint-1.6.0.zip
Filesize:  29M
  1% [>                           ] [307K] [  0B/s] [ETA:--:--