wget下载总结

wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

命令格式:

wget [参数列表] [目标软件、网页的网址]

-a<日志文件>:在指定的日志文件中记录资料的执行过程;
-A <后缀名>:指定要下载文件的后缀名,多个后缀名之间使用逗号进行分隔;
-R <后缀名>:指定拒绝下载的后缀名,多个后缀名之间使用逗号进行分隔;
-b:进行后台的方式运行wget;
-B<连接地址>:设置参考的连接地址的基地地址;
-c:继续执行上次终端的任务;
-C<标志>:设置服务器数据块功能标志on为激活,off为关闭,默认值为on;
-d:调试模式运行指令;
-D<域名列表>:设置顺着的域名列表,域名之间用“,”分隔;
-e<指令>:作为文件“.wgetrc”中的一部分执行指定的指令;
-h:显示指令帮助信息;
-i<文件>:从指定文件获取要下载的URL地址;
-l<目录列表>:设置顺着的目录列表,多个目录用“,”分隔;
-L:仅顺着关联的连接;
-r:递归下载方式;
-nc:文件存在时,下载文件不覆盖原有文件;
-nv:下载时只显示更新和出错信息,不显示指令的详细执行过程;
-q:不显示指令执行过程;
-nh:不查询主机名称;
-v:显示详细执行过程;
-V:显示版本信息;
--passive-ftp:使用被动模式PASV连接FTP服务器;
--follow-ftp:从HTML文件中下载FTP连接文件。

1、用Wget下载单个文件

从网络下载一个文件并保存在当前目录,在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz

2、指定下载文件的文件名

wget默认会以最后一个符合”/”的后面的字符来命令,对于动态链接的下载通常文件名会不正确。
错误:下面的例子会下载一个文件并以名称download.php?id=1080保存

wget http://www.centos.bz/download?id=1 

即使下载的文件是zip格式,它仍然以download.php?id=1080命令。
正确:为了解决这个问题,我们可以使用参数-O来指定一个文件名:

wget -O download.zip http://www.centos.bz/download.php?id=1080 

3、限速下载

当你执行wget的时候,它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件,而你还需要下载其它文件时就有必要限速了。

wget –limit-rate=300k http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.g

4、断点续传

当你在下载一个大文件时突然中断了那么这个选项就派上用场了

wget -c http://cn.wordpress.org/http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz 

5、后台下载用wget -b

用此选项下载时只会初始化下载而不会显示相关信息

wget -b http://www.linuxde.net/testfile.zip

查看下载进度:

tail -f wget-log

6、伪装代理名称下载(agent)

有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。不过你可以通过–user-agent参数伪装。

wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.linuxde.net/testfile.zip

7、测试下载链接

wget --spider URL

如果所给URL是正确的则会显示

Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.

否则显示

wget --spider url
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!

8、增加重连次数用

在网络有问题的情况次选项尤其有用,默认是wget会重连20次以成功完成下载,我们可以把他增加为我们期待的次数

wget --tries=100 DOWNLOAD-URL

9、下载多个文件

首先把所有要下载的文件或者URL存到一个记事本中,比如aa.txt,里面内容如下

URL1
URL2
URL3
URL4

接下来输入如下代码就可以批量下载了

wget -i aa.txt

10、下载一个完整的网站用

以下实现是你想完整的下载一个网站用于本地浏览

wget --mirror  -p --convert-links -P LOCAL-DIR WEBSITE-URL

–mirror:打开镜像选项

-p:下载所有用于显示给定网址所必须的文件

–convert-links:下载以后,转换链接用于本地显示

-P LOCAL_DIR:保存所有的文件或目录到指定的目录下

11、保存输出到日志文件而不是标准输出用

当你想要把信息保存到一个文件而不是在终端显示时用以下代码。

wget -o download.log DOWNLOAD-URL

12、当超过指定大小时终止下载用

当文件已下载10M,此时你想停止下载可以使用下面的命令行

wget -Q10m -i FILE-WHICH-HAS-URLS

注意:此选项只能在下载多个文件时有用,当你下载一个文件时没用。

13、下载特定文件类型的文件用

你可以用此方法下载一下文件:

~从一个网站下载所有图片
~从一个网站下载所有视频

~从一个网站下载所有PDF文件

wget -r -A.pdf http://url-to-webpage-with-pdfs/

14、指定不下载某一类型的文件用

你发现一个网站很有用,但是你不想下载上面的图片,因为太占流量,此时你可以用如下命令。

wget --reject=gif WEBSITE-TO-BE-DOWNLOADED

15、用wget实现FTP下载

匿名FTP下载用

wget ftp-url

有用户名和密码的FTP下载

wget --ftp-user=USERNAME --ftp-password=PASSWORD DOWNLOAD-URL

16、wget下载有的资源时必须用选项 --no-check-certificate,否则会提示没有认证不允许下载

wget --no-check-certificate URL

17、密码和认证。

wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:

--http-user=USER 设置HTTP用户–http-passwd=PASS 设置HTTP密码

对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。

18、利用代理服务器进行下载

如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个 .wgetrc 文件。文件中可以设置代理服务器:

http-proxy = 111.111.111.111:8080ftp-proxy = 111.111.111.111:8080

分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:

–proxy-user=USER 设置代理用户–proxy-passwd=PASS 设置代理密码

这两个参数。

使用参数 –proxy=on/off 使用或者关闭代理。

19、设定下载时间

如果你需要在你的办公电脑上通过和其他同事共享的一个连接来下载一些很大的文件,而且你希望你的同事不会因为网络速度的减慢而收到影响,那你就应该尽量避开高峰时段。当然,不需要在办公室里等到所以人都走掉,也不需要在家里用完晚饭后还惦记着要上网下载一次。

用at来就可以很好的定制工作时间:

$ at 2300
warning: commands will be executed using /bin/sh
at> wget http://place.your.url/here
at> press Ctrl-D

这样,我们设定了下载工作在晚上11点进行。为了使这个安排能够正常进行,请确认atd这个后台程序正在运行。

20、定时下载

当你需要下载大量的数据,而且你又没有享有足够的带宽,这个时候你会经常发现在你安排的下载任务还没有完成,一天的工作却又要开始了。

作为一个好同事,你只能停掉了这些任务,而开始另外的工作。然后你又需要反复地重复使用”wget -c”来完成你的下载。这样肯定太繁琐了,所以最好是用crontab来自动执行。创建一个纯文本文件,叫做”crontab.txt”,包含下面的内容:

0 23 * * 1-5 wget -c -N http://place.your.url/here
0 6 * * 1-5 killall wget

这个crontab文件指定某些任务定期地执行。前五列声明是什么时候执行这个命令,而每行的剩余部分则告诉crontab执行什么内容。

前两列指定了每天一到晚上11点就开始用wget下载,一到早上6点就停止一切wget下载。第三四列的*表示每个月的每一天都执行这个任务。第五列则指定了一个星期的哪几天来执行这个程序。 –”1-5″表示从星期一到星期五。

这样在每个工作日的晚上11点,下载工作开始,到了上午的6点,任何的wget任务就被停掉了。你可以用下面的命令来执行crontab:

$ crontab crontab.txt

wget的这个“-N”参数将会检查目标文件的时间戳,如果匹配了,下载程序就会停止,因为它说明整个文件已经下载完全了。

用“crontab -r”可以删除这个计划安排。我已经多次采用这种方法,通过共享的电话拨号来下载过很多的ISO镜像文件,还是比较实用的。

21、下载动态变化的页面

有些网页每天都要根据要求变化好几次。所以从技术上讲,目标不再是一个文件,它没有文件长度,因此”-c”这个参数也就失去了意义。

例如:一个PHP写的并且经常变动的linux周末新闻网页:

$ wget http://lwn.net/bigpage.php3

我办公室里的网络条件经常很差,给我的下载带了很大的麻烦,所以我写了个简单的脚本来检测动态页面是否已经完全更新了。

#!/bin/bash
#create it if absent
touch bigpage.php3
 
#check if we got the whole thing
while ! grep -qi bigpage.php3
do
rm -f bigpage.php3
 
#download LWN in one big page
wget http://lwn.net/bigpage.php3
 
done

这个脚本能够保证持续的下载该网页,直到网页里面出现了””,这就表示该文件已经完全更新了.

22、对于ssl和Cookies怎么办?

如果你要通过ssl来上网,那么网站地址应该是以 https: 来开头的,在这样的情况下你就需要另外一种下载工具,叫做curl,它能够很容易获得.有些网站迫使网友在浏览的时候必须使用cookie。所以你必须从在网站上得到的那个Cookie里面得到“Cookie:”这个参数.这样才能保证下载的参数正确。对于lynx和Mozilla的Cookie的文件格式,用下面的:

$ cookie=$( grep nytimes ~/.lynx_cookies |awk {printf(”%s=%s;”,$6,$7)} )

就可以构造一个请求Cookie来下载 http://www.nytimes.com 上的内容。当然,你要已经用这个浏览器在该网站上完成注册。

w3m使用了一种不同的,更小巧的Cookie文件格式:

$ cookie=$( grep nytimes ~/.w3m/cookie |awk {printf(”%s=%s;”,$2,$3)} )

现在就可以用这种方法来下载了:

$ wget –header="Cookie: $cookie" http://www.nytimes.com/reuters/technology/tech-tech-supercomput.html

或者用curl工具:

$ curl -v -b $cookie -o supercomp.html http://www.nytimes.com/reuters/technology/tech-tech-supercomput.htm

23、如何建立地址列表?

到现在为止我们下载的都是单个文件或者是整个网站.有的时候我们需要下载某个网页上链接的大量文件,但没有必要把它整个网站都镜像下来.比如说我们想从一个依次排列的100首歌里面下载前20首.注意,这里”–accept”和”–reject”参数是不会起作用的,因为他们只对文件操作起作用.所以一定要用”lynx -dump”参数来代替。

$ lynx -dump ftp://ftp.xxx.com/pub/lg/ |grep gz$ |tail -10 |awk {print $2} > urllist.txt

lynx的输出结果可以被各种GNU文本处理工具过虑.在上面的例子里,我们的链接地址是以”gz”结尾的,并且把最后10个文件地址放到 urllist.txt文件里.然后我们可以写一个简单的bash脚本来自动下载这个文件里的目标文件:

$ for x in $(cat urllist.txt)
> do
> wget $x
> done

这样我们就能够成功下载Linux Gazette网站(ftp://ftp.xxx.com/pub/lg/)上的最新10个论题。

24、扩大使用的带宽

如果你选择下载一个受带宽限制的文件,那你的下载会因为服务器端的限制而变得很慢.下面这个技巧会大大缩短下载的过程.但这个技巧 需要你使用curl并且远程服务器有多个镜像可以供你下载.例如,假设你想从下面的三个地址下载Mandrake 10.0:

url1=http://ftp.eecs.umich.edu/pub/linux/mandrake/iso/Mandrake10.0-inst.iso
url2=http://ftp.rpmfind.net/linux/Mandrake/iso/Mandrake10.0-inst.iso
url3=http://ftp.wayne.edu/linux/mandrake/iso/Mandrake10.0-inst.iso

这个文件的长度是677281792个字节,所以用curl程序加”–range”参数来建立三个同时进行的下载:

$ curl -r 0-199999999 -o mdk-iso.part1 $url1 &
$ curl -r 200000000-399999999 -o mdk-iso.part2 $url2 &
$ curl -r 400000000- -o mdk-iso.part3 $url3 &

这样就创建了三个后台进程.每个进程从不同的服务器传输这个ISO文件的不同部分.这个”-r”参数指定目标文件的字节范围.当这三个 进程结束后,用一个简单的cat命令来把这三个文件衔接起来– cat mdk-iso.part? > mdk-80.iso.(强烈建议在刻盘之前先检查md5) 你也可以用”–verbose”参数来使每个curl进程都有自己的窗口来显示传输的过程。

wget还有很多有用的功能,需要您来挖掘。

你可能感兴趣的:(linux)