5.2 网站下载

从给定的URL中下载文件或网页很简单,一些命令行下载工具就可以完成这项任务。

5.2.1 预备知识

wget是一个用于文件下载的命令行工具,选项多且用法活。

5.2.2 实战演练

wget可以下载网页或远程文件:

  1. $ wget URL

例如:

  1. $ wget http://slynux.org
  2. --2010-08-01 07:51:20-- http://slynux.org/
  3. Resolving slynux.org... 174.37.207.60
  4. Connecting to slynux.org|174.37.207.60|:80... connected.
  5. HTTP request sent, awaiting response... 200 OK
  6. Length: 15280 (15K) [text/html]
  7. Saving to: "index.html"
  8.  
  9. 100%[======================================>] 15,280 75.3K/s in
  10. 0.2s
  11.  
  12. 2010-08-01 07:51:21 (75.3 KB/s) - "index.html" saved [15280/15280]

可以指定从多个URL处进行下载:

  1. $ wget URL1 URL2 URL3..

可以依据URL用wget下载文件:

  1. $ wget ftp://example_domain.com/somefile.img

通常下载的文件名和URL中的文件名保持一致,下载信息或进度被写入stdout

你可以通过选项-O指定输出文件名1。如果存在同名文件,那么会先将该同名文件清空(truncate)再将下载文件写入。

1 选项'-O file'中的-O并不是表示不采用URL中的文件名,而是由file指定。它的作用类似于shell重定向,也就是说,命令wget -O file http://foo实际上相当于wget -O - http://foo > file

你也可以用选项-o指定一个日志文件,从而不必将日志信息打印到stdout

  1. $ wget ftp://example_domain.com/somefile.img -O dloaded_file.img -o log

运行该命令,屏幕上不会出现任何内容。日志或进度信息被写入文件log,输出文件为dloaded_file.img。

由于不稳定的Internet连接,下载有可能被迫中断。我们可以将重试次数作为命令参数,这样一旦下载中断,wget在放弃下载之前还会继续进行多次尝试。

-t指定重试次数:

  1. $ wget -t 5 URL

5.2.3 补充内容

wget还有一些其他选项,用以应对不同的情况。来看看其中的一部分吧。

  • 下载限速

当我们的下载带宽有限,却又有多个应用程序共享该Internet连接时,进行大文件下载往往将榨干所有的带宽,严重阻滞其他进程。wget命令有一个内建的选项可以限定下载任务能够占有的最大带宽,从而使得其他应用程序流畅运行。

我们可以用--limit-rate按照下面的方式对wget限速:

  1. $ wget --limit-rate 20k http://example.com/file.iso

在命令中用k(千字节)和m(兆字节)指定速度限制。

还可以指定最大下载配额(quota)。配额一旦用尽,下载随之停止。在下载多个文件的时候,对总下载量进行限制是很必要的,这能够避免在无意中占用过多磁盘空间。

使用--quota-Q

  1. $ wget -Q 100m http://example.com/file1 http://example.com/file2
  • 断点续传

如果使用wget进行的下载在完成之前被中断,可以利用选项-c从断点开始继续下载:

  1. $ wget -c URL
  • 用cURL下载

cURL是另一个高级命令行工具,功能比wget更胜一筹。

可以按照下面的方式用cURL下载:

  1. $ curl http://slynux.org > index.html

wget不同,curl并不将下载数据写入文件,而是写入标准输出(stdout)。因此我们必须用重定向操作符将数据从stdout重定向到文件。

  • 复制或镜像整个网站

wget有一个选项可以使其像爬虫一样以递归的方式收集网页上所有的URL链接,并逐个下载,这样一来,我们就能够下载一个网站的所有页面。

要实现这个任务,可以按照下面的方式使用选项--mirror

  1. $ wget --mirror exampledomain.com

或者

  1. $ wget -r -N -l DEPTH URL

-l指定页面层级DEPTH,这意味着wget只会向下遍历指定的页面级数。这个选项要与-r(recursive,递归选项)一同使用。另外,-N允许对文件使用时间戳,URL表示下载的网站起始地址。

  • 访问需要认证的HTTP或FTP页面

一些网页需要HTTP或FTP认证,可以用--user--password提供认证信息:

  1. $ wget --user username --password pass URL

也可以不在命令行中指定密码,而由网页提示并手动输入密码,这就需要将--password改为--ask-password