Linux命令比较: curl vs wget
1. 概述
我们可能希望在不使用 Web 浏览器或其他交互式应用程序的情况下发送 HTTP 请求。为此,Linux 为我们提供了两个命令:curl 和wget 。
这两个命令都非常有用,因为它们提供了一种非交互式下载和上传数据的机制。我们可以将它们用于网络爬虫、脚本自动化、API 测试等。
在本教程中,我们将研究这两个实用程序之间的区别。
2. 协议
2.1. 使用 HTTP 协议
curl和wget都支持 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 下载和上传
我们还可以使用curl和wget使用 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。然后,它通过href或src等标记检索文档引用的文件。
默认情况下,wget将排除 robots.txt 下的路径(机器人排除标准 )。要关闭它,我们可以使用*-e*参数:
wget -e robots=off http://example.com
3.2. 使用 FTP 递归下载
与 HTTP 递归不同,FTP 递归是深度优先执行的。这意味着wget将检索到指定深度级别的第一个目录的数据,然后移动到目录树中的下一个目录。