命令行下做批量文件下载,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,确认目录结构和过滤规则符合预期


转载请注明