Wget 是一种流行的命令行实用程序,可以从 Web 下载文件。它是 GNU 项目的一部分,因此通常与众多 Linux 发行版捆绑在一起。
本文将引导您逐步完成使用 Wget 安装和下载文件的过程,包括或不使用代理,涵盖多个场景并展示实际示例。
wget是什么
Wget 是一个免费软件包,可以通过 HTTP(S) 和 FTP(S) 互联网协议检索文件。该实用程序是GNU 项目的一部分。因此,全名是 GNU Wget。大小写是可选的(Wget 或 wget)。
如何安装 Wget
Wget 可以从官方 GNU 频道下载并手动安装。但是,我们建议使用包管理器。包管理器便于安装并使将来的升级更加方便。此外,大多数 Linux 发行版都与 Wget 捆绑在一起。
要在 Ubuntu/Debian 上安装 Wget,请打开终端并运行以下命令:
sudo apt-get install wget
要在 CentOS/RHEL 上安装 Wget,请打开终端并运行以下命令:
yum install wget
如果您使用的是 macOS,我们强烈建议您使用Homebrew包管理器。打开终端并运行以下命令:
brew install wget
如果您使用的是 Windows,Chocolatey包管理器是一个不错的选择。使用 Chocolatey 时,从命令行或 PowerShell 运行以下命令:
choco install wget
最后,要验证 Wget 的安装,请运行以下命令:
wget --version
这将打印已安装的 Wget 版本以及其他相关信息。
运行 wget
Wget 命令可以从任何命令行界面运行。在本教程中,我们将使用终端。要运行 Wget 命令,请打开终端并输入以下内容:
wget -h
这将列出可与 Wget 命令按类别分组的所有选项,例如启动、日志记录、下载等。
下载单个文件
要下载单个文件,请运行 Wget 并输入文件的完整 URL。例如,Wget 二进制文件位于https://ftp.gnu.org/gnu/wget/wget2-2.0.0.tar.lz。要下载此文件,请在终端中输入以下内容:
wget https://ftp.gnu.org/gnu/wget/wget2-2.0.0.tar.lz

Wget 显示有关正在下载的文件的详细信息:下载完成栏、每个步骤的进度、总文件大小及其 mime 类型等。
更改用户代理
每个程序(包括 Web 浏览器)在连接到 Web 服务时都会发送某些标头。在这种情况下,User-Agent 标头是最重要的,因为它包含一个标识程序的字符串。
要查看 User-Agent 在不同应用程序中的变化,请在您安装的不同浏览器中打开此 URL 。
要识别 Wget 使用的 User-Agent,请请求以下 URL:
wget https://httpbin.org/user-agent
此命令将下载一个user-agent
没有任何扩展名的文件。要查看此文件的内容,请cat
在 macOS 和 Linux 上使用该命令。在 Windows 上,您可以使用该type
命令。
~$ cat user-agent
{
"user-agent": "wget/1.21.2"
}
可以使用该--header
选项修改默认用户代理。语法如下:
wget --header "user-agent: DESIRED USER AGENT" URL-OF-FILE
以下示例应进一步阐明:
~$ wget --header "user-agent: Mozilla/5.0 (Macintosh)" https://httpbin.org/user-agent
~$ cat user-agent
{
"user-agent": "Mozilla/5.0 (Macintosh)"
}
很明显,User-Agent 发生了变化。如果您希望发送任何其他标题,您可以添加更多--header
选项,然后添加"HeaderName: HeaderValue"
格式标题。
下载多个文件
使用 Wget 下载多个文件有两种方法。第一种方法是将所有 URL 发送到 Wget,并用空格分隔。例如,以下命令将从所有三个 URL 下载文件:
~$ wget http://example.com/file1.zip http://example.com/file2.zip http://example.com/file3.zip
如果您想尝试一个真实的示例,请使用以下命令:
~$ wget https://ftp.gnu.org/gnu/wget/wget2-2.0.0.tar.lz https://ftp.gnu.org/gnu/wget/wget2-1.99.2.tar.lz
该命令将一次下载两个文件。
当文件数量有限时,此方法效果很好。随着文件数量的增加,它可能变得难以管理,这使得第二种方法更有用。
第二种方法是将所有 URL 写入文件并使用-i
or--input-file
选项。例如,要从urls.txt
文件中读取 URL,请运行以下任意命令:
~$ wget --input-file=urls.txt
~$ wget -i urls.txt
此选项的最佳部分是,如果任何 URL 不起作用,Wget 将继续并下载其余的功能 URL。
从网页中提取链接
--input-file
可以扩展 Wget 命令的选项以从网页中提取链接。
在最简单的形式中,您可以提供一个包含文件链接的 URL。例如,此页面包含指向 Wget 可下载内容的链接。要从此 URL 下载所有文件,请运行以下命令:
~$ wget --input-file=https://ftp.gnu.org/gnu/wget
但是,如果没有任何进一步的自定义,此命令将不会特别有用。这有多种原因。
默认情况下,Wget 不会覆盖现有文件。如果下载导致覆盖文件,它将通过附加数字后缀来创建新文件。这意味着对于compressed.gif 文件的每个实例,它将创建名称为compressed.gif、compressed.gif.1、compressed.gif.2 等的新文件。
可以通过指定--no-clobber
跳过重复文件的开关来修改此行为。
接下来,您可能希望通过指定--recursive
开关以递归方式下载文件。
--reject
最后,您可能希望通过将扩展名指定为交换机的逗号分隔列表来跳过下载某些文件。
同样,您可能希望通过使用--accept
开关来下载某些文件而忽略其他所有内容。这也需要一个以逗号分隔的扩展名列表。
其他一些有用的开关是--no-directories
和--no-parent
。这两个确保不创建目录,并且 Wget 命令不会遍历父目录。
例如,要下载所有带有.sig
扩展名的文件,请使用以下命令:
~$ wget --recursive --no-parent --no-directories --no-clobber --accept=sig --input-file=https://ftp.gnu.org/gnu/wget
使用 Wget 代理
Wget 代理集成有两种方法。第一种方法使用命令行开关来指定代理服务器和身份验证详细信息。
最简单的验证方法是在指定代理服务器之前获取 IP 地址。要检查您当前的 IP 地址,请运行以下命令:
~$ wget https://ip.oxylabs.io
#output of wget here
~$ cat index.html
11.22.33.44 #prints actual IP address
第一个命令只是接收index.html
包含 IP 地址的文件。该cat
命令(或type
Windows 的命令)打印文件内容。
通过在安静模式下运行 Wget 并将输出重定向到终端而不是下载文件可以实现相同的结果:
~$ wget --quiet --output-document=- https://ip.oxylabs.io
同一命令的较短版本如下:
~$ wget -q -O - https://ip.oxylabs.io
要使用不需要身份验证的代理,请使用两个-e
或两个--execute
交换机。第一个将启用代理,第二个将指定代理服务器的 URL。
以下命令启用代理并指定代理服务器的 IP12.13.14.15
和端口1234
:
~$ wget -q -O- -e use_proxy=yes -e http_proxy=12.13.14.15:1234 https://ip.oxylabs.io
12.13.14.15
在上面的示例中,代理不需要身份验证。如果代理服务器需要用户认证,请使用--proxy-user
开关设置代理用户名。--proxy-password
同样,使用开关设置代理密码:
~$ wget -q -O- -e use_proxy=yes -e http_proxy=12.13.14.15:1234 --proxy-user=your_username --proxy-password=your_password https://ip.oxylabs.io
在这里很明显,该命令很长。但是,当您不想一直使用代理时,它很有用。
第二种方法是使用.wgetrc
配置文件。该文件可以存储代理配置,然后 Wget 会读取该配置。
配置文件位于用户的主目录中,名为.wgetrc
. 或者,您可以通过--config
开关使用任何文件作为配置文件。
在~/.wgetrc
文件中,输入以下行:
use_proxy = on
http_proxy = http://12.13.14.15:1234
如果还需要为代理设置用户认证,修改文件如下:
use_proxy = on
http_proxy = http://your_username:your_password@12.13.14.15:1234
到目前为止,每次 Wget 运行时,它都会使用指定的代理。
$ wget -q -O- http://httpbin.org/ip
# Prints IP of the proxy server
也可以使用环境变量设置代理,例如http_proxy
. 但是,它并不特定于 Wget,而是适用于整个网络流量,因此不适合手头的任务。
cURL 与 Wget
cURL 或 Curl 是另一种用于下载文件的开源命令行工具,可免费使用。
cURL 和 Wget 有许多相似之处,但有一些重要的区别来区分用于特定个人目的的工具。
首先,让我们快速看一下相似之处。两种选择:
- 是用于从 HTTP(S) 和 FTP(S) 下载内容的开源命令行工具
- 可以发送 HTTP GET 和 POST 请求
- 支持cookies
- 设计为在后台运行
以下功能仅在 cURL 中可用:
- 可作为图书馆使用
- 支持 HTTP 和 FTP 以外的更多协议
- 更好的 SSL 支持
- 更多HTTP认证方式
- 支持 SOCKS 代理
- 更好地支持 HTTP POST
尽管如此,Wget 也有它的优势:
- 支持递归。这是最突出的优势,允许您使用
--mirror
开关递归下载文件并创建网站的本地副本。 - 可以恢复中断的下载
本文详细介绍了 cURL 是什么以及如何使用它。如果您想详细了解差异,请参阅cURL 比较表。
上面列出的差异应该可以帮助您找出更适合特定场景的工具。例如,如果您想要递归下载,请选择 Wget。如果您需要 SOCKS 代理支持,请选择 cURL。
两种工具都不比另一种更好。在给定时刻选择适合您的特定场景的那个。
结论
本文详细介绍了如何配置 Wget,从安装和下载单个或多个文件到使用代理的方法。最后,cURL 和 Wget 之间的比较根据功能和个别用例概述了它们的差异。
如果您想了解更多关于代理和高级公共数据采集工具的工作原理或特定网络抓取用例(例如 网络抓取职位发布 或构建 Python 网络抓取工具)的信息,请查看我们的博客。