5.4 cURL入门

作为一款强力工具,cURL支持包括HTTP、HTTPS、FTP在内的众多协议。它还支持POST、cookie、认证、从指定偏移处下载部分文件、参照页(referer)、用户代理字符串、扩展头部(extra header)、限速、文件大小限制、进度条等特性。如果你想将网页处理流程及数据检索自动化,那么cURL会助你一臂之力。这则攻略将为你展示cURL一系列最为重要的特性。

5.4.1 预备知识

在默认情况下,主流Linux发行版中并没有包含cURL,你得使用包管理器进行安装。不过多数发行版都默认附带了wget

cURL通常将下载文件输出到stdout,将进度信息输出到stderr。要想避免显示进度信息,请使用--silent选项。

5.4.2 实战演练

curl命令可以用来执行下载、发送各种HTTP请求、指定HTTP头部等操作。让我们看看用cURL如何实现这些任务。

  1. $ curl URL --silent

上面的命令将下载文件输出到终端(所下载的数据都被写入stdout)。

--silent选项使得curl命令不显示进度信息。如果需要这些信息,将 --silent移除即可。

  1. $ curl URL --silent -O

选项 -O用来将下载数据写入文件,而非写入标准输出。该文件采用的是从URL中解析出的文件名。

例如:

  1. $ curl http://slynux.org/index.html --silent -O

这将创建文件index.html。

这条命令不再将网页写入stdout,而是写入和URL中相同文件名的文件中。因此要确保这是一个指向远程文件的URL。curl http://slynux.org -O --silent将会显示错误信息,因为无法从URL中解析出文件名。

  1. $ curl URL --silent -o new_filename

选项 -o用来将下载的数据写入指定名称的文件中。

如果需要在下载过程中显示形如 # 的进度条,用 --progress代替 --silent

  1. $ curl http://slynux.org -o index.html --progress
  2. ################################## 100.0%

5.4.3 补充内容

在5.3节中,我们学习了如何下载文件以及如何将HTML页面打印到终端。cURL还包括一些高级选项,让我们进一步研究一下。

  • 断点续传

wget不同,cURL包含更高级的下载恢复特性,能够从特定的文件偏移处继续下载。它可以通过指定一个偏移量来下载部分文件。

  1. $ curl URL/file -C offset

偏移量是以字节为单位的整数。

如果我们只是想断点续传,那么cURL不需要我们知道准确的字节偏移。要是你希望cURL推断出正确的续传位置,请使用选项 -C -,就像这样:

  1. $ curl -C - URL

cURL会自动计算出应该从哪里开始续传。

  • 用cURL设置参照页字符串

参照页(referer1)是位于HTTP头部中的一个字符串,用来标识用户是从哪个页面到达当前页面的。如果用户点击了网页A中的某个链接,那么用户就会转到网页B,网页B头部的参照页字符串会包含网页A的URL。

1 referer其实应该是英文单词referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。

一些动态网页会在返回HTML页面前检测参照页(referer)字符串。例如,如果用户是通过Google搜索来到了当前网页,网页上会附带显示一个Google的logo;如果用户是通过手动输入URL来到当前网页,则显示一个不同的网页。

网页可以根据条件进行判断,如果参照页是www.google.com,那么就返回一个Google页面,否则返回其他页面。

你可以用curl命令的 --referer选项指定参照页字符串:

  1. $ curl --referer Referer_URL target_URL

例如:

  1. $ curl --referer http://google.com http://slynux.org
  • 用cURL设置cookie

我们可以用curl来存储HTTP操作过程中使用到的cookie。

要指定cookie,使用 --cookie "COOKIES"选项。

COOKIES需要以name=value的形式来给出。如果要指定多个cookie,用分号分隔,例如:

  1. $ curl http://example.com --cookie "user=slynux;pass=hack"

如果要将cookie另存为一个文件,使用 --cookie-jar选项。例如:

  1. $ curl URL --cookie-jar cookie_file
  • 用cURL设置用户代理字符串

如果不指定用户代理,一些需要检验用户代理的网页就无法显示。你可能已经注意到有些网站只能在Internet Explorer(IE)下正常工作,如果使用其他浏览器,这些网站就会提示说它只能用IE访问。这是因为这些网站检查了用户代理。你可以用curl把用户代理设置成IE,而后你就会发现网页又能正常显示了。

用cURL的 --user-agent-A选项可以设置用户代理:

  1. $ curl URL --user-agent "Mozilla/5.0"

其他HTTP头部信息也可以通过cURL来发送。用-H"头部信息"传递多个头部信息。例如:

  1. $ curl -H "Host: www.slynux.org" -H "Accept-language: en" URL
  • 限定cURL可占用的带宽

如果带宽有限,又有多个用户共享,为了平稳流畅地分享带宽,我们可以用--limit-rate限制cURL的下载速度:

  1. $ curl URL --limit-rate 20k

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

  • 指定最大下载量

可以用--max-filesize选项指定可下载的最大文件大小:

  1. $ curl URL --max-filesize bytes

如果文件大小超出限制,命令返回一个非0的退出码。如果命令正常运行,返回0。

  • 用cURL进行认证

可以用cURL的选项 -u完成HTTP或FTP认证。

-u username:password可用来指定用户名和密码。它也可以不指定密码,而在后续的运行过程中经提示输入密码。

如果你喜欢经提示后输入密码,只需要使用 -u username即可。例如:

  1. $ curl -u user:pass http://test_auth.com

要使用密码提示的话,则用:

  1. $ curl -u user http://test_auth.com
  • 只打印响应头部信息(不包括数据部分)

只打印响应头部(response header)有助于进行各种检查或统计。例如,要求无须下载整个页面内容就能够检验某个页面是否能够打开,那么我们只用读取HTTP响应头部就能够知道这个页面是否可用。

检查HTTP头部的一个用例就是在下载之前先查看文件大小。我们可以在下载之前,通过检查HTTP头部中的 Content-Length 参数来得知文件的长度。同样还可以从头部检索出其他一些有用的参数。Last-Modified参数能告诉我们远程文件最后的改动时间。

通过 -I-head 就可以只打印HTTP头部信息,而无须下载远程文件。例如:

  1. $ curl -I http://slynux.org
  2. HTTP/1.1 200 OK
  3. Date: Sun, 01 Aug 2010 05:08:09 GMT
  4. Server: Apache/1.3.42 (Unix) mod_gzip/1.3.26.1a mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a
  5. Last-Modified: Thu, 19 Jul 2007 09:00:58 GMT
  6. ETag: "17787f3-3bb0-469f284a"
  7. Accept-Ranges: bytes
  8. Content-Length: 15280
  9. Connection: close
  10. Content-Type: text/html

5.4.4 参考

5.13节