Linux命令wget和curl比较

发布于 2016-01-18 作者 [重庆SEO]

在接触和学习Linux,在了解相关命令的时候,我常常会遇到这样那样的疑惑,比如在模拟测试下载一个页面的时候到底是用curl,还是用wget呢,curl和wget有什么相同和不同的地方呢?整理这篇文章的主要目的也是为了边了解边学习。

以下大部分内容根据前辈们的内容进行转载整理,如有不适,请break。

cURL和Wget有什么区别

wget是个专职的下载利器,简单,专一,极致;而curl可以下载,但是长项不在于下载,而在于模拟提交web数据,POST/GET请求,调试网页,等等。

在下载上,也各有所长,wget可以递归,支持断点;而curl支持URL中加入变量,因此可以批量下载。

个人用途上,我经常用wget来下载文件,加 -c选项不怕断网;使用curl 来跟网站的API 交互,简便清晰。

抓取工具Curl与WGet的对比

curl和wget有很多地方是相同的,很多场景下二者都可以使用。本篇对二者进行简单的比较。

一、相同点
  • 都是可通过FTP/HTTP/HTTPS协议下载文件的命令行工具;
  • 都可以发送HTTP POST请求;
  • 都支持cookie的使用;
  • 都被设计为无界面(UI),可在如脚本中使用;
  • 都是开源且免费的软件。
二、不同点

1、curl

  • curl是基于libcurl库实现,因此特性来源于libcurl库。libcurl库跨平台、开源且免费,因此curl不只是一个命令行工具
  • 管道。curl在传统的UNIX风格的基础上加以扩展,对输入输出做出更多的处理,从而贯彻了"everything is a pipe" 的设计思想。
  • 单点传送(Single shot)。curl被设计为用于数据的单点传送。它只会传送用户指定的URLS,并不包含任何递归下载的逻辑,也不对html进行任何解析。
  • 更多协议支持。目前curl 支持的协议有: FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP 和 RTSP 。Wget仅仅支持 HTTP, HTTPS 和 FTP。(协议的支持情况可能会随着时间发展而变化。)
  • 更多平台支持,便于移植。与wget相比,curl可在更多平台上编译和运行。比如OS/400, TPF 和其他很多非UNIX的平台。
  • 更强大的SSL库和SSL支持。curl能应用于多个不同的 SSL/TLS 库, 并提供了更多的可控性和对协议细节更广泛的支持。
  • curl支持更多的HTTP认证方式。尤其是当你使用HTTP代理的时候,curl支持Basic, Digest, NTLM and Negotiate认证方式(参见HTTP认证模式)。
  • libcurl库支持多种不同的SOCKS代理,基于libcurl实现的curl工具也支持。而wget不支持。
  • 双向通信。 curl 提供了上传能力,Wget仅仅支持HTTP POST方式。
  • HTTP multipart/form-data 的发送能力。 这使得用户可以进行HTTP上传,更好的模拟浏览器的行为从而更大程度的实现HTTP操作的自动化,提供了更多操作的可能。
  • 压缩。 curl 支持GZIP和 inflate Content-Encoding 并且自动进行解压缩操作。
  • curl提供并执行Transfer-Encoded HTTP的解压缩,而wget不会
  • curl在7.27.0之后,提供对metalink的支持(好吧,百度百科对metalink的解释是不对的, 百度百科说的是oracle公司的一个服务)。而wget需要依靠一个Google Summer开源项目才能支持metalink。
  • curl提供图片的Post,而wget此处有缺陷,至少楼主本人没有试验成功过。有次项目需要模拟Post图片,查找到wget支持此功能,然后就设置wget的相关参数进行操作,不过经过两天的调试仍然没有成功,后来换成curl之后发现就可以直接提交了。

2、wget

  • wget仅仅是一个命令行工具。没有库提供使用。
  • 递归下载支持。wget相比curl最大的优点在于对递归下载的支持,甚至下载一个资源如网页或FTP目录指向的所有资源。
  • wget下载时无需指定保存文件名。而curl需要使用-o或-O指定。
  • wget仅支持GnuTLS 和 OpenSSL两种SSL库。
  • wget仅支持HTTP代理的基本认证(Basic auth)。
  • wget不支持SOCKS代理
  • wget项目更老,基于GPL开源协议,隶属GNU项目。curl基于MIT开源协议,不隶属于任何组织,版权由作者一人所有。

linux curl 命令详解,以及实例

linux curl是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具。

一,curl命令参数,有好多我没有用过,也不知道翻译的对不对,如果有误的地方,还请指正。

-a/--append 上传文件时,附加到目标文件
 -A/--user-agent <string> 设置用户代理发送给服务器
 - anyauth 可以使用"任何"身份验证方法
 -b/--cookie <name=string/file> cookie字符串或文件读取位置
 - basic 使用HTTP基本验证
 -B/--use-ascii 使用ASCII /文本传输
 -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
 -C/--continue-at <offset> 断点续转
 -d/--data <data> HTTP POST方式传送数据
 --data-ascii <data> 以ascii的方式post数据
 --data-binary <data> 以二进制的方式post数据
 --negotiate 使用HTTP身份验证
 --digest 使用数字身份验证
 --disable-eprt 禁止使用EPRT或LPRT
 --disable-epsv 禁止使用EPSV
 -D/--dump-header <file> 把header信息写入到该文件中
 --egd-file <file> 为随机数据(SSL)设置EGD socket路径
 --tcp-nodelay 使用TCP_NODELAY选项
 -e/--referer 来源网址
 -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
 --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
 --key <key> 私钥文件名 (SSL)
 --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
 --pass <pass> 私钥密码 (SSL)
 --engine <eng> 加密引擎使用 (SSL). "--engine list" for list
 --cacert <file> CA证书 (SSL)
 --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)
 --ciphers <list> SSL密码
 --compressed 要求返回是压缩的形势 (using deflate or gzip)
 --connect-timeout <seconds> 设置最大请求时间
 --create-dirs 建立本地目录的目录层次结构
 --crlf 上传是把LF转变成CRLF
 -f/--fail 连接失败时不显示http错误
 --ftp-create-dirs 如果远程目录不存在,创建远程目录
 --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
 --ftp-pasv 使用 PASV/EPSV 代替端口
 --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
 --ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
 --ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
 -F/--form <name=content> 模拟http表单提交数据
 -form-string <name=string> 模拟http表单提交数据
 -g/--globoff 禁用网址序列和范围使用{}和[]
 -G/--get 以get的方式来发送数据
 -h/--help 帮助
 -H/--header <line>自定义头信息传递给服务器
 --ignore-content-length 忽略的HTTP头信息的长度
 -i/--include 输出时包括protocol头信息
 -I/--head 只显示文档信息
 从文件中读取-j/--junk-session-cookies忽略会话Cookie
 - 界面<interface>指定网络接口/地址使用
 - krb4 <级别>启用与指定的安全级别krb4
 -j/--junk-session-cookies 读取文件进忽略session cookie
 --interface <interface> 使用指定网络接口/地址
 --krb4 <level> 使用指定安全级别的krb4
 -k/--insecure 允许不使用证书到SSL站点
 -K/--config 指定的配置文件读取
 -l/--list-only 列出ftp目录下的文件名称
 --limit-rate <rate> 设置传输速度
 --local-port<NUM> 强制使用本地端口号
 -m/--max-time <seconds> 设置最大传输时间
 --max-redirs <num> 设置最大读取的目录数
 --max-filesize <bytes> 设置最大下载的文件总量
 -M/--manual 显示全手动
 -n/--netrc 从netrc文件中读取用户名和密码
 --netrc-optional 使用 .netrc 或者 URL来覆盖-n
 --ntlm 使用 HTTP NTLM 身份验证
 -N/--no-buffer 禁用缓冲输出
 -o/--output 把输出写到该文件中
 -O/--remote-name 把输出写到该文件中,保留远程文件的文件名
 -p/--proxytunnel 使用HTTP代理
 --proxy-anyauth 选择任一代理身份验证方法
 --proxy-basic 在代理上使用基本身份验证
 --proxy-digest 在代理上使用数字身份验证
 --proxy-ntlm 在代理上使用ntlm身份验证
 -P/--ftp-port <address> 使用端口地址,而不是使用PASV
 -Q/--quote <cmd>文件传输前,发送命令到服务器
 -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围
 --range-file 读取(SSL)的随机文件
 -R/--remote-time 在本地生成文件时,保留远程文件时间
 --retry <num> 传输出现问题时,重试的次数
 --retry-delay <seconds> 传输出现问题时,设置重试间隔时间
 --retry-max-time <seconds> 传输出现问题时,设置最大重试时间
 -s/--silent静音模式。不输出任何东西
 -S/--show-error 显示错误
 --socks4 <host[:port]> 用socks4代理给定主机和端口
 --socks5 <host[:port]> 用socks5代理给定主机和端口
 --stderr <file>
 -t/--telnet-option <OPT=val> Telnet选项设置
 --trace <file> 对指定文件进行debug
 --trace-ascii <file> Like --跟踪但没有hex输出
 --trace-time 跟踪/详细输出时,添加时间戳
 -T/--upload-file <file> 上传文件
 --url <URL> Spet URL to work with
 -u/--user <user[:password]>设置服务器的用户和密码
 -U/--proxy-user <user[:password]>设置代理用户名和密码
 -v/--verbose
 -V/--version 显示版本信息
 -w/--write-out [format]什么输出完成后
 -x/--proxy <host[:port]>在给定的端口上使用HTTP代理
 -X/--request <command>指定什么命令
 -y/--speed-time 放弃限速所要的时间。默认为30
 -Y/--speed-limit 停止传输速度的限制,速度时间'秒
 -z/--time-cond 传送时间设置
 -0/--http1.0 使用HTTP 1.0
 -1/--tlsv1 使用TLSv1(SSL)
 -2/--sslv2 使用SSLv2的(SSL)
 -3/--sslv3 使用的SSLv3(SSL)
 --3p-quote like -Q for the source URL for 3rd party transfer
 --3p-url 使用url,进行第三方传送
 --3p-user 使用用户名和密码,进行第三方传送
 -4/--ipv4 使用IP4
 -6/--ipv6 使用IP6
 -#/--progress-bar 用进度条显示当前的传送状态

二,常用curl实例

1,抓取页面内容到一个文件中

[root@krlcgcms01 mytest]# curl -o home.html http://blog.51yip.com

2,用-O(大写的),后面的url要具体到某个文件,不然抓不下来。我们还可以用正则来抓取东西

[root@krlcgcms01 mytest]# curl -O http://blog.51yip.com/wp-content/uploads/2010/09/compare_varnish.jpg
[root@krlcgcms01 mytest]# curl -O http://blog.51yip.com/wp-content/uploads/2010/[0-9][0-9]/aaaaa.jpg

3,模拟表单信息,模拟登录,保存cookie信息

[root@krlcgcms01 mytest]# curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php

4,模拟表单信息,模拟登录,保存头信息

[root@krlcgcms01 mytest]# curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php

-c(小写)产生的cookie和-D里面的cookie是不一样的。

5,使用cookie文件

[root@krlcgcms01 mytest]# curl -b ./cookie_c.txt http://blog.51yip.com/wp-admin

6,断点续传,-C(大写的)

[root@krlcgcms01 mytest]# curl -C -O http://blog.51yip.com/wp-content/uploads/2010/09/compare_varnish.jpg

7,传送数据,最好用登录页面测试,因为你传值过去后,curl回抓数据,你可以看到你传值有没有成功

[root@krlcgcms01 mytest]# curl -d log=aaaa http://blog.51yip.com/wp-login.php

8,显示抓取错误,下面这个例子,很清楚的表明了。

[root@krlcgcms01 mytest]# curl -f http://blog.51yip.com/asdf
curl: (22) The requested URL returned error: 404
[root@krlcgcms01 mytest]# curl http://blog.51yip.com/asdf

<HTML><HEAD><TITLE>404,not found</TITLE>
。。。。。。。。。。。。

9,伪造来源地址,有的网站会判断,请求来源地址。

[root@krlcgcms01 mytest]# curl -e http://localhost http://blog.51yip.com/wp-login.php

10,当我们经常用curl去搞人家东西的时候,人家会把你的IP给屏蔽掉的,这个时候,我们可以用代理

[root@krlcgcms01 mytest]# curl -x 24.10.28.84:32779 -o home.html http://blog.51yip.com

11,比较大的东西,我们可以分段下载

[root@krlcgcms01 mytest]# curl -r 0-100 -o img.part1 http://blog.51yip.com/wp-

content/uploads/2010/09/compare_varnish.jpg
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 101 100 101 0 0 105 0 --:--:-- --:--:-- --:--:-- 0
[root@krlcgcms01 mytest]# curl -r 100-200 -o img.part2 http://blog.51yip.com/wp-

content/uploads/2010/09/compare_varnish.jpg
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 101 100 101 0 0 57 0 0:00:01 0:00:01 --:--:-- 0
[root@krlcgcms01 mytest]# curl -r 200- -o img.part3 http://blog.51yip.com/wp-

content/uploads/2010/09/compare_varnish.jpg
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 104k 100 104k 0 0 52793 0 0:00:02 0:00:02 --:--:-- 88961
[root@krlcgcms01 mytest]# ls |grep part | xargs du -sh
4.0K one.part1
112K three.part3
4.0K two.part2

用的时候,把他们cat一下就OK了,cat img.part* >img.jpg

12,不会显示下载进度信息

[root@krlcgcms01 mytest]# curl -s -o aaa.jpg http://blog.51yip.com/wp-content/uploads/2010/09/compare_varnish.jpg

13,显示下载进度条

[root@krlcgcms01 mytest]# curl -# -O http://blog.51yip.com/wp-content/uploads/2010/09/compare_varnish.jpg
######################################################################## 100.0%

14,通过ftp下载文件

[zhangy@BlackGhost ~]$ curl -u 用户名:密码 -O http://blog.51yip.com/demo/curtain/bbstudy_files/style.css
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
101 1934 101 1934 0 0 3184 0 --:--:-- --:--:-- --:--:-- 7136 
或者用下面的方式
[zhangy@BlackGhost ~]$ curl -O ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/style.css 

15,通过ftp上传

[zhangy@BlackGhost ~]$ curl -T test.sql ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/ 

wget命令中文帮助

[root@localhost tool]# wget --help
GNU Wget 1.12,非交互式的网络文件下载工具。
用法: wget [选项]... [URL]...

长选项所必须的参数在使用短选项时也是必须的。

开始:
 -V, --version      显示 Wget 的版本信息并退出。
 -h, --help       打印此帮助。
 -b, --background    启动后转入后台。
 -e, --execute=COMMAND  运行一个'.wgetrc'风格的命令。

登入并输入文件:
 -o, --output-file=FILE  将信息写入 FILE。
 -a, --append-output=FILE 将信息添加至 FILE。
 -d, --debug        打印大量调试信息。
 -q, --quiet        安静模式(无信息输出)。
 -v, --verbose       详尽的输出(此为默认值)。
 -nv, --no-verbose     关闭详尽输出,但不进入安静模式。
 -i, --input-file=FILE   下载本地或外部 FILE 中的 URLs。
 -F, --force-html     把输入文件当成 HTML 文件。
 -B, --base=URL      解析与 URL 相关的
               HTML 输入文件(由 -i -F 选项指定)。

下载:
 -t, --tries=NUMBER      设置重试次数为 NUMBER (0 代表无限制)。
    --retry-connrefused    即使拒绝连接也是重试。
 -O, --output-document=FILE  将文档写入 FILE。
 -nc, --no-clobber       不要重复下载已存在的文件。
                 
 -c, --continue        继续下载部分下载的文件。
    --progress=TYPE      选择进度条类型。
 -N, --timestamping      只获取比本地文件新的文件。
                 
 -S, --server-response     打印服务器响应。
    --spider         不下载任何文件。
 -T, --timeout=SECONDS     将所有超时设为 SECONDS 秒。
    --dns-timeout=SECS    设置 DNS 查寻超时为 SECS 秒。
    --connect-timeout=SECS  设置连接超时为 SECS 秒。
    --read-timeout=SECS    设置读取超时为 SECS 秒。
 -w, --wait=SECONDS      等待间隔为 SECONDS 秒。
    --waitretry=SECONDS    在取回文件的重试期间等待 1..SECONDS 秒。
    --random-wait       取回时等待 0...2*WAIT 秒。
    --no-proxy        关闭代理。
 -Q, --quota=NUMBER      设置取回配额为 NUMBER 字节。
    --bind-address=ADDRESS  绑定至本地主机上的 ADDRESS (主机名或是 IP)。
    --limit-rate=RATE     限制下载速率为 RATE。
    --no-dns-cache      关闭 DNS 查寻缓存。
    --restrict-file-names=OS 限定文件名中的字符为 OS 允许的字符。
    --ignore-case       匹配文件/目录时忽略大小写。
 -4, --inet4-only       仅连接至 IPv4 地址。
 -6, --inet6-only       仅连接至 IPv6 地址。
    --prefer-family=FAMILY  首先连接至指定协议的地址
                 FAMILY 为 IPv6,IPv4 或是 none。
    --user=USER        将 ftp 和 http 的用户名均设置为 USER。
    --password=PASS      将 ftp 和 http 的密码均设置为 PASS。
    --ask-password      提示输入密码。
    --no-iri        关闭 IRI 支持。
    --local-encoding=ENC   IRI 使用 ENC 作为本地编码。
    --remote-encoding=ENC   使用 ENC 作为默认远程编码。

目录:
 -nd, --no-directories      不创建目录。
 -x, --force-directories    强制创建目录。
 -nH, --no-host-directories   不要创建主目录。
    --protocol-directories   在目录中使用协议名称。
 -P, --directory-prefix=PREFIX 以 PREFIX/... 保存文件
    --cut-dirs=NUMBER     忽略 NUMBER 个远程目录路径。

HTTP 选项:
    --http-user=USER    设置 http 用户名为 USER。
    --http-password=PASS  设置 http 密码为 PASS。
    --no-cache       不在服务器上缓存数据。
    --default-page=NAME   改变默认页
                (默认页通常是"index.html")。
 -E, --adjust-extension   以合适的扩展名保存 HTML/CSS 文档。
    --ignore-length     忽略头部的'Content-Length'区域。
    --header=STRING     在头部插入 STRING。
    --max-redirect     每页所允许的最大重定向。
    --proxy-user=USER    使用 USER 作为代理用户名。
    --proxy-password=PASS  使用 PASS 作为代理密码。
    --referer=URL      在 HTTP 请求头包含'Referer: URL'。
    --save-headers     将 HTTP 头保存至文件。
 -U, --user-agent=AGENT   标识为 AGENT 而不是 Wget/VERSION。
    --no-http-keep-alive  禁用 HTTP keep-alive(永久连接)。
    --no-cookies      不使用 cookies。
    --load-cookies=FILE   会话开始前从 FILE 中载入 cookies。
    --save-cookies=FILE   会话结束后保存 cookies 至 FILE。
    --keep-session-cookies 载入并保存会话(非永久) cookies。
    --post-data=STRING   使用 POST 方式;把 STRING 作为数据发送。
    --post-file=FILE    使用 POST 方式;发送 FILE 内容。
    --content-disposition  当选中本地文件名时
                允许 Content-Disposition 头部(尚在实验)。
    --auth-no-challenge   send Basic HTTP authentication information
                without first waiting for the server's
                challenge.

HTTPS (SSL/TLS) 选项:
    --secure-protocol=PR   选择安全协议,可以是 auto、SSLv2、
                SSLv3 或是 TLSv1 中的一个。
    --no-check-certificate  不要验证服务器的证书。
    --certificate=FILE    客户端证书文件。
    --certificate-type=TYPE 客户端证书类型, PEM 或 DER。
    --private-key=FILE    私钥文件。
    --private-key-type=TYPE 私钥文件类型, PEM 或 DER。
    --ca-certificate=FILE  带有一组 CA 认证的文件。
    --ca-directory=DIR    保存 CA 认证的哈希列表的目录。
    --random-file=FILE    带有生成 SSL PRNG 的随机数据的文件。
    --egd-file=FILE     用于命名带有随机数据的 EGD 套接字的文件。

FTP 选项:
    --ftp-user=USER     设置 ftp 用户名为 USER。
    --ftp-password=PASS   设置 ftp 密码为 PASS。
    --no-remove-listing   不要删除'.listing'文件。
    --no-glob        不在 FTP 文件名中使用通配符展开。
    --no-passive-ftp    禁用"passive"传输模式。
    --retr-symlinks     递归目录时,获取链接的文件(而非目录)。

递归下载:
 -r, --recursive     指定递归下载。
 -l, --level=NUMBER    最大递归深度( inf 或 0 代表无限制,即全部下载)。
    --delete-after    下载完成后删除本地文件。
 -k, --convert-links   让下载得到的 HTML 或 CSS 中的链接指向本地文件。
 -K, --backup-converted  在转换文件 X 前先将它备份为 X.orig。
 -m, --mirror       -N -r -l inf --no-remove-listing 的缩写形式。
 -p, --page-requisites  下载所有用于显示 HTML 页面的图片之类的元素。
    --strict-comments  开启 HTML 注释的精确处理(SGML)。

递归接受/拒绝:
 -A, --accept=LIST        逗号分隔的可接受的扩展名列表。
 -R, --reject=LIST        逗号分隔的要拒绝的扩展名列表。
 -D, --domains=LIST       逗号分隔的可接受的域列表。
    --exclude-domains=LIST   逗号分隔的要拒绝的域列表。
    --follow-ftp        跟踪 HTML 文档中的 FTP 链接。
    --follow-tags=LIST     逗号分隔的跟踪的 HTML 标识列表。
    --ignore-tags=LIST     逗号分隔的忽略的 HTML 标识列表。
 -H, --span-hosts        递归时转向外部主机。
 -L, --relative         只跟踪有关系的链接。
 -I, --include-directories=LIST 允许目录的列表。
 --trust-server-names use the name specified by the redirection url last component.
 -X, --exclude-directories=LIST 排除目录的列表。
 -np, --no-parent         不追溯至父目录。 

测试DEMO: robots.txt能正常抓取的情况下,日志省略:

#下载文件 自动保存文件名为robots.txt
wget seonoco.com/robots.txt
#下载文件 自动保存文件名为robots.txt?parm
wget seonoco.com/robots.txt?parm
#下载文件 -O(大写)自定义文件名为robots.txt -U自定义UA
wget seonoco.com/robots.txt?parm -O ./robots.txt -U 'useragent string'
#下载文件 并且将wget进程信息写入文档
wget seonoco.com/robots.txt -o ./info.txt
#下载文件 不显示wget进程信息
wget seonoco.com/robots.txt 2>/dev/null

#下载文件 -o(小写)自定义文件名为robots.txt -A自定义UA
curl seonoco.com/robots.txt?parm -o ./robots.txt -A 'useragent string'