命令行下载神器Wget:快速入门与使用 – wiki基地


命令行下载神器 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.comanother-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 规则和使用条款。合理使用这个强大的工具,让它成为你命令行工具箱中的得力助手吧!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部