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如何实现这些任务。
- $ curl URL --silent
上面的命令将下载文件输出到终端(所下载的数据都被写入stdout
)。
--silent
选项使得curl
命令不显示进度信息。如果需要这些信息,将 --silent
移除即可。
- $ curl URL --silent -O
选项 -O
用来将下载数据写入文件,而非写入标准输出。该文件采用的是从URL中解析出的文件名。
例如:
- $ curl http://slynux.org/index.html --silent -O
这将创建文件index.html。
这条命令不再将网页写入stdout
,而是写入和URL中相同文件名的文件中。因此要确保这是一个指向远程文件的URL。curl http://slynux.org -O --silent
将会显示错误信息,因为无法从URL中解析出文件名。
- $ curl URL --silent -o new_filename
选项 -o
用来将下载的数据写入指定名称的文件中。
如果需要在下载过程中显示形如 #
的进度条,用 --progress
代替 --silent
。
- $ curl http://slynux.org -o index.html --progress
- ################################## 100.0%
5.4.3 补充内容
在5.3节中,我们学习了如何下载文件以及如何将HTML页面打印到终端。cURL还包括一些高级选项,让我们进一步研究一下。
- 断点续传
和wget
不同,cURL包含更高级的下载恢复特性,能够从特定的文件偏移处继续下载。它可以通过指定一个偏移量来下载部分文件。
- $ curl URL/file -C offset
偏移量是以字节为单位的整数。
如果我们只是想断点续传,那么cURL不需要我们知道准确的字节偏移。要是你希望cURL推断出正确的续传位置,请使用选项 -C -
,就像这样:
- $ 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
选项指定参照页字符串:
- $ curl --referer Referer_URL target_URL
例如:
- $ curl --referer http://google.com http://slynux.org
- 用cURL设置cookie
我们可以用curl
来存储HTTP操作过程中使用到的cookie。
要指定cookie,使用 --cookie "COOKIES"
选项。
COOKIES需要以name=value
的形式来给出。如果要指定多个cookie,用分号分隔,例如:
- $ curl http://example.com --cookie "user=slynux;pass=hack"
如果要将cookie另存为一个文件,使用 --cookie-jar
选项。例如:
- $ curl URL --cookie-jar cookie_file
- 用cURL设置用户代理字符串
如果不指定用户代理,一些需要检验用户代理的网页就无法显示。你可能已经注意到有些网站只能在Internet Explorer(IE)下正常工作,如果使用其他浏览器,这些网站就会提示说它只能用IE访问。这是因为这些网站检查了用户代理。你可以用curl
把用户代理设置成IE,而后你就会发现网页又能正常显示了。
用cURL的 --user-agent
或 -A
选项可以设置用户代理:
- $ curl URL --user-agent "Mozilla/5.0"
其他HTTP头部信息也可以通过cURL来发送。用-H"头部信息"
传递多个头部信息。例如:
- $ curl -H "Host: www.slynux.org" -H "Accept-language: en" URL
- 限定cURL可占用的带宽
如果带宽有限,又有多个用户共享,为了平稳流畅地分享带宽,我们可以用--limit-rate
限制cURL的下载速度:
- $ curl URL --limit-rate 20k
在命令中用k
(千字节)和m
(兆字节)指定下载速度限制。
- 指定最大下载量
可以用--max-filesize
选项指定可下载的最大文件大小:
- $ curl URL --max-filesize bytes
如果文件大小超出限制,命令返回一个非0的退出码。如果命令正常运行,返回0。
- 用cURL进行认证
可以用cURL的选项 -u
完成HTTP或FTP认证。
-u username:password
可用来指定用户名和密码。它也可以不指定密码,而在后续的运行过程中经提示输入密码。
如果你喜欢经提示后输入密码,只需要使用 -u username
即可。例如:
- $ curl -u user:pass http://test_auth.com
要使用密码提示的话,则用:
- $ curl -u user http://test_auth.com
- 只打印响应头部信息(不包括数据部分)
只打印响应头部(response header)有助于进行各种检查或统计。例如,要求无须下载整个页面内容就能够检验某个页面是否能够打开,那么我们只用读取HTTP响应头部就能够知道这个页面是否可用。
检查HTTP头部的一个用例就是在下载之前先查看文件大小。我们可以在下载之前,通过检查HTTP头部中的 Content-Length
参数来得知文件的长度。同样还可以从头部检索出其他一些有用的参数。Last-Modified
参数能告诉我们远程文件最后的改动时间。
通过 -I
或-head
就可以只打印HTTP头部信息,而无须下载远程文件。例如:
- $ curl -I http://slynux.org
- HTTP/1.1 200 OK
- Date: Sun, 01 Aug 2010 05:08:09 GMT
- 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
- Last-Modified: Thu, 19 Jul 2007 09:00:58 GMT
- ETag: "17787f3-3bb0-469f284a"
- Accept-Ranges: bytes
- Content-Length: 15280
- Connection: close
- Content-Type: text/html
5.4.4 参考
5.13节