wget 与 curl 命令详解

wget 命令

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

命令格式

wget [选项] URL资源

示例

下载单个文件

wget http://www.example.com/testfile.zip

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

下载并以不同的文件名保存

wget -O myfile.zip http://www.example.com/testfile.zip

  • -O 自定义文件名 重命名下载的文件

如果不指定”-O” 选项,wget 默认会以 url 路径最后一个 “/“ 的后面全部字符为下载的文件名,如 wget http://www.example.com/testfile?id=123,下载后的文件名就为 testfile?id=123

断点续传

wget -c http://www.example.com/testfile.zip

  • -c 继续接着执行上次未下载完的任务

当下载的文件特别大或者网络原因,文件没有下载完连接就已经被断开,使用 -c 选项可以在网络连接恢复时接着上次的下载任务继续下载,而不需要重头开始下载文件

wget 默认重试 20 次连接下载文件,如果网络一直有问题下载可能失败。如果需要的话,你可以使用–tries 增加重试次数。例如设置最多重试 40 次:wget --tries=40 http://www.example.com/testfile.zip

后台下载

wget -b http://www.example.com/testfile.zip

  • -b 以后台运行的方式下载

对于下载非常大的文件不能及时下载完时,可以进行后台下载。后台下载时会在当前下载目录下创建一个 “wget-log” 文件记录下载日志,可以使用 tail -f wget-log 命令查看下载进度

带宽控制和下载配额

wget --limit-rate=下载速度 http://www.example.com/testfile.zip

  • --limit-rate=下载速度 限定不超过指定的下载速度。例如:--limit-rate=300k

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

如果还需要限制下载配额,可使用选项 “-Q 下载配额“,下载数据超过了指定配额会停止下载。注意,该选项对于单个文件下载无效,只适用于多文件下载或递归下载,例如:wget -Q 10m -i dowload.txt,如果不指定下载配额会下载 download.txt 文件包含的所有 url,如果指定了下载配额为 10m,下载数据超过了 10m 会停止后面 url 的下载(一个文件正在下载过程中下载数据超过了下载配额会继续完成该文件的下载不会立即停止下载)。

多文件下载

wget -i url 文件

  • -i url 文件 从指定文件获取要下载的 URL 地址

如果有多个 url 资源需要下载,那么可以先生成一个文件,把下载地址的 url 按行写入该文件,然后使用 “-i” 选项指定该文件就可以批量下载了

密码认证下载

wget --http-user=USER --http-password=PASS http://www.example.com/testfile.zip

  • --http-user=USER 设置 http 用户名为 USER
  • --http-password=PASS 设置 http 密码为 PASS
  • --ftp-user=USER 设置 ftp 用户名为 USER
  • --ftp-password=PASS 设置 ftp 密码为 PASS

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

递归下载

wget -r http://www.example.com/path1/path2/

  • -r 递归在下整个站点(www.example.com)资源
  • -nd 递归下载时不创建一层一层的目录,把所有的文件下载到当前目录;不指定该选项默认按照资源在站点位置创建相应目录
  • -np 递归下载时不搜索上层目录,只在当前路径 path2 下进行下载;不指定该选项默认搜素整个站点
  • -A 后缀名 指定要下载文件的后缀名,多个后缀名之间使用逗号进行分隔
  • -R 后缀名 排除要下载文件的后缀名,多个后缀名之间使用逗号进行分隔
  • -L 递归时不进入其它主机。不指定该选项的话,如果站点包含了外部站点的链接,这样可能会导致下载内容无限大

示例,只下载 path2 路径下的所有 pdf 和 png 文件,不创建额外目录全都保存在当前下载目录下:
wget -r -nd -np -A pdf,png http://www.example.com/path1/path2/

curl 命令

curl 命令是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。作为一款强力工具,curl 支持包括 HTTP、HTTPS、ftp 等众多协议,还支持 POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl 可以祝一臂之力。

与 wget 类似的下载功能

单个文件下载

curl [-o 自定义文件名|-O] http://www.example.com/index.html

  • -o 自定义文件名 把服务器响应输出到指定文件
  • -O 与-o 选项作用一样,区别在于以 url 路径最后一个”/“之后的部分作为文件名

如果这两个选项都不写,curl 默认会把服务器响应内容输出到终端

断点续传

curl -O -C 偏移量 http://www.example.com/testfile.zip

  • -C 偏移量 从指定的偏移量处继续下载,偏移量以字节为单位

如果让 curl 自动推断出正确的续传位置可以使用 “-“ 代替偏移量,例如:
curl -O -C - http://www.example.com/testfile.zip

带宽控制和下载配额

curl -O --limit-rate 下载速度 http://www.example.com/testfile.zip

  • --limit-rate 下载速度 限定不超过指定的下载速度。例:–limit-rate 500k
  • --max-filesize 下载配额 指定最大可下载文件大小

处理复杂的 web 请求

自动跳转

curl -L http://www.example.com

  • -L 自动跳转到重定向链接(Location)

有些链接访问时会自动跳转(响应状态码为 3xx),-L 参数会让 HTTP 请求跟随服务器的重定向。例如:访问 “http://a.com" 会重定向到 “http://b.com",使用"-L"选项会返回http://b.com" 的响应内容

显示响应头信息

curl -i http://www.example.com

  • -i 输出包含响应头信息
  • -I 输出仅包含响应头信息,不包含响应内容

显示通信过程

curl -v http://www.example.com

  • -v 显示一次 http 通信的整个过程,包括端口连接和 http request 头信息

如果还需要查看额外的通信信息,还可以使用选项 “--trace 输出文件“ 或者 “--trace-ascii 输出文件“,例如:curl --trace-ascii output.txt http://www.example.com,打开文件 “output.txt”可以查看结果。

指定 http 请求方式

curl -X 请求方式 http://www.example.com/test

  • -X 请求方式指定 http 请求方式(GET|POST|DELETE|PUT 等)。默认是”GET”

添加 http 请求头

curl -H 'kev:value' http://www.example.com/test

-H 'kev:value' 添加 http 请求头。例:-H 'Content-Type:application/json'
添加多个请求头,-H 选项重复多次即可。例如:
curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' http://www.example.com/test

传递请求参数

curl -X POST -d '参数' http://www.example.com/test

  • -d '参数' 指定 POST 请求体。参数形式可以是 “k1=v1&k2=v2”, 也可以是 json 串
  • --data-urlencode '参数' 与 -d 相同,区别在于会自动将发送的数据进行 URL 编码

使用 -d 参数以后,HTTP 请求会自动加上标头”Content-Type:application/x-www-form-urlencoded“,并且会自动将请求转为 POST 方法,因此可以省略 “-X POST”。如果要发送的请求体为 json 串,需要指定”Content-Type:application/json”,例如:
curl -d '{"user":"zhangsan", "password":"123456"}' -H 'Content-Type:application/json' http://www.example.com/login

参数较多时,可以下把参数数据保存到本地文本中,然后从文本中读取参数数据。例如:
curl -d '@requestData.txt' -H 'Content-Type:application/json' http://www.example.com/login
如果要以 GET 请求方式发送表单数据,可以直接把参数直接追加 url 之后。例如:
curl http://www.example.com/login?user=zhansan&password=123456

文件上传

curl -F 'file=@文件' https://www.example.com/test

  • -F 'file=@文件' 模拟 http 表单向服务器上传文件。更多参数形式:file=@文件;name1=value1;name2=value2

文件上传时 -F 选项默认会给 HTTP 请求头加上 Content-Type: multipart/form-data,默认文件 MIME 类型为 application/octet-stream

指定上传文件 MIME 类型。下面示例指定 MIME 类型为”image/png”
curl -F 'file=@photo.png;type=image/png' https://google.com/profile
指定上传文件名。下面示例中原始文件名为”photo.png”,但是服务器接收到的文件名为 “me.png”
curl -F 'file=@photo.png;filename=me.png' https://google.com/profile

设置来源网址

curl -e '源网址' https://www.example.com

  • -e '源网址' 或 --referer '源网址' 设置来源网址,即 http 请求头的 Referer 字段。和 -H 选项直接设置请求头 “Referer” 字段等效

设置客户端用户代理

curl -A '代理信息' https://www.example.com

  • -A '代理信息' 或 --user-agent '代理信息' 设置客户端用户代理,即 http 请求头的 User-Agent 字段。和 -H 选项直接设置请求头 “User-Agent” 字段等效

将”User-Agent”改成 Chrome 浏览器,示例:
curl -A 'Mozilla/0 (Linux; Android 0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.3987.149 Mobile Safari/537.36' https://www.example.com
移出 “User-Agent” 请求头,示例:
curl -A '' https://www.example.com

curl -b '参数' https://www.example.com

  • -b '参数' 或 --cookie '参数' 设置 cookie 参数。参数形式可以是 key1=value1;key2=value2…,也可以是一个文件
  • -c 文件 把服务器响应的 cookie 信息写入到文件中

至于具体的 cookie 的值,可以从 http response 头信息的 “Set-Cookie” 字段中得到,可以保存服务器返回的 cookie 信息到文件,再用这文件作为下次请求的 cookie 信息,如下:

1
2
curl -c cookies.txt http://example.com
curl -b cookies.txt http://example.com

设置服务器认证的用户名和密码

curl -u 'user[:password]' https://www.example.com

  • -u 'user[:password]' 设置服务器认证的用户名和密码。只有用户名时,执行 curl 后提示输入密码

wget 与 curl 对比

wget 是一个独立的下载程序,无需额外的资源库,它也允许你下载网页中或是 FTP 目录中的任何内容, 能享受它超凡的下载速度,简单直接。
curl 是一个多功能工具,是 libcurl 这个库支持的。它可以下载网络内容,但同时它也能做更多别的事情。

从用途方面,wget 倾向于网络文件下载;curl 倾向于网络接口调试,相当于一个无图形界面的 PostMan 工具