wget 命令入门教程 – wiki基地


wget 命令入门教程:网络下载的瑞士军刀

序言

在 Linux/Unix 世界中,wget 是一个强大且被广泛使用的命令行工具,用于从网络上下载文件。它的名字来源于 World Get,意为“网络获取”。与浏览器下载不同,wget 是非交互式的,这意味着它可以在后台运行,即使您关闭终端或断开SSH连接(结合特定选项)也能继续下载。这使得它在自动化脚本、下载大型文件、甚至离线浏览整个网站等场景下非常有用。

本教程将带您从零开始,逐步深入了解 wget 的各种功能和常用选项。无论您是刚接触命令行的新手,还是希望提升下载效率的进阶用户,都能从中受益。

第一部分:初识 wget – 安装与基本用法

1. wget 的安装

wget 是许多 Linux 发行版和 macOS (通过 Homebrew 或 MacPorts) 中的默认安装工具。如果您的系统上没有安装 wget,可以通过包管理器轻松安装:

  • Debian/Ubuntu 系列:
    bash
    sudo apt update
    sudo apt install wget
  • Fedora/CentOS/RHEL 系列:
    bash
    sudo yum install wget
    # 或对于较新版本
    sudo dnf install wget
  • macOS (使用 Homebrew):
    bash
    brew install wget

安装完成后,您可以在终端中输入 wget --version 来检查版本信息,确认安装成功。

2. wget 的基本语法

wget 命令的基本语法非常简单:

bash
wget [选项] [URL]

  • [选项]:用于指定下载行为的各种参数,比如设置保存文件名、下载目录、限制速度、断点续传等。
  • [URL]:您想要下载的资源的统一资源定位符,可以是 HTTP、HTTPS 或 FTP 地址。

3. 下载单个文件

最常见的用法就是下载单个文件。假设您想下载一个名为 example.zip 的文件,位于 http://example.com/files/ 目录下,只需执行以下命令:

bash
wget http://example.com/files/example.zip

执行命令后,wget 会连接到指定的 URL,并在当前目录下创建一个名为 example.zip 的文件,并将下载内容保存到其中。终端会显示下载进度,包括文件大小、下载速度、预计剩余时间等信息。

输出示例:

“`
–2023-10-27 10:30:00– http://example.com/files/example.zip
Resolving example.com (example.com)… 93.184.216.34
Connecting to example.com (example.com)|93.184.216.34|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 123456789 (118M) [application/zip]
Saving to: ‘example.zip’

example.zip 100%[===================>] 117.74M 1.23MB/s in 97s

2023-10-27 10:31:37 (1.21 MB/s) – ‘example.zip’ saved [123456789/123456789]
“`

  • 第一行显示了请求的 URL 和时间。
  • ResolvingConnecting 显示了解析域名和建立连接的过程。
  • HTTP request sent, awaiting response... 200 OK 表示服务器成功响应请求(200 是 HTTP 状态码,表示成功)。
  • Length 显示了文件大小和类型。
  • Saving to: ‘example.zip’ 显示了文件将保存到本地的文件名。
  • 进度条 [===================>] 直观展示了下载进度。
  • 最后一行总结了下载结果,包括下载速度和保存的文件名及大小。

第二部分:常用选项详解 – 控制下载行为

wget 提供了大量的选项来精细控制下载过程。下面介绍一些最常用的:

1. 指定保存的文件名 (-O)

有时你可能想将下载的文件保存为其他名称,而不是 URL 中的原名称。使用 -O (大写字母O) 选项可以实现这一点。

bash
wget -O my_download.zip http://example.com/files/example.zip

这会将文件下载并保存为 my_download.zip

注意: 如果您使用 -O 下载多个文件,wget 会将所有内容追加到 同一个 指定文件中,这通常不是你想要的结果。对于下载多个文件到不同位置,通常结合 -P 或使用循环。

2. 指定保存的目录 (-P)

使用 -P (大写字母P) 选项可以指定下载文件保存的目录。这对于组织下载的文件非常有用。

bash
wget -P /home/user/downloads http://example.com/files/example.zip

这会将 example.zip 下载到 /home/user/downloads/ 目录下。如果该目录不存在,wget 会尝试创建它。

3. 断点续传 (-c)

网络连接不稳定或下载中断是常有的事。wget-c--continue 选项允许您从上次中断的地方继续下载,避免从头开始。

bash
wget -c http://example.com/large_file.tar.gz

如果在下载 large_file.tar.gz 的过程中中断(例如按 Ctrl+C),下次再执行相同的命令时,加上 -c 选项,wget 会检查本地已存在的文件大小,并请求服务器从文件的末尾处继续传输剩余部分。

工作原理: wget -c 会发送一个 HTTP Range 请求给服务器,告知服务器从文件的某个偏移量开始传输数据。并非所有服务器都支持 Range 请求,但大多数现代Web服务器都支持。

4. 下载到标准输出 (-O -)

有时您可能不想将文件保存到本地文件,而是直接将下载的内容输出到标准输出 (stdout)。这在管道 (pipe) 操作中非常有用,可以将下载的内容直接传递给另一个命令处理。

bash
wget -O - http://example.com/some_text_file.txt | less

这个命令会下载文本文件的内容,不保存到文件,而是直接通过管道 (|) 将其输出给 less 命令进行分页查看。注意这里的 -O - 中的第二个 - 代表标准输出。

5. 后台下载 (-b)

对于大型文件,您可能希望让 wget 在后台运行,这样您就可以继续使用终端执行其他任务。使用 -b--background 选项可以实现后台下载。

bash
wget -b http://example.com/very_large_archive.rar

执行此命令后,wget 会立即将下载任务放入后台,并在终端中显示一个类似 Continuing in background, pid XXXX. 的消息,其中 XXXX 是后台进程的ID。下载进度和日志信息会写入当前目录下的 wget-log 文件。

要查看后台任务的日志,可以使用 tail 命令:

bash
tail -f wget-log

6. 限制下载速度 (--limit-rate)

如果您不想让 wget 占用所有网络带宽,可以使用 --limit-rate 选项来限制下载速度。可以指定单位,如 K (千字节)、M (兆字节)。

bash
wget --limit-rate=500k http://example.com/media_file.mp4

这将下载速度限制在 500 KB/s。

bash
wget --limit-rate=2m http://example.com/huge_image.iso

这将下载速度限制在 2 MB/s。

7. 重试与等待 (--tries, --wait)

网络连接可能不稳定,下载可能会失败。wget 默认会尝试多次连接和重试。您可以使用 --tries--wait 选项来控制重试次数和每次重试之间的等待时间。

bash
wget --tries=10 --wait=5 http://example.com/flaky_server/resource.dat

这会让 wget 在下载失败时最多重试 10 次,每次重试前等待 5 秒钟。

  • --tries=N: 设置重试次数为 N。设置为 inf 表示无限重试。
  • --wait=S: 设置每次重试前的等待时间为 S 秒。

8. 安静模式 (-q) 和输出日志 (-o)

默认情况下,wget 会在终端输出下载进度和信息。在脚本中或需要保持终端整洁时,您可能希望抑制这些输出。

  • -q--quiet: 进入安静模式,不显示下载进度条和大多数消息。

    bash
    wget -q http://example.com/silent_download.txt

  • -o logfile--output-file=logfile: 将所有的输出信息(包括进度和错误)重定向到指定的日志文件,而不是终端。

    bash
    wget -o download.log http://example.com/file_to_log.pdf

    结合 -b 使用时,日志默认就是 wget-log,但你可以用 -o 指定不同的日志文件。

9. 伪装用户代理 (-U)

有些网站可能会检查用户代理 (User-Agent) 字符串,以判断请求是来自浏览器还是自动化工具,并可能阻止 wget 的默认用户代理。使用 -U 选项可以模拟不同的用户代理。

bash
wget -U "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" http://example.com/protected_resource.html

这会将用户代理设置为 Firefox 浏览器,有时可以绕过简单的反爬虫机制。

10. 使用 HTTP 头部 (--header)

您可以添加自定义的 HTTP 头部信息到请求中。这对于需要发送特定的认证信息、referrer 或其他自定义头部的场景很有用。

bash
wget --header="Referer: http://example.com/some_page" http://example.com/linked_resource.zip

这会在请求中添加一个 Referer 头部。

第三部分:下载多个文件

wget 不仅能下载单个文件,也能一次下载多个文件。

1. 从文件中读取 URL 列表 (-i)

如果您有一个包含多个 URL 的列表文件,可以使用 -i--input-file 选项让 wget 批量下载。

首先创建一个文本文件,比如 urls.txt,每行一个 URL:

http://example.com/file1.zip
http://example.com/images/pic2.jpg
http://another-site.com/document.pdf

然后执行命令:

bash
wget -i urls.txt

wget 会依次读取 urls.txt 中的每个 URL 并尝试下载。

第四部分:下载整个网站(递归下载)

wget 最强大的功能之一是递归下载,它可以从指定的 URL 开始,沿着页面中的链接下载整个网站或网站的一部分。这常用于创建网站的离线副本。

1. 启用递归下载 (-r)

使用 -r--recursive 选项可以启用递归下载。

bash
wget -r http://example.com/docs/

这个命令会下载 http://example.com/docs/ 页面本身,并查找页面中的链接。如果链接指向同一域名下的其他页面或文件,wget 会继续下载这些资源,并重复此过程。

注意: 递归下载可能会下载大量文件,并对目标服务器造成较大负载,请谨慎使用,并确保您有权下载。

2. 控制递归深度 (-l)

递归下载默认深度是 5 层。你可以使用 -l--level 选项来控制递归的深度。

bash
wget -r -l 2 http://example.com/docs/

这将下载起始页面及其链接到的页面,但不会进一步跟踪第三层链接。

  • -l 0-l inf: 表示无限深度,会尝试下载整个网站(非常危险,慎用)。
  • -l 1: 只下载起始 URL 指向的页面/文件,不递归到这些页面中的链接。

3. 过滤文件类型 (-A, -R)

在递归下载时,你可能只想下载特定类型的文件,或者排除某些类型。

  • -A acclist--accept=acclist: 只下载符合指定后缀名或通配符的文件。多个模式用逗号分隔。

    bash
    wget -r -A jpg,png,gif http://example.com/gallery/

    这会递归下载 /gallery/ 目录及其子目录下的所有 JPG, PNG, GIF 图片。

  • -R rejlist--reject=rejlist: 排除符合指定后缀名或通配符的文件。

    bash
    wget -r -R html,css,js http://example.com/archive/

    这会递归下载 /archive/ 目录下的所有内容,但会跳过 HTML, CSS, JavaScript 文件。

-A-R 可以一起使用。

4. 下载到指定目录 (-P 与递归)

当结合 -r-P 使用时,-P 指定的是保存整个下载结构的根目录。

bash
wget -r -P /home/user/website_backup http://example.com/

这会将 example.com 网站的内容下载到 /home/user/website_backup/ 目录下,并保留网站原有的目录结构。

5. 镜像网站 (-m)

镜像一个网站通常是为了创建一个完整的离线浏览副本。wget 提供了 -m--mirror 选项,它是一个方便的组合选项,相当于同时使用了 -r -l inf -N -nv

  • -r: 递归下载。
  • -l inf: 无限递归深度。
  • -N--timestamping: 启用时间戳。如果本地文件的时间戳比远程文件新,则不重新下载。这对于更新已下载的镜像非常有用。
  • -nv--no-verbose: 关闭详细输出,但会显示错误信息。

bash
wget -m http://example.com/

这个命令会尝试镜像整个 example.com 网站。再次强调,请谨慎使用 -m-l inf,它们可能导致下载量巨大,并对服务器造成负担。

重要的递归下载注意事项:

  • 尊重 robots.txt: wget 默认会遵守网站的 robots.txt 文件中指定的抓取规则。这是一种良好的网络公民行为。如果你需要忽略 robots.txt (不推荐,除非你清楚自己在做什么且有正当理由),可以使用 -e robots=off 选项,但这可能违反网站的使用条款。
  • 下载频率: 默认情况下,wget 下载速度很快。对于递归下载,建议使用 --wait--random-wait (在指定范围内随机等待) 选项来减缓下载速度,避免给服务器带来过大压力,也降低被封锁的风险。

    bash
    wget -r --wait=5 --random-wait -l 2 http://example.com/some_section/

    这会在下载每个文件前至少等待 5 秒,并在 5-10 秒之间随机等待一段时间。

  • 避免重复下载: -N (时间戳) 和 -c (断点续传) 在递归下载中都很有用。-N 确保你不会重复下载未修改的文件,-c 可以在下载中断后继续。-m 选项已经包含了 -N

第五部分:处理特殊情况

1. HTTP 认证

如果需要下载的资源需要 HTTP 基本认证(用户名和密码),可以使用 --user--password 选项。

bash
wget --user=myuser --password=mypassword http://example.com/protected/private.zip

2. 忽略证书错误

在连接到使用自签名证书或证书过期的 HTTPS 网站时,wget 默认会拒绝连接。如果您确定连接是安全的(例如在内部网络中),可以使用 --no-check-certificate 选项来忽略证书检查。

bash
wget --no-check-certificate https://internal-server/secure_file.tar.gz

警告: 使用此选项会禁用安全检查,使您面临中间人攻击的风险。除非您非常清楚风险并信任目标网站,否则不要使用此选项。

3. 处理 Cookies

有些网站需要 Cookies 来维持会话状态,例如登录后的下载链接。wget 可以加载和保存 Cookies。

  • --load-cookies file: 从指定文件加载 Cookies。
  • --save-cookies file: 将接收到的 Cookies 保存到文件。

通常你需要先用浏览器或其他工具登录网站,导出 Cookies 到文件,然后用 wget 加载该文件进行下载。或者,对于一些简单情况,你也可以尝试用 wget 模拟登录并保存 Cookies:

“`bash

模拟登录(可能需要检查网站的登录表单和方法)

wget –save-cookies cookies.txt –post-data ‘user=myuser&password=mypassword’ http://example.com/login

使用保存的cookies下载需要登录后访问的页面或文件

wget –load-cookies cookies.txt http://example.com/members_area/exclusive_content.zip
“`

请注意,模拟登录是一个更高级的话题,需要分析网站的登录机制,这里只是一个示意。

第六部分:FTP 下载

除了 HTTP/HTTPS,wget 也支持 FTP (File Transfer Protocol)。基本语法类似,但可以使用一些特定的 FTP 选项。

bash
wget ftp://ftp.example.com/public/somefile.iso

对于需要认证的 FTP 服务器:

bash
wget ftp://user:[email protected]/private/document.pdf

或使用 --user--password 选项:

bash
wget --user=ftpuser --password=ftppass ftp://ftp.example.com/private/document.pdf

wget 也支持 FTP 递归下载 (-r),行为类似于 HTTP 递归。

第七部分:故障排除与常见问题

  • 404 Not Found: 文件或页面不存在。检查 URL 是否正确。
  • 403 Forbidden: 服务器拒绝访问。您可能没有权限下载该文件,或者服务器阻止了 wget 的用户代理。尝试使用 -U 选项。
  • Connection Refused: 无法连接到服务器。检查 URL 中的主机名和端口是否正确,以及防火墙设置。
  • No such file or directory (when saving): 您指定的保存目录 (-P) 不存在,且 wget 无法创建。检查目录路径或确保您有权限在该位置创建目录。
  • Permission denied (when saving): 您没有权限在指定的目录下创建或写入文件。检查目标目录的权限,或者尝试在您有写入权限的目录下保存。
  • Certificate verification failed: HTTPS 证书有问题。如果您确定要继续,可以使用 --no-check-certificate (请注意风险)。
  • 下载中断后没有续传: 确保您使用了 -c 选项。如果使用了 -c 仍然无法续传,可能是服务器不支持 HTTP Range 请求。
  • 递归下载量过大: 检查 -l 深度设置和 -A/-R 过滤选项是否正确。考虑使用 --wait 减缓速度。

您始终可以使用 man wget 命令来查看 wget 的完整帮助文档,了解所有可用选项的详细说明。

总结

wget 是一个功能强大、灵活多变的命令行下载工具。从简单的单文件下载到复杂的网站镜像,它都能胜任。掌握 wget 的常用选项,如 -O, -P, -c, -r, -l, -A, -R, -m 等,将极大地提升您在命令行环境下获取网络资源的效率。

多加实践是掌握 wget 的关键。从下载小文件开始,逐步尝试使用断点续传、限速、批量下载,最后探索递归下载和网站镜像。记住,在使用递归下载等可能对服务器造成负担的功能时,请务必谨慎并尊重网站的规定。

希望这篇教程能够帮助您迈出使用 wget 的第一步!祝您下载愉快!


发表评论

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

滚动至顶部