命令行下载神器 Wget:快速入门与使用
在数字信息的洪流中,下载文件是我们日常与网络交互最常见的操作之一。虽然图形界面的浏览器提供了便捷的下载方式,但在很多场景下,命令行工具却展现出其独特的优势:自动化、批量处理、无界面运行、以及在服务器环境中不可或缺的地位。而在众多命令行下载工具中,Wget 无疑是最强大、最灵活、最受欢迎的神器之一。
什么是 Wget?
Wget(全称 GNU Wget)是一个免费的、非交互式的网络文件下载工具。非交互式意味着即使在用户未登录或者系统没有图形界面的情况下,Wget 也能正常工作。它支持通过 HTTP、HTTPS 和 FTP 协议下载文件,并具备许多高级特性,如:
- 断点续传: 即使下载过程中连接中断,Wget 也能从中断处继续下载,节省时间和带宽。
- 递归下载: Wget 可以沿着网页中的链接抓取整个网站、部分目录或特定类型的文件,非常适合网站镜像或批量下载。
- 后台下载: Wget 可以在后台运行下载任务,不受终端关闭的影响。
- 带宽限制: 可以控制下载速度,避免占用过多网络资源。
- 重试机制: 在下载失败时,Wget 会自动重试,提高了下载的成功率。
- 支持代理: 可以通过 HTTP 或 FTP 代理进行下载。
- 处理认证: 支持基本的 HTTP 和 FTP 认证。
- 处理 Cookie: 可以发送和接收 Cookie。
自 1996 年发布以来,Wget 已成为 Unix/Linux 系统上的标配工具,并且也被移植到 Windows 和 macOS 等其他操作系统上。无论你是系统管理员、开发者、数据分析师,还是仅仅想更高效地处理网络文件,掌握 Wget 都能极大地提升你的工作效率。
安装 Wget
大多数 Unix/Linux 发行版都预装了 Wget。你可以通过在终端输入 wget --version
来检查是否已安装及其版本信息。
如果未安装,可以通过包管理器轻松安装:
- Debian/Ubuntu:
bash
sudo apt update
sudo apt install wget - CentOS/Fedora/RHEL:
bash
sudo yum install wget
# 或者对于较新的系统使用 dnf
sudo dnf install wget - macOS (使用 Homebrew):
bash
brew install wget - Windows:
Windows 系统默认不包含 Wget。你可以从 GNU Wget 的官方网站(https://www.gnu.org/software/wget/)下载适用于 Windows 的二进制文件,或者使用 Chocolatey 等包管理器进行安装:
powershell
choco install wget
安装完成后,建议将 Wget 的执行路径添加到系统的 PATH 环境变量中,这样就可以在任意目录下直接使用wget
命令了。
Wget 快速入门:下载单个文件
Wget 最基本的用法就是下载指定 URL 的文件。语法非常简单:
bash
wget [选项] URL
例如,下载 Apache 网站上的一个示例文件:
bash
wget https://www.apache.org/licenses/LICENSE-2.0.txt
执行上述命令后,Wget 会显示下载进度信息,包括文件大小、下载速度、预计剩余时间等:
“`
–2023-10-27 10:00:00– https://www.apache.org/licenses/LICENSE-2.0.txt
Resolving www.apache.org (www.apache.org)… 1.2.3.4
Connecting to www.apache.org (www.apache.org)|1.2.3.4|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 10265 (10K) [text/plain]
Saving to: ‘LICENSE-2.0.txt’
LICENSE-2.0.txt 100%[=====================>] 10.02K –.-KB/s in 0s
2023-10-27 10:00:00 (49.2 MB/s) – ‘LICENSE-2.0.txt’ saved [10265/10265]
“`
下载完成后,文件会保存在当前目录下,文件名为 URL 的最后一部分(在本例中是 LICENSE-2.0.txt
)。
这就是 Wget 的最简用法。是不是非常直接?
Wget 常用选项详解
Wget 提供了丰富的选项来控制下载行为。下面我们介绍一些最常用且实用的选项。
1. 保存文件到指定名称 (-O
, --output-document
)
有时你想将下载的文件保存为不同的名称,或者将多个下载内容合并到一个文件中。可以使用 -O
选项:
bash
wget -O apache_license.txt https://www.apache.org/licenses/LICENSE-2.0.txt
这将文件保存为 apache_license.txt
。
如果指定 -O
后面跟着一个连字符 -
,Wget 会将文件内容输出到标准输出(STDOUT),而不是保存到文件。这在与其他命令管道连接时非常有用:
bash
wget -O - https://www.apache.org/licenses/LICENSE-2.0.txt | head -n 5
这将下载文件内容并只显示前 5 行。
2. 保存文件到指定目录 (-P
, --directory-prefix
)
默认情况下,Wget 会将文件保存在当前目录下。使用 -P
选项可以将文件保存到指定的目录:
bash
wget -P /tmp/downloads https://www.apache.org/licenses/LICENSE-2.0.txt
这会将 LICENSE-2.0.txt
文件下载并保存到 /tmp/downloads
目录中。如果该目录不存在,Wget 会尝试创建它。
3. 断点续传 (-c
, --continue
)
这是 Wget 最实用的功能之一。当下载中断(例如网络断开、服务器故障或手动停止)时,下次下载同一个文件时使用 -c
选项,Wget 会检查本地已下载的部分,并从中断处继续下载剩余部分。
bash
wget -c https://example.com/large_file.zip
如果 large_file.zip
文件已经存在且未下载完成,Wget 会接着下载。这对于下载大文件或在网络不稳定的环境下非常重要。
4. 静默模式 (-q
, --quiet
)
如果你不希望看到下载进度和详细信息,可以使用 -q
选项进入静默模式。这在脚本中执行下载任务时很有用。
bash
wget -q https://www.apache.org/licenses/LICENSE-2.0.txt
执行后不会有任何输出(除非发生错误)。
5. 详细输出 (-v
, --verbose
)
默认情况下,Wget 会显示适度的信息。使用 -v
选项可以显示更详细的信息,这对于调试或了解下载过程非常有用。
bash
wget -v https://www.apache.org/licenses/LICENSE-2.0.txt
你可以结合 -q
和 -v
来控制输出的详细程度。-nv
(相当于 --no-verbose
) 可以减少输出信息。
6. 后台下载 (-b
, --background
)
如果下载的文件很大,或者你想在下载过程中关闭终端,可以使用 -b
选项将 Wget 任务放到后台运行。
bash
wget -b https://example.com/very_large_file.tar.gz
执行后,Wget 会立即返回命令行提示符,并在后台继续下载。Wget 会将输出信息重定向到一个名为 wget-log
的文件(默认为 wget-log.N
,其中 N 是一个数字,如果文件已存在)。你可以通过查看这个日志文件来监控下载进度:
bash
tail -f wget-log
要停止后台下载,你需要找到 Wget 进程的 PID(进程 ID),然后使用 kill
命令终止它。可以使用 ps aux | grep wget
来查找 PID。
为了更安全地在后台运行任务并防止因终端关闭或网络中断而终止,通常会结合 nohup
命令:
bash
nohup wget https://example.com/very_large_file.tar.gz &
这会将 Wget 放到后台 (&
),并使用 nohup
使其忽略挂起信号,即使终端关闭也能继续运行。输出通常会重定向到 nohup.out
文件。
7. 下载多个文件
Wget 可以一次下载多个文件,只需在命令行中列出它们的 URL 即可:
bash
wget URL1 URL2 URL3 ...
bash
wget https://www.apache.org/licenses/LICENSE-2.0.txt https://www.gnu.org/licenses/gpl-3.0.txt
8. 从文件列表中下载 (-i
, --input-file
)
当要下载的文件列表很长时,将所有 URL 写在一个文件里,然后使用 -i
选项来让 Wget 读取这个文件进行批量下载会更方便。
首先创建一个包含 URL 列表的文件,例如 urls.txt
:
https://example.com/file1.zip
https://example.com/file2.tar.gz
http://example.com/documents/doc1.pdf
ftp://ftp.example.com/pub/data.tgz
然后使用 -i
选项下载:
bash
wget -i urls.txt
Wget 会逐行读取 urls.txt
文件中的 URL,并下载对应的文件。结合 -c
选项可以在中断后继续下载列表中的文件。
Wget 进阶用法:递归下载与网站镜像
Wget 最强大的功能之一是它的递归下载能力,这使得抓取整个网站或网站的某个部分变得非常容易。
1. 基本递归下载 (-r
, --recursive
)
使用 -r
选项可以启用递归下载。Wget 会从指定的 URL 开始,查找页面中的链接,然后沿着这些链接继续下载,直到达到指定的深度或没有新的链接可遵循。
bash
wget -r http://example.com/documents/
这将从 http://example.com/documents/
页面开始,下载该页面以及其中链接到的所有页面和文件(默认递归深度为 5 层)。下载的文件会按照网站的目录结构保存在本地。
重要提示: 递归下载可能会给服务器带来较大负载,请谨慎使用,并遵守网站的 robots.txt 协议和使用条款。
2. 控制递归深度 (-l
, --level
)
默认的递归深度是 5。你可以使用 -l
选项指定递归的层数:
bash
wget -r -l 1 http://example.com/documents/
这将只下载 documents/
页面本身以及该页面直接链接到的文件,不会深入到第二层链接。
设置 -l inf
可以进行无限深度递归(直到抓取完所有可达的链接),但这通常是不推荐的,除非你知道自己在做什么,并且有权限。
3. 接受/拒绝特定文件类型 (-A
, --accept
/ -R
, --reject
)
在递归下载时,你通常只对特定类型的文件感兴趣(例如 PDF 文档、图片、压缩包等),或者想排除某些文件类型。可以使用 -A
和 -R
选项配合通配符来实现。
-A 列表
:只下载列表中的文件类型。-R 列表
:拒绝下载列表中的文件类型。
列表中的各项用逗号分隔,可以使用通配符(如 *.pdf
, *.jpg
, index.html
)。
示例:只下载目录下的所有 PDF 和 DOC 文件,递归深度为无限:
bash
wget -r -l inf -A "*.pdf,*.doc" http://example.com/documents/
示例:下载所有文件,但排除 JPG 和 GIF 图片:
bash
wget -r -l inf -R "*.jpg,*.gif" http://example.com/data/
4. 不遍历父目录 (-np
, --no-parent
)
默认情况下,递归下载可能会沿着 ../
这样的链接向上遍历到父目录。通常你只希望下载指定目录及其子目录中的内容。使用 -np
选项可以防止 Wget 访问父目录。
bash
wget -r -np http://example.com/downloads/software/
这将只下载 software/
目录及其子目录中的内容,不会回到 downloads/
或根目录。这个选项在下载特定目录下的文件集合时非常有用。
5. 跨主机下载 (-H
, --span-hosts
) 与指定允许的域名 (-D
, --domains
)
默认情况下,Wget 的递归下载只会在指定的起始主机上进行。如果页面中链接到其他主机,Wget 不会跟随。使用 -H
选项可以允许 Wget 跨主机递归。
然而,仅仅使用 -H
可能会让你抓取到整个互联网!通常需要结合 -D
选项来限制允许递归的域名列表。
bash
wget -r -H -D example.com,another-domain.org http://example.com/
这将递归下载 example.com
网站,并允许在 example.com
和 another-domain.org
这两个域之间跳转。
6. 网站镜像 (-m
, --mirror
)
-m
选项是进行网站镜像的快捷方式。它相当于同时使用了以下选项:
-r
:启用递归下载。-l inf
:无限递归深度。-N
(–timestamping):只下载比本地文件新的文件,用于更新本地镜像。-np
(–no-parent):不遍历父目录。
此外,进行网站镜像时,通常还会结合其他选项:
-p
(–page-requisites):下载显示网页所需的所有文件,例如 CSS 文件、图片、JavaScript 文件等,即使它们本身不是 HTML 文件。-k
(–convert-links):下载完成后,将 HTML 文件中的链接转换为相对链接,以便在本地文件系统中离线浏览网站。-E
(–adjust-extension):如果下载的是没有.html
或.htm
扩展名的 HTML 文件,下载后会自动加上.html
扩展名。
一个典型的网站镜像命令如下:
bash
wget -m -p -k -E http://example.com/
这将在当前目录下创建一个 example.com
目录,并将整个网站镜像到其中,同时转换链接以便离线浏览。
进行网站镜像前,请务必了解其潜在影响(对服务器负载)和合法性(是否有权镜像),并最好通过 robots.txt
排除不需要抓取的目录。
Wget 高级功能
除了基本的下载和递归功能,Wget 还提供了许多高级选项,可以处理更复杂的场景。
1. 处理认证
如果访问的页面需要 HTTP 基本认证,可以使用 --user
和 --password
选项:
bash
wget --user myuser --password mypass http://example.com/protected/
对于 FTP 认证,同样使用这两个选项。
更安全的做法是将认证信息放在 .netrc
文件中,但命令行选项对于简单任务很方便。
2. 修改请求头 (-U
, --user-agent
, --referer
, --header
)
有些网站会检查请求头信息,例如 User-Agent(标识客户端类型)或 Referer(标识请求来源页面)。你可以使用相应的选项来修改这些信息,以模拟不同的客户端或绕过简单的防护。
-
-U 字符串
:设置 User-Agent。
bash
wget -U "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" http://example.com/
这会模拟一个 Windows 上的 Chrome 浏览器访问。 -
--referer URL
:设置 Referer。
bash
wget --referer http://google.com/ http://example.com/protected_file.zip
这会将 Referer 设置为 Google 搜索页面,有时可以绕过直接链接下载的限制。 -
--header 'Header-Name: value'
:添加任意自定义头信息。
bash
wget --header 'X-Custom-Header: my_value' http://example.com/api/data
3. 处理 Cookie (--load-cookies
, --save-cookies
, --keep-session-cookies
)
对于需要登录或依赖会话状态的网站,Cookie 处理至关重要。
--load-cookies 文件
:从文件加载 Cookie。这个文件通常是 Wget 或其他工具保存的 Cookie 文件(通常是 Netscape Cookie File 格式)。--save-cookies 文件
:将下载过程中接收到的 Cookie 保存到文件。--keep-session-cookies
:默认 Wget 不保存会话 Cookie(关闭浏览器即失效的 Cookie)。使用此选项可以保存它们。
示例:登录网站,然后下载需要登录才能访问的页面:
“`bash
假设你知道如何获取登录后的 Cookie 文件
wget –load-cookies cookies.txt http://example.com/protected_page.html
“`
或者先用 Wget 登录(如果网站支持简单的 GET/POST 登录且你了解参数),保存 Cookie,再用保存的 Cookie 下载:
“`bash
这只是一个示例,实际登录可能更复杂
wget –save-cookies logged_in_cookies.txt –post-data ‘user=myuser&pass=mypass’ http://example.com/login
wget –load-cookies logged_in_cookies.txt http://example.com/protected_page.html
“`
4. 限制下载速度 (--limit-rate
)
为了不给服务器造成过大压力或避免占用过多本地带宽,可以使用 --limit-rate
选项限制下载速度。可以指定单位,如 k
(千字节)、m
(兆字节)。
bash
wget --limit-rate=500k https://example.com/large_file.zip
这将下载速度限制在 500 KB/s。
5. 控制等待时间 (--wait
, --random-wait
, --waitretry
)
在进行批量或递归下载时,频繁的请求可能会被服务器视为恶意行为。使用等待选项可以模拟人类浏览行为,减轻服务器负担。
-
--wait 秒数
:在每次请求之间等待指定的秒数。
bash
wget -r --wait=5 http://example.com/
这将在下载每个文件或页面之前等待 5 秒。 -
--random-wait
:在--wait
指定的秒数基础上,增加 0 到--wait
秒之间的随机等待时间。这使得请求模式更不规则,更难被识别为自动化行为。
bash
wget -r --wait=5 --random-wait http://example.com/
每次等待时间将在 5 到 10 秒之间随机。 -
--waitretry 秒数
:只在下载失败(例如 404, 500 错误)并重试之前等待指定的秒数。默认情况下,Wget 会在重试前指数级地增加等待时间,这个选项可以强制一个固定的等待时间。
6. 控制重试次数 (--tries
)
默认情况下,Wget 会在下载失败时重试 20 次。你可以使用 --tries
选项指定重试次数,或者设置为 inf
表示无限次重试。
bash
wget --tries=50 http://example.com/unstable_download.zip
wget --tries=inf http://example.com/mission_critical_file.data
7. 忽略证书错误 (--no-check-certificate
)
在访问使用自签名证书、过期证书或不受信任的证书机构颁发的 HTTPS 网站时,Wget 默认会拒绝连接。如果你确定连接是安全的(例如在内部网络中),可以使用 --no-check-certificate
选项忽略证书检查。
bash
wget --no-check-certificate https://internal-server/file.zip
警告: 使用此选项会禁用重要的安全检查,使你容易受到中间人攻击。只在你知道自己在做什么且信任对方服务器时使用。
8. 处理重定向 (--max-redirect
)
Wget 默认会跟随服务器发出的重定向。--max-redirect
可以设置跟随重定向的最大次数,防止陷入无限重定向循环。默认是 20 次。
bash
wget --max-redirect=5 http://example.com/short_redirect_chain
9. 使用代理
Wget 可以通过代理服务器下载文件。你可以使用 --proxy
选项指定代理地址,或者设置环境变量(如 http_proxy
, https_proxy
, ftp_proxy
)。
bash
wget --proxy=http://your.proxy.server:8080 http://example.com/
Wget vs. Curl
另一个流行的命令行下载工具是 Curl。两者有很多相似之处,但在设计理念和主要用途上有所区别。
- Wget: 主要设计用于下载文件和递归抓取网站。它的强项在于处理文件下载(断点续传、递归、镜像)和后台运行。
- Curl: 更像一个通用的数据传输工具。它支持更多的协议(包括上传协议如 POST、PUT),可以发送更复杂的请求头,常用于 API 测试和数据交互。它下载单个文件也很出色,但原生支持递归下载不如 Wget 方便。
简而言之,对于简单的文件下载和复杂的网站抓取/镜像任务,Wget 通常是更直接的选择。对于需要更精细控制请求或进行数据上传的任务,Curl 可能更合适。
常见问题与故障排除
- “404 Not Found” 或 “File not found”: Wget 尝试下载的 URL 不存在于服务器上。检查 URL 是否正确。
- “Permission denied”: Wget 无法在当前目录或指定的
-P
目录中创建或写入文件。检查当前用户是否有所需的写入权限。 - 证书错误 (e.g., “Certificate issued for a different hostname”): HTTPS 连接的证书问题。如果信任服务器,可以使用
--no-check-certificate
(谨慎使用)。 - 被网站阻止 (e.g., 403 Forbidden): 网站可能阻止了你的 IP 地址、User-Agent 或检测到是自动化工具。尝试修改 User-Agent (
-U
)、设置 Referer (--referer
)、增加等待时间 (--wait
) 或限制速度 (--limit-rate
)。 - 下载中断后
-c
无效: 可能是服务器不支持断点续传(Range 请求),或者文件在中断后发生了改变。 - 递归下载不按预期工作: 检查是否使用了
-np
(不遍历父目录)、-H
(跨主机)、-D
(允许域名)、-A
/-R
(文件类型过滤) 等选项,它们会影响递归行为。默认递归深度是 5 层 (-l 5
)。
总结
Wget 是一个功能强大且高度灵活的命令行下载工具。从简单的文件下载到复杂的网站镜像和自动化任务,它都能胜任。掌握 Wget 的基本用法和常用选项,能够显著提高你在命令行环境下处理网络文件的效率。
虽然本文详细介绍了很多 Wget 的功能,但这仅仅是冰山一角。Wget 提供了数百个选项,可以精细地控制每一个下载行为。如果你有更复杂的下载需求,强烈建议查阅 GNU Wget 的官方手册,它是最权威和完整的参考资料。
在享受 Wget 带来的便利时,请务必保持礼貌和负责任。避免对服务器造成不必要的负担,遵守网站的 robots.txt
规则和使用条款。合理使用这个强大的工具,让它成为你命令行工具箱中的得力助手吧!