wget 与 curl 命令详解

wget 命令

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

命令格式:wget [选项] URL资源

1. 下载单个文件

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

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

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

  • 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

3. 断点续传

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

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

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

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

4. 后台下载

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

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

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

5. 带宽控制和下载配额

  • 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的下载(一个文件正在下载过程中下载数据超过了下载配额会继续完成该文件的下载不会立即停止下载)。

6. 多文件下载

  • wget -i url文件

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

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

7. 密码认证下载

  • 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

8. 递归下载

  • 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类似的下载功能

1. 单个文件下载

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

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

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

2. 断点续传

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

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

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

3. 带宽控制和下载配额

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

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

处理复杂的web请求

1. 自动跳转

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

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

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

2. 显示响应头信息

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

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

3. 显示通信过程

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

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

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

4. 指定http请求方式

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

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

5. 添加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

6. 传递请求参数

  • 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

7. 文件上传

  • 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 '[email protected];type=image/png' https://google.com/profile

指定上传文件名。下面示例中原始文件名为"photo.png",但是服务器接收到的文件名为 "me.png"
curl -F '[email protected];filename=me.png' https://google.com/profile

8. 设置来源网址

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

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

9. 设置客户端用户代理

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

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

将"User-Agent"改成 Chrome 浏览器,示例:
curl -A 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36' https://www.example.com

移出 "User-Agent" 请求头,示例:
curl -A '' https://www.example.com

10. 设置cookie

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

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

至于具体的cookie的值,可以从http response头信息的 "Set-Cookie" 字段中得到,可以保存服务器返回的cookie信息到文件,再用这文件作为下次请求的cookie信息,如下:
curl -c cookies.txt http://example.com
curl -b cookies.txt http://example.com

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

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

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

wget与curl对比

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

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


参考文章:
http://www.ruanyifeng.com/blog/2011/09/curl.html