在日常的网络操作中,我们经常需要从互联网上获取文件或数据。虽然大多数人习惯使用浏览器进行下载,但在许多特定场景下,特别是对于系统管理员、开发者或需要进行自动化操作的用户而言,一个强大的命令行下载工具显得尤为重要。wget 就是这样一款广受欢迎的工具。
wget 是什么?
wget 是一个免费的、非交互式的网络下载工具,属于GNU项目的一部分。非交互式意味着它可以在没有用户登录或没有用户干预的情况下工作。这使得它非常适合用于脚本、定时任务(如 cron jobs)以及需要在后台运行的自动化下载任务。
它支持通过 HTTP、HTTPS 和 FTP 协议下载文件。与大多数 Web 浏览器不同,wget 可以稳定地在连接中断后从上次中断的地方继续下载(如果服务器支持)。它还能以递归方式下载整个网站结构,并将其转换成本地镜像。
为什么使用 wget?
相比于图形界面的浏览器下载,使用 wget 具有诸多优势:
- 自动化与脚本化: wget 可以在命令行中运行,非常方便集成到 shell 脚本、Python 脚本或其他自动化流程中。你无需手动点击或监控。
- 断点续传: 使用 -c 或 –continue 选项,wget 可以在下载中断(如网络问题)后恢复下载,避免从头开始,尤其对于大文件下载非常有用。
- 递归下载: 可以轻松下载整个目录结构或网站的一部分,创建本地副本。这对于备份网站或离线浏览非常方便。
- 后台运行: 使用 -b 或 –background 选项,可以将下载任务放到后台执行,即使关闭终端窗口,下载也不会停止。
- 带宽控制: 可以限制下载速度,避免占用所有网络带宽,影响其他网络活动。
- 稳定可靠: 在网络环境不稳定时,wget 通常比浏览器下载更稳定,能更好地处理超时和重试。
- 处理多种协议: 支持 HTTP、HTTPS 和 FTP。
- 处理复杂情况: 可以处理重定向、Cookie、身份验证、代理等复杂的网络下载场景。
wget 在哪里使用?
wget 是一个跨平台的工具,主要用于:
- Linux 和 Unix-like 系统: 在绝大多数 Linux 发行版(如 Ubuntu, CentOS, Debian, Fedora 等)以及 macOS、BSD 系统中,wget 是一个标准或易于安装的工具,是系统管理和自动化任务的常用利器。
- 服务器环境: 在没有图形界面的服务器上,wget 是下载文件到服务器的主要方式。
- Windows 系统: 虽然 Windows 没有内置 wget,但可以通过安装额外的工具包(如 Cygwin, MinGW, Scoop, Chocolatey)或直接下载编译好的 Windows 版本来使用 wget。WSL (Windows Subsystem for Linux) 也提供了原生的 wget 支持。
- 脚本和程序中: 作为外部命令被各种脚本语言(Shell, Python, Perl 等)调用,执行下载任务。
wget 下载能处理多少?
这里的“多少”可以理解为 wget 在处理数据量、文件数量或速度方面的能力:
- 数据量: wget 本身没有固有的数据量限制。它可以下载任意大小的文件(只要存储空间足够)或通过递归下载获取大量文件(取决于网站大小和深度设置)。其能够处理的实际数据量取决于你的硬盘空间、网络带宽以及目标服务器的限制。
- 文件数量: 通过递归下载(-r 选项),wget 可以自动抓取一个链接下的所有文件或按设定的规则抓取整个网站的文件,数量可以非常庞大。
- 下载速度: 默认情况下,wget 会尝试以最快速度下载,速度受限于你的网络连接带宽和服务器的上传速度。但你可以使用 –limit-rate 选项来主动限制下载速度,例如限制到 100KB/s 或 1MB/s。
- 递归深度: 使用 -l 选项可以控制递归下载的深度,从而限制下载的文件层级和数量。
总的来说,wget 是为处理大量下载任务而设计的,无论是单个大文件还是结构复杂的文件集合。
如何使用 wget (详细操作指南)?
使用 wget 主要通过在终端输入命令和相应的选项来完成。下面是一些最常见和实用的用法示例。
基本的单文件下载
这是最简单的用法,只需提供文件的 URL:
wget https://example.com/path/to/your/file.zip
这条命令会尝试从指定的 URL 下载文件,并以原文件名(这里是 file.zip)保存在当前目录下。
将文件保存为不同的名称
如果你想将下载的文件保存为另一个名字,可以使用 -O 或 –output-document 选项:
wget -O my_new_filename.pdf https://example.com/documents/report.pdf
这会将 report.pdf 下载并保存为 my_new_filename.pdf。
断点续传下载
如果下载过程中断,你可以使用 -c 或 –continue 选项从上次中断的地方恢复下载:
wget -c https://example.com/large_file.iso
如果 large_file.iso 文件已经部分存在于当前目录,wget 会检查本地文件大小并从剩余部分开始下载。
后台下载
对于需要长时间运行的下载任务,可以将其放到后台执行,这样即使关闭终端窗口也不会影响:
wget -b https://example.com/very_large_dataset.tar.gz
使用 -b 选项后,wget 会立即返回命令行提示符,并在后台运行。下载进度和信息会记录在一个名为 wget-log 的文件中(或指定 -o 选项来指定日志文件)。你可以使用命令如 tail -f wget-log 来查看下载进度。
从文件列表中下载多个文件
如果你有很多文件需要下载,可以将它们的 URL 列在一个文本文件中,每行一个 URL,然后使用 -i 或 –input-file 选项批量下载:
首先创建一个文本文件,例如 urls.txt:
https://example.com/file1.zip https://example.com/images/photo.jpg ftp://ftp.example.com/public/data.tar.gz
然后运行命令:
wget -i urls.txt
wget 会逐行读取 urls.txt 文件中的 URL 并依次下载。
递归下载整个网站或目录
这是 wget 最强大的功能之一,用于镜像网站或下载特定目录及其子目录下的所有文件:
wget -r https://example.com/docs/
使用 -r 或 –recursive 选项会开始递归下载。默认情况下,它会下载链接指向的所有内容,深度是无限的,并且会创建与网站结构相似的本地目录结构。
控制递归下载的选项:
-
-l depth: 设置递归下载的深度。例如,
-l 1只下载当前页面链接的文件,不深入到子页面链接的文件;-l inf是无限深度(默认)。 - -nd 或 –no-directories: 不创建目录结构,将所有下载的文件都放在当前目录下(注意文件名冲突问题)。
- -np 或 –no-parent: 不下载父目录层级的文件。
-
-A list: 仅下载符合逗号分隔的扩展名列表或通配符模式的文件。例如:
-A "*.pdf,*.docx"只下载 PDF 和 DOCX 文件。 -
-R list: 排除符合逗号分隔的扩展名列表或通配符模式的文件。例如:
-R "*.mp3,*.avi"排除 MP3 和 AVI 文件。 -
-m 或 –mirror: 这是镜像网站的常用选项,等同于
-r -l inf -N -p -k。它会递归无限深度下载,设置时间戳(只有当远程文件比本地文件新时才下载),下载所有页面必需的文件(如 CSS, 图片),并将链接转换成本地链接以便离线浏览。
一个常见的组合用法是:
wget -r -l 1 -nd -A “*.jpg” https://example.com/images/
这条命令会递归下载 https://example.com/images/ 链接指向的页面,深度为1(即只处理当前页面上的链接),不创建目录结构,只下载扩展名为 .jpg 的文件。
限制下载速度
为了不占用过多带宽,可以使用 –limit-rate 选项限制下载速度。单位可以是 B (字节), k (千字节), m (兆字节)。
wget –limit-rate=500k https://example.com/large_video_file.mp4
wget –limit-rate=1m https://example.com/another_file.zip
第一条命令限制速度为 500 KB/s,第二条命令限制为 1 MB/s。
处理 HTTPS 证书问题
有时遇到自签名证书或证书验证失败的 HTTPS 网站,如果确定信任该网站,可以使用 –no-check-certificate 选项跳过证书检查。请注意:这样做会降低安全性,因为它禁用了证书验证,可能面临中间人攻击的风险。除非你清楚自己在做什么,否则应尽量避免使用此选项。
wget –no-check-certificate https://insecure.example.com/file.html
需要身份验证的下载
对于需要用户名和密码才能访问的资源,可以使用 –user 和 –password 选项:
wget –user=your_username –password=your_password https://example.com/private/document.pdf
使用代理下载
如果你需要通过 HTTP 或 FTP 代理进行下载,可以使用 –proxy 选项或设置环境变量。例如,使用 HTTP 代理:
wget –proxy=on –proxy-user=proxyuser –proxy-password=proxypassword http://example.com/somefile.zip
# 或者更常用的方式是设置环境变量
# export http_proxy=http://proxy.example.com:8080/
# export https_proxy=http://proxy.example.com:8080/
# export ftp_proxy=http://proxy.example.com:8080/
# wget http://example.com/somefile.zip
模拟用户代理(User-Agent)
有些网站会检查请求的 User-Agent 头部,如果发现是自动下载工具可能会拒绝访问。可以使用 –user-agent 选项模拟常见的浏览器 User-Agent:
wget –user-agent=”Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0″ https://example.com/sensitive_data.html
还有哪些常见的 wget 用法?
除了上述基本用法,wget 还有很多其他高级选项和用途,例如:
- -O – : 将下载内容输出到标准输出,常用于与其他命令管道连接。
- –post-data / –post-file: 发送 POST 请求,可以用于模拟表单提交下载。
- –header: 添加自定义 HTTP 头部。
- –tries: 设置重试次数。
- –wait: 设置每次请求之间的等待时间,避免对服务器造成过大压力。
通过组合不同的选项,wget 可以完成非常灵活和复杂的下载任务,是命令行环境下不可或缺的高效工具。熟练掌握这些用法,将极大地提升你的工作效率,尤其是在需要处理大量网络资源的自动化场景中。