为何wget无法镜像目标网站中的.zip文件?
我完全懂你的感受——本来以为用wget的镜像模式批量抓zip文件应该是个简单活儿,结果折腾半天没动静,连debug模式都看不到相关路径,确实让人摸不着头脑!
先给你拆解下问题根源:
首先,那些不带协议的//download.damieng.com/...链接不是bug,是Web开发里很常见的相对协议URL,它会自动继承当前页面的协议(这里是https),wget本身是支持解析这种链接的,所以问题不在这儿。
真正的坑出在你用的-A .zip参数上!你可能以为这个参数只是用来筛选最终要下载的zip文件,但实际上wget的-A(accept)规则会同时影响它爬取的页面:当你只指定.zip时,wget会跳过所有非zip格式的文件——包括那些包含zip链接的子页面(比如/zx-origins/sub-page这类html页面)!连子页面都没爬取,自然就提取不到里面的zip链接了,这就是为什么debug里看不到相关路径的原因。
修正后的命令
你需要调整-A参数,让wget允许爬取html页面(这样才能提取里面的zip链接),同时只保留zip文件的下载。可以把-A改成同时包含.html和.zip:
wget -m -e robots=off -D download.damieng.com,damieng.com -A .html,.zip https://damieng.com/typography/zx-origins/
额外优化建议
如果之后发现下载了太多不需要的html文件,可以爬完后用find命令批量清理:
find ./damieng.com -name "*.html" -delete
另外,如果你担心无协议链接的解析问题,可以加上--trust-server-names参数,让wget更准确地处理服务器返回的文件名和链接格式。
运行修正后的命令后,wget会先爬取所有相关的html子页面,从中提取出zip链接,再去下载这些zip文件,而且因为指定了-D,只会处理目标域名下的内容,不会乱爬其他网站。
备注:内容来源于stack exchange,提问作者Stefan Midjich

