【转】wget(二)
本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。
为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅。
===
[正文开始]
wget_1
wget用英语定义就是the non-interactive network downloader,翻译过来就是非交互的网络下载器。
1 wget都支持什么协议的下载?
wget支持HTTP、HTTPS和FTP协议的下载,其中也包括通过HTTP代理的下载。看起来支持的协议没有你想想的多,但其实这已足够,我相信你很少使用除这些协议之外的协议来进行下载吧。
2 wget有哪些特色之处?简单介绍一下。
wget能够跟踪HTML文件和XHTML文件,从而使得你可以下载整个站点的文件,然后离线阅读。当然这个功能并不是特别常用,因为几乎所有站点都会包含外链,一旦你用wget进行整站的下载,它也会傻傻的去下载外链站点的内容,这样一来,子子孙孙无穷尽也。
wget是个非常遵守Robot Exclusion Standard(robots.txt)标准的工具。
wget支持慢速网络下载和不稳定网络的下载。当因为网络不稳定而导致下载失败时,wget会重试直到把目标文件下载下来为止。
wget支持断点续传功能,当你下载的很大的文件在中途失败时,这项功能会很有用处。
3 对于使用wget选项,有什么建议?
由于wget是使用getopt函数来处理选项和参数的,因此wget既支持长格式的选项,也支持短格式的选项,他们大部分是一一对应的关系。但是我不建议大家使用短选项。
当某个选项有参数时,你甚至可以在短选项和参数之间不加空格。比如-o log可以写成-olog。但是,你知道的,这也是不建议的。
如果你连续使用了多个短选项,且这些短选项不需要加参数,那么可以将他们组合在一起。比如-d -r -c可以写成-drc。恩,这是被建议的。呵呵
4 wget有什么潜规则不?
当你使用wget时,请务必查看/etc/wgetrc文件和家目录下的.wgetrc文件,先搞清楚里面都设置了什么,再来使用wget命令不迟,否则,你早晚会吃大亏的。不是危言耸听哦。
某些选项还可以接受用逗号隔开的参数。比如-X(大写的x)选项,它是用来设定“不希望下载”的目录列表。你可以用逗号把不希望下载的目录一个一个 写上。比如“wget -X wukong , bajie”,这样wget心里就有数了,他知道wukong目录和bajie目录都是不用下载的。其实你也可以在.wgetrc文件中设置“不希望下 载”的目录列表,格式是这样的:
exclude_directories=wukong,bajie
于是,你不必在wget命令上设置,就可以实现“不下载”wukong和bajie目录。
当然,如果某天你下载东西时,发现总有几个目录下载不下来,你可要想到,有可能是其他人设置了.wgetrc造成的哦!当然你还要再去/etc/wgetrc文件中再查看一下,那里也是一个可疑的地方。
还有一个小技巧,也可以避免这种误会(别人设置了exclude_directories,而你却不知道),那就是在你使用wget时,这样写:
wget -r -X ” -X wukong,bajie ftp://localhost
使用-X ”的目的就是去除.wgetrc和/etc/wgetrc的作用,然后再用-X wukong,bajie设置,就可以踏踏实实的保证不下载wukong和bajie目录,而其他目录绝不会受影响。
小总结一下:.wgetrc和-X和/etc/wgetrc的设置都是属于平等关系,三者在使用时会进行并集。而在设置了-X ”时,就完全去掉了.wgetrc和/etc/wgetrc对于目录限制的作用。
5 wget不是只能下单个文件么?怎么能下目录呢?
你也太小看wget了。加上-r选项你试试,这就是传说中的“递归下载”。呵呵
6 wget命令的版本是多少?
使用wget -V(注意是大写的v哦)就可以查看了,或者是–version。我的是1.11.4(Red Hat Modified)
7 我怎么能让wget进入后台执行呢?
使用–background!启动的wget会立即进入后台执行。如果没有使用-o选项设置日志文件的话,缺省是记录在当前目录的wget-log 文件中,其实这个日志就是当初输出到屏幕上的那些东东。更重要的一点是,即使你的远程终端连接被ctrl-D或exit了,也不会影响wget的后台执 行。
有人会问,我使用wget -r ftp://localhost/a &是不是也可以进入后台阿。你可以试试看,这样写不行的。你会发现即使瞬间看到命令提示符了,但也会瞬间被刷新了的进度条所重新覆盖。而且你使用 ctrl-c还无法终止。只能kill进程来杀掉。所以说,如果你想进入后台执行,还是老老实实的使用–background吧!
8 wget在下载网站时如果遇到robots.txt全禁怎么办?
这时候,你可以使用“–execute 选项加参数”,它和把参数放到.wgetrc里的效果是一样的。你使用–execute robots=off就可以躲开robots.txt的追捕喽!
wget_2
上次提到了wget可以避免robots.txt的事情。这篇文章就做个试验,让大家亲身体验。跟着我的思路来走。
1 我们搭建了一个临时的apache-1.3.41服务器,端口号设置成了61212。网页文件所在路径为/home/rocrocket/program/apache-1.3.41-all/htdocs,我们简称为htdocs目录。
2 在htdocs目录中,我们建立一个index.html文件,内容大致如下:
$ cat -n index.html
1 <html> 2 <head> 3 <title>rocrocket</title> 4 </head> 5 <body> 6 <ul> 7 <li><a href=rocrocket-1.html>rocrocket-1</li> 8 <li><a href=rocrocket-2.html>rocrocket-2</li> 9 </ul> 10 </body> 11 </html>
通过网页方式访问的话,效果是这样的:
3 类似的建立如下文件:
$ ls -1 index.html robots.txt roc.html rocrocket-1-1.html rocrocket-1-2.html rocrocket-1.html rocrocket-2-1.html rocrocket-2-2.html rocrocket-2.html
根据文件编号,你应该能看出他们之间的调用关系。
4 建立简单的robots.txt文件:
$ cat robots.txt User-agent: * Disallow: rocrocket-2.html
这个文件的内容就是要屏蔽rocrocket-2文件的下载和spider。
5 我们用wget来下载这个测试站点:
wget -r http://my-test.cn:61212/ $ ls -1 index.html robots.txt rocrocket-1-1.html rocrocket-1-2.html rocrocket-1.html
看!下载到的包含了robots.txt文件,但没有包含rocrocket-2及其相关的文件。
可见,robots.txt生效了,wget遵守了robots.txt的规则!
6 我如何突破robots.txt的限制呢?
使用–execute选项就可以,这个选项的作用是将其后的参数模拟“放到.wgetrc中的执行效果”。
$ wget -r --execute robots=off http://jx-nsop-test0.jx:61212/ $ ls -1 index.html rocrocket-1-1.html rocrocket-1-2.html rocrocket-1.html rocrocket-2-1.html rocrocket-2-2.html rocrocket-2.html
看,rocrocket-2系列的文件也都顺利的下载下来了:D
wget_3
当你深入学习wget时,你会发现它的选项实在是太多了,错综复杂乱如麻。今天,我们就针对常用的目录选项展开讨论。
1 -r选项
这个选项用于下载远程的文件夹,但是情况没有那么简单,对于ftp协议下载来讲,你如果使用如下命令下载
wget -r ftp://my.test.server:/home/wupengchong/img
那么,实际在当前目录下会生成my.test.server/home/wupengchong/img目录结构,可见直接使用-r选项,默认会创建一域名和绝对路径组成的目录结构的。这或许不是我们的初衷,继续向下看。
2 -nd选项
即–no-directories。当我们下载远程的数据时,可以要求wget只下载文件,不下载文件夹,所有下载的文件都平铺在当前目录下。
这时,敏锐的读者会问:“如果下载到不同路径的同名文件的话,那用-nd岂不是会造成同名文件覆盖的问题?”。答案是不会的,因为wget在下载文件时,如果当前目录下有同名文件,则会默认在新下载的文件后加上“.1”、“.2” …等标识,以示区别。
3 -x选项
即–force-directories。这个选项和–no-directories是完全相反的。–no-directories是要求绝 对不能下载和创建任何文件夹,同时所有文件都平铺在当前目录中。而–force-directories选项则要求处处都要有文件夹,即使是wget
-x http://fly.srk.fer.hr/home/robots.txt这样下载单独普通文件的命令,也会在当前目录下创建fly.srk.fer.hr/home目录结构,然后将robots.txt文件下载到fly.srk.fer.hr/home里面。
4 -nH选项
即–no-host-directories。大家已经知道了在使用wget -r命令下载目录时,默认会创建一个my.test.server文件夹的。使用-nH选项就是来禁止这种默认行为。
所以,当你用wget -r -nH ftp://my.test.server:/home/wupengchong/img命令下载数据时,会在当前目录下创建home/wupengchong/img目录结构,看,my.test.server文件夹已经不见了。
5 –protocol-directories选项
它的作用是先创建一个以协议名为名称的文件夹,例如:
wget -r –protocol-directories ftp://my.test.server:/home/wupengchong/img
则会创建如下目录结构ftp/my.test.server/home/wupengchong/img
这个选项,对于那些希望通过协议类型来区分数据的同学比较有用。
6 –cut-dirs=number选项
这个选项比较常用,它表示下载数据时,在本地创建目录时,忽略多少层目录结构。
我们拿ftp://ftp.xemacs.org/pub/xemacs/为例,如果只使用-r选项,那么本地会创建ftp.xemacs.org /pub/xemacs/目录结构,如果再加上-nH选项,则留下来的目录结构是pub/xemacs/。此处就是–cut-dirs选项起作用的地方 了。我们看一个表格吧:
只用-r选项 -> ftp.xemacs.org/pub/xemacs/
-nH -> pub/xemacs/
-nH –cut-dirs=1 -> xemacs/
-nH –cut-dirs=2 -> .
–cut-dirs=1 -> ftp.xemacs.org/xemacs/
7 -P选项
即–directory-prefix=prefix,所设置的这个prefix路径,则是用来代替当前目录的,所有本应下载到当前目录的数据都会被下载到prefix所设置的目录中去。
wget_4
使用wget时,会遇到各种突发事件。今天来讲一个。
一个800MB的大文件,在远程用wget下载,到一半时,文件被更名、被删除、被移动了,wget会发现么? 它会如何抱怨?还是傻傻地顺序读下去,直到读完800MB为止?(你可以随便猜,但真相只有一个…呵呵)
第一步:创建大文件
$ dd if=/dev/zero of=roc-big-file bs=8192 count=100000
其中if是数据输入源,of是数据输出目标,bs表示每次读写的缓冲区字节数,count是要读取多少次bs。
这条命令就是用来生成一个大小接近800MB的文件,命名为roc-big-file。
第二步:从另一台机器使用wget进行下载,限速在20k吧,要是不限速,刷刷几下就下完了,都来不及测试了该。呵呵
$ wget –limit-rate=20k ftp://yourdomain:/home/wupengchong/test/wgettest/roc-big-file
第三步:这步就是要搞点恶作剧了。我们先更名!
$ mv roc-big-file roc-big-file1
结果没问题,wget继续稳定运行。
第四步:继续恶作剧。我们移动它。
$ mkdir tmpdir
$ mv roc-big-file1 tmpdir/
没问题,稳定运行。
第五步:我们删除它!(拼了,真不信wget能这么鲁棒)
$ cd tmpdir/
$ rm -f roc-big-file1
继续稳定运行…. 只是你看不到这个文件了,从文件所在文件夹的大小也看不到变化了。
结论:
只要不是网络故障、远程文件系统故障或硬件故障,wget的鲁棒性是值得相信的。
其实,真正理解Linux文件系统的同学会知道,这并不是wget的鲁棒性,而是Linux文件系统的鲁棒性保证的。
over~
wget_5
上篇文章,给了大家不少误会,对于明白原理的朋友,不说自明;但对于不太精通Linux系统原理的朋友,上一篇的表述方法刚刚好。
今天我们继续了解wget的心,看看还有哪些体贴的功能,我们平时没有接触到的。
1 -t选项
即–tries=number,用于设置wget下载时重试的次数,当设置为0(数字零)或inf时表示无限次重试。默认的重试次数是20次。
不过wget也不是在什么情况下都会傻傻的重试的,例如在发生“connection refused”或“not found”时,wget会立即退出,不会进行重试。
2 -o选项
即–output-file=logfile,wget运行过程中输出到标准输出的内容都会被写到所设置的logfile文件中。
3 -O选项
即–output-document-file,表示wget下载的所有文件的内容会被依次追加写到所设置的file文件中,而不会创建原本的文件。在下载单独文件时使用-O选项,可以避免wget下载同名文件时默认写到“.1”后缀文件中的问题。
4 -N选项
即–timestamping,表示开启时间戳机制,wget会下载远程时间戳更新的文件。
5 -nc选项
即–no-clobber选项。
在同一个目录中,如果一个文件被多次下载,那么wget的处理方式会取决于几个重要选项,这其中就包括了-nc选项。
当多次下载同一个文件时,本次文件会被覆盖,或者被重写,或者被保护,这都是有可能的。
当使用wget多次下载同一个文件,且不使用-N,-nc或-r时,那么wget会默认在第二次下载时自动在文件名后加上“.1”后缀,第三次下载时加上“.2”后缀,以此类推。
但当我们使用了-nc选项时,wget不会使用“.1/.2”的策略,而是拒绝下载同一文件(即使文件内容是更新的了)。这个功能用于有的网页被同时指向了很多遍,那么使用-nc可以避免多次下载。
当使用wget且使用-r选项,但不使用-N选项或-nc选项时,重新下载同名文件时,当远程文件的修改时间是更新的了,那么wget会选择覆盖当前目录已有的老文件,此时使用-nc可以禁止wget这样做。(但当远程文件的修改时间并不新,那么wget就会拒绝下载。)
当使用wget且使用-N选项时,是否下载同名文件,完全取决于远程文件和本地文件的时间戳以及文件大小。-nc选项是不允许和-N选项同时设置 的。如果你同时使用了-N和-nc选项,会得到这样的错误提示“Can’t timestamp and not clobber old files at the same time.”
6 -c选项
即–continue选项,这就是大名鼎鼎的“断点续传”。无论你之前使用哪个下载工具下载了一半的文件,都可以用wget来继续下载此文件。比如:
wget -c ftp://sunsite.doc.ic.ac.uk/ls-lR.Z
当前目录已有一个ls-lR.Z文件存在,wget将假定这是一个下载了一半的文件,然后提取本地文件的文件大小,并根据此值请求从远程文件的相应文件大小处开始继续下载。
你会发现,其实wget的此断点续传策略是有隐患的,因为如果远程文件的开头部分被进行了修改,wget在进行断点续传时是意识不到这一点的,它只会傻傻的从已传文件大小之后的部分继续下载。所以使用-c选项断点续传之后,务必进行md5校验。
7 –limit-rate=amount选项
此选项适用于限速的,将速度限制在amount bytes/second, 当然也可以用单位k/m来表示,例如–limit-rate=20k将会限制速度在20KB/s。
请注意,wget实现限速的原理是在一次网络读取动作之后sleep一个特定时间段,以让平均的网络读速度降到限制值,这个策略最终会使TCP传输速度降到限制值左右。所以在传输超小文件时,可能无法达到限速的作用。
8 -w选项
即–wait=seconds选项,用于设置wget每两个请求之间间隔的秒数。这个选项很有用处,可以降低远程服务器的负载。你除了可以直接设置秒数,还可以加上m表示分钟、h表示小时、d表示天。
9 –waitretry=seconds选项
用于设置请求重试秒数。wget采用的是线性递增等待的方式,如果你设置的是10秒,那么第一次请求失败后,会等待1秒;第二次请求失败会等待2秒;直到最后达到10秒等待时间为止。所以当到达最后一次时,时间已经过了1+2+…+10=55秒。
over~
wget_others
再转点儿别的
wget 是一个命令行的下载工具。对于我们这些 Linux 用户来说,几乎每天都在使用它。下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget。
$ wget -r -np -nd http://example.com/packages/
这条命令可以下载 http://example.com 网站上 packages 目录中的所有文件。其中,-np
的作用是不遍历父目录,-nd
表示不在本机重新创建目录结构。
$ wget -r -np -nd --accept=iso http://example.com/centos-5/i386/
与上一条命令相似,但多加了一个 --accept=iso
选项,这指示 wget 仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。
$ wget -i filename.txt
此命令常用于批量下载的情形,把所有需要下载文件的地址放到 filename.txt 中,然后 wget 就会自动为你下载所有文件了。
$ wget -c http://example.com/really-big-file.iso
这里所指定的 -c
选项的作用为断点续传。
$ wget -m -k (-H) http://www.example.com/
该命令可用来镜像一个网站,wget 将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H
选项。