Skip to Content

利用wget做网站镜像的bash脚本

labrador 的头像
wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有。不过用它来dump比较现代的网站会有一个问题:不支持css文件,它不会自动下载、重新链接css中所指定的图片。这个问题导致的最常见的后果是dump下来的网站看不到背景图片。本文所介绍的这个脚本主要就是用来解决这个缺陷的。

这里简要介绍一下这个脚本的细节:
  • 第3行用于设置要下载的网站的地址。
  • 第10行用于将文件名转换为windows兼容的格式。windows对文件名格式的要求比unix更为苛刻一点,这里指定为windows也可以兼容unix系统。总的来说,wget的这个功能稍微弱了一点,面对一些更苛刻的系统就没有办法了。
  • 第13行用于忽略robots.txt。很多网站的css、js文件都是在robots.txt中被定义为spider不可访问的。
  • 第15、16行用于忽略某些目录和文件。因为没有了robots.txt的限制,wget可能会去访问一些不需要的东西。这里可以根据具体情况做限制。
  • 第19~24行下载css中链接的文件。
  • 第26~29行修正css中的链接。
以下是这个脚本的内容
#!/bin/sh

ADDR="http://www.EXAMPLE.com/"

SERVER=${ADDR#http://}
SERVER=${SERVER%%/*}

wget \
    --html-extension \
    --restrict-file-names=windows \
    --convert-links \
    --page-requisites \
    --execute robots=off \
    --mirror \
    --exclude-directories /comment/reply/,/aggregator/,/user/ \
    --reject "aggregator*" \
    "$ADDR"

find $SERVER -type f -name "*.css" -exec cat {} \; |
grep -o 'url(/[^)]*)' |
sort | 
uniq |
sed 's/^url(\(.*\))$/http:\/\/'$SERVER'\1/' |
wget --mirror --page-requisites -i -

for i in `find $SERVER -type f -name "*.css"`; do
    PREFIX="$(echo $i | sed 's/[^\/]*//g; s/\/$//; s/\//..\\\//g')"
    sed -i 's/url(\//url('$PREFIX'/g' $i
done

发表新评论

  • 你可以在文本中使用BBCode标记语言。 URL会自动被转为链接。

更多关於格式化选项的信息

CAPTCHA
请验证您是否是机器人。
Image CAPTCHA
Enter the characters shown in the image.