Contents

Linux命令比较: curl vs wget

1. 概述

我们可能希望在不使用 Web 浏览器或其他交互式应用程序的情况下发送 HTTP 请求。为此,Linux 为我们提供了两个命令:curlwget

这两个命令都非常有用,因为它们提供了一种非交互式下载和上传数据的机制。我们可以将它们用于网络爬虫、脚本自动化、API 测试等。

在本教程中,我们将研究这两个实用程序之间的区别。

2. 协议

2.1. 使用 HTTP 协议

curlwget都支持 HTTP、HTTPS 和 FTP 协议。因此,如果我们想从网站获取页面,例如blogdemo.com,那么我们可以使用网址作为参数运行它们:

wget 
--2019-10-02 22:00:34--  
Resolving www.blogdemo.com (www.blogdemo.com)... 2606:4700:30::6812:3e4e, 2606:4700:30::6812:3f4e, 104.18.63.78, ...
Connecting to www.blogdemo.com (www.blogdemo.com)|2606:4700:30::6812:3e4e|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html                    [ <=> ] 122.29K  --.-KB/s    in 0.08s   
2019-10-02 22:00:35 (1.47 MB/s) - ‘index.html’ saved [125223]

它们之间的主要区别在于curl将在控制台中显示输出。另一方面,wget会将其下载到文件中。

我们可以使用*-o参数将数据保存在curl*文件中:

curl  -o blogdemo.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  122k    0  122k    0     0    99k      0 --:--:--  0:00:01 --:--:--   99k

2.2. 使用 FTP 下载和上传

我们还可以使用curlwget使用 FTP 协议下载文件:

wget --user=abhi --password='myPassword' ftp://abc.com/hello.pdf
curl -u abhi:myPassword 'ftp://abc.com/hello.pdf' -o hello.pdf

我们还可以使用curl将文件上传到 FTP 服务器。为此,我们可以使用*-T*参数:

curl -T "img.png" ftp://ftp.example.com/upload/

需要注意的是,上传到目录的时候,一定要使用提供尾随的/,否则curl会认为路径代表一个文件。

2.3. 差异

两者的区别在于curl支持过多的其他协议。这包括 DICT、文件、FTPS、GOPHER、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET 和 TFTP。

我们可以将curl视为用于将数据传输到服务器或从服务器传输数据的通用工具。

另一方面,wget基本上是一个网络下载器。

3. 递归下载

当我们希望制作网站的本地副本时,wget是使用的工具。curl不提供递归下载,因为它不能为其所有支持的协议提供。

我们可以在一个命令中使用wget下载一个网站:

wget --recursive https://www.blogdemo.com

这将下载主页和从中链接的任何资源。

wget将遵循这些资源中的每一个并单独下载它们:

--2019-10-02 22:09:17--  start-here
...
Saving to: ‘www.blogdemo.com/start-here’
www.blogdemo.com/start-here               [  <=> ] 134.85K   321KB/s    in 0.4s    
2019-10-02 22:09:18 (321 KB/s) - ‘www.blogdemo.com/start-here’ saved [138087]
--2019-10-02 22:09:18--  rest-with-spring-course
...
Saving to: ‘www.blogdemo.com/rest-with-spring-course’
www.blogdemo.com/rest-with-spring-cou     [ <=> ] 244.77K   395KB/s    in 0.6s    
2019-10-02 22:09:19 (395 KB/s) - ‘www.blogdemo.com/rest-with-spring-course’ saved [250646]
... more output omitted

3.1. 使用 HTTP 递归下载

递归下载是wget最强大的功能之一。这意味着wget 可以跟随 HTML、XHTML 和 CSS 页面中的链接,创建远程网站的本地版本,完全重建原始站点的目录结构。

** wget中的递归下载是广度优先的。*换句话说,它首先下载请求的文档,然后下载从该文档链接的文档,然后是这些文档链接的文档,依此类推。默认最大深度设置为 5,但可以使用-l*参数覆盖它:

wget ‐l=1 ‐‐recursive ‐‐no-parent http://example.com

对于 HTTP 或 HTTPS URL,wget会扫描并解析 HTML 或 CSS。然后,它通过hrefsrc等标记检索文档引用的文件。

默认情况下,wget将排除 robots.txt 下的路径机器人排除标准 )。要关闭它,我们可以使用*-e*参数:

wget -e robots=off http://example.com

3.2. 使用 FTP 递归下载

与 HTTP 递归不同,FTP 递归是深度优先执行的。这意味着wget将检索到指定深度级别的第一个目录的数据,然后移动到目录树中的下一个目录。