命令行下做批量文件下载,Wget 几乎是绕不开的工具。
但是 wget 配置的坑不少,特别是代理(proxy)、递归相关配置。
这篇文章会告诉你 wget 在实际使用中是怎么用的,以及跟 cURL 的对比。
Wget vs cURL:什么时候该用谁
不是所有下载场景都该上 Wget。两者的能力边界很明确:
- 需要递归下载、整站镜像、断点续传——选 Wget
- 需要 SOCKS 代理支持、更多协议(LDAP、SMTP 等)、或作为 libcurl 集成到代码里——选 cURL
Wget 的杀手锏是 --mirror 一键递归和原生的断点续传能力。
cURL 则在 认证方式多样性和协议覆盖面上更占优。
备注:Wget 可以通过环境变量 all_proxy 或工具如 proxychains 支持 SOCKS 的。
代理配置的两种方式
手动管一堆 URL 做下载已经够痛苦了,系统级 http_proxy 环境变量又会污染全局网络流量,没法按任务隔离。Wget 提供了两个层面的解法:
方案 A:命令行临时指定——适合一次性任务
wget -e use_proxy=yes -e http_proxy=[地址]:[端口] \
--proxy-user=USER --proxy-password=PASS [目标URL]
-e 参数直接在命令级别覆盖配置,任务结束即失效,不会影响其他进程。
方案 B:.wgetrc 持久化——适合高频使用场景
在用户目录的 .wgetrc 中写入:
use_proxy = on
http_proxy = http://[地址]:[端口]
proxy_user = USER
proxy_password = PASS
这种方式每次执行 Wget 都会自动生效,省去重复输入。但要注意密码明文存储的风险,生产环境建议配合文件权限控制。
递归下载 + 后缀过滤
wget --recursive --no-clobber --accept pdf [目标URL]
--accept pdf 只拉取 PDF 文件,--no-clobber 跳过已下载的同名文件,组合使用可以精准构建本地资源镜像。
批量下载与容错机制
实际工程中,URL 列表里混几个死链是常态。Wget 的 --input-file(-i)天然支持容错——列表中某个 URL 挂了,它会自动跳过继续处理后续任务,不会让整个批量任务中断。
避坑经验
- 同名文件陷阱:Wget 默认不会覆盖同名文件,而是自动追加数字后缀(
.1、.2)。长期跑递归下载任务时,这事容易导致存储空间悄悄占满,或者文件版本混乱。--no-clobber是不覆盖(如果文件已存在则跳过)。备注:如果你想要断点续传,应该用-c (--continue)。这两个参数容易混淆 - 目录结构控制:递归下载时加
--no-directories可以把所有文件平铺到一个目录,加--no-parent可以防止爬到父级路径之外。两个参数组合使用,能有效控制下载范围。 - UA 伪装:部分服务器会校验 User-Agent,直接用 Wget 默认标识可能被拒。通过
--header="User-Agent: [自定义字符串]"修改即可绕过。 - 断点续传:大文件下载碰到网络波动是家常便饭,Wget 原生支持 Resume,不用从头再来,省带宽也省时间。
- 代理选型:在跑批量抓取或递归下载时,IP 被目标站点封禁是高频问题。我们在实际项目中接入蜻蜓代理来轮换出口 IP,主要看中其动态轮换稳定、节点池资源充足,配合 Wget 的代理参数能大幅降低封禁率。通过动态代理轮换,可以有效规避 403 Forbidden 或频繁触发的 CAPTCHA 验证。
生产环境注意点
- 代理密码不要明文写进
.wgetrc,至少做一层文件权限隔离(chmod 600) - 后台静默运行加
-b参数,适合 cron 定时任务场景 - 批量下载前先用小规模 URL 列表做一次 dry run,确认目录结构和过滤规则符合预期
转载请注明
- 蜻蜓代理 - Wget代理配置与递归下载实战教程 - 命令行技巧
- 头条号 - 蜻蜓软件
- 微信公众号:蜻蜓软件(qingtingsoft)

