如何在 Wget 中使用代理(并避开常见坑)

最后更新于 June 1, 2026
如何在 Wget 中使用代理(并避开常见坑)
AI 摘要
使用命令行参数、配置文件或环境变量来配置 Wget 代理。本 2026 指南涵盖优先级、认证方式,以及企业防火墙问题的解决方案。

Wget 代理配置看起来就像是五秒钟能搞定的小事——直到你花了整整一小时,才发现请求根本没走代理,而且还没有任何报错。我见过资深系统管理员和初级开发者都在这件事上翻车。

问题通常根本不在代理本身,而在于 Wget 可能会从四个不同位置读取代理设置、变量大小写用错时会悄悄失效,以及企业网络里那些连 man 手册都懒得讲清楚的特殊情况。本文会把 Wget 配置代理的每一种方法、多个设置冲突时的真实优先级、常见错误对应的终端输出,以及专门面向 Windows 和企业防火墙用户的部分全部讲清楚——而这恰恰是几乎所有其他教程都会忽略的人群。

  • 难度: 初级到中级
  • 所需时间: 阅读并完成配置约 15 分钟;真正上手后约 2 分钟
  • 你需要准备: 已安装并可用的 Wget(下文有安装方法)、代理地址(主机 + 端口),以及可选的代理账号密码

试用 Thunderbit,轻松提取结构化数据

什么是 Wget?为什么要让它走代理?

wget-through-proxy-diagram.webp

Wget 是一个命令行工具,可以不通过浏览器直接从互联网下载文件和网页。GNU 官方的定义称它是“非交互式网络下载器”——也就是说,它可以在后台运行、断点续传,还能递归下载内容,全程不需要人工点来点去。

在这里,代理就是一个中间服务器。不是你的机器直接连目标网站,而是 Wget 先把请求发给代理,再由代理转发出去。这样做通常有几个原因:

  • 符合企业防火墙规范——公司要求所有外发流量都必须经过指定代理
  • 隐私与 IP 管理——目标网站看到的是代理 IP,而不是你的真实 IP
  • 地域测试——从特定地区访问受限内容或测试 CDN 表现
  • 数据采集流程——通过轮换代理抓取 HTML,用于研究或监控
  • CI/CD 环境——受限网络里的构建运行器只能通过代理访问互联网

Wget 原生支持 HTTP、HTTPS 和 FTP 代理,但不支持 SOCKS5。如果你需要 SOCKS5,可以用 curl 的原生支持来处理 socks4://socks5://socks5h://,或者借助 proxychains4 之类的工具把 Wget 包起来用。

如何在 Linux、macOS 和 Windows 上安装 Wget

在配置代理之前,你得先确认机器上装了 Wget。这部分很快——它只是前置条件,不是重点。

Linux(Debian/Ubuntu 和 RHEL/CentOS)

# Debian/Ubuntu
sudo apt update
sudo apt install wget

# RHEL/CentOS/Fedora
sudo dnf install wget

# 验证
wget --version

Ubuntu 24.04 LTS 自带 Wget 1.21.4Debian Trixie 则是 1.25.0CentOS Stream 10 的包信息显示为 1.24.5

macOS(Homebrew)

brew install wget
wget --version

Homebrew 的 formula 当前提供稳定版 Wget 1.25.0,过去一年安装量达到 396,818 次

Windows(Chocolatey 和手动安装)

choco install wget
wget --version

Chocolatey 的 GNU Wget 包累计下载量已经超过 1000 万次,当前版本为 1.21.4。二进制文件通常会安装到 C:\ProgramData\chocolatey\bin\wget.exe

Windows 用户要注意一点:Wget 查找 .wgetrc 的位置会因构建方式不同而变化。下面的 Windows 部分会详细说明。

用 Wget 走代理的 4 种方式(以及该怎么选)

四种方法,对应不同的作用范围和优先级:

wgetrc-priority-bypass-proxy.webp

  1. 命令行 -e 参数——一次性、只对当前命令生效
  2. 用户配置文件(~/.wgetrc——对该用户运行的所有 Wget 命令生效
  3. 系统配置文件(/etc/wgetrc——对机器上的所有用户生效
  4. 环境变量(http_proxyhttps_proxy——对整个 shell 会话生效

方法 1:命令行参数(一次性代理)

适合快速测试。命令结束后设置就消失。

wget -e use_proxy=on -e http_proxy=http://HOST:PORT/ http://example.com/file.zip

如果目标是 HTTPS:

wget -e use_proxy=on -e https_proxy=http://HOST:PORT/ https://example.com/

快速自检:通过代理抓取当前外网 IP:

wget -qO- -e use_proxy=on -e http_proxy=http://HOST:PORT/ http://ifconfig.me

如果输出显示的是代理的 IP,而不是你自己的 IP,那就说明配置成功了。

方法 2:用户配置文件(~/.wgetrc

把下面这些内容写入 ~/.wgetrc(如果文件不存在就新建一个):

use_proxy = on
http_proxy = http://proxy.company.com:8080/
https_proxy = http://proxy.company.com:8080/
no_proxy = localhost,127.0.0.1,.internal.company.com

注意 = 两边的空格——这是 .wgetrc 的标准语法。之后,这个用户执行的每条 Wget 命令都会走代理。

方法 3:全局配置(/etc/wgetrc

配置项和 ~/.wgetrc 一样,只是放在系统级配置文件里。GNU 将它定义为全局启动文件——具体路径取决于你的安装前缀。常见位置包括:

  • /etc/wgetrc(大多数 Linux 包管理器)
  • /usr/local/etc/wgetrc(部分 Homebrew 构建)
  • wget --version 输出里显示的 Wgetrc: 路径

这种方式适合共享服务器、Docker 容器,或者任何需要所有用户都走同一代理的环境。

方法 4:环境变量(http_proxy / https_proxy

export http_proxy=http://HOST:PORT/
export https_proxy=http://HOST:PORT/
export no_proxy=localhost,127.0.0.1,.internal.company.com

这些变量会影响整个 shell 会话,而不只是 Wget。像 curl 之类的工具也会读取它们。

重要提醒: Wget 只读取小写的环境变量名。HTTP_PROXY(大写)会被静默忽略,不报错、不提示、什么都没有。后面的坑位部分我会展示完整终端输出,但这一点现在就值得直接记住。

代理方法的优先级:多个设置同时存在时谁覆盖谁?

如果你的环境变量、.wgetrc 和命令行里都配了代理,到底谁说了算?很多资料都讲不清,我专门测试过。

下面是经过验证且 官方文档支持 的优先级:

优先级方法作用范围覆盖对象
1(最高)-e 命令行参数单条命令所有设置
2~/.wgetrc当前用户系统配置 + 环境变量
3/etc/wgetrc全系统仅环境变量
4(最低)http_proxy / https_proxy 环境变量Shell 会话

我在 Wget 1.25.0 上做了冲突配置测试:环境变量指向 3128 端口,配置文件指向 3129 端口,命令行指向 3130 端口。

  • 配置文件优先于环境变量: Wget 连接到了 3129 端口,忽略了 3128。
  • 命令行优先于配置文件: Wget 连接到了 3130 端口,同时忽略了 3129 和 3128。

如果你想彻底绕过所有代理设置,--no-proxy 就是那个“后门”。无论代理是在哪里配置的,它都会直接跳过:

wget --no-proxy https://internal-server.company.com/report.pdf

实际场景:你的系统管理员已经在 /etc/wgetrc 里全局设置了代理,但你现在需要直接访问公司内网服务器。这时不要去改系统配置,单条命令加 --no-proxy 就行。

如何让 Wget 使用带账号密码的代理

auth-proxy-security-workflow.webp

大多数商业代理和住宅代理都需要用户名和密码。Wget 通过两种方式支持它们,本质上都是使用 HTTP Basic 认证 传递代理凭据。

在代理 URL 中直接写入账号密码

wget -e use_proxy=on \
  -e http_proxy=http://USERNAME:PASSWORD@proxy.company.com:8080/ \
  http://example.com/file.zip

这个写法也适用于 .wgetrc

http_proxy = http://USERNAME:PASSWORD@proxy.company.com:8080/
https_proxy = http://USERNAME:PASSWORD@proxy.company.com:8080/

使用 --proxy-user--proxy-password 参数

wget --proxy-user=USERNAME --proxy-password=PASSWORD \
  -e use_proxy=on \
  -e http_proxy=http://proxy.company.com:8080/ \
  http://example.com/file.zip

这些参数会覆盖代理 URL 里嵌入的 user:pass@

如何保护凭据安全

这两种方式都会泄露凭据。GNU 明确提醒 ,命令行里的密码会被 ps 或进程列表工具看到。建议这样做:

  • 单用户机器: 把凭据放在 ~/.wgetrc 中,并锁定文件权限:chmod 600 ~/.wgetrc
  • CI/CD 流水线: 使用 GitHub Actions 的加密 Secrets 或你所在平台的等效功能。通过步骤定义里的小写环境变量传入,千万不要硬编码到 YAML 里。
  • Docker 构建: 不要用 ARGENV 存秘密。Docker 官方文档明确警告 构建参数可能会留在最终镜像里。应改用 BuildKit 的 secret mount。
  • 版本控制: 永远不要提交包含凭据的 .wgetrc,并把它加入 .gitignore

还有一个与 Wget 相关、在 GitHub Actions 里特别值得注意的细节:Secrets 名称通常按约定使用大写保存,但你暴露给 Wget 的环境变量必须是小写(http_proxy,而不是 HTTP_PROXY)。

如何在 Windows 和企业防火墙环境下使用 Wget 代理

这类主题的大多数文章都会停在“用 Chocolatey 安装”这一步。如果你在 Windows 上,或者身处企业代理环境里,真正的问题才刚开始。

windows-pac-ntlm-config.webp

Windows 会从哪里读取 .wgetrc

GNU 文档 说,Wget 会读取 $HOME/.wgetrc,除非 WGETRC 环境变量指向别处。在 Windows 上,$HOME 可能映射到 %USERPROFILE%(比如 C:\Users\alice),也可能不会——这取决于你用的是 Chocolatey 版本、MSYS2 版本、Git Bash,还是独立二进制。

我的建议是:别猜,直接用 --config 参数,行为最稳定:

wget --config=C:\Users\alice\wgetrc https://example.com/file.zip

如果你想测试某个构建是否会读取特定位置的配置文件,可以先创建一个指向“故意错误代理”的测试文件:

; C:\Users\alice\wget-test.rc
use_proxy = on
http_proxy = http://127.0.0.1:3128/

然后执行:

wget --config=C:\Users\alice\wget-test.rc --spider http://example.com/

如果 Wget 尝试连接 127.0.0.1:3128,就说明它读到了这个文件。

在 Windows 上设置代理环境变量

CMD(仅当前会话):

set http_proxy=http://HOST:PORT/
set https_proxy=http://HOST:PORT/
wget http://example.com/

PowerShell(仅当前会话):

$env:http_proxy = "http://HOST:PORT/"
$env:https_proxy = "http://HOST:PORT/"
wget http://example.com/

永久生效(重启后仍保留):

setx http_proxy http://HOST:PORT/
setx https_proxy http://HOST:PORT/

执行 setx 之后,你需要重新打开一个新的终端窗口,当前会话不会立即看到变化。

企业代理常见坑:PAC 文件、NTLM 认证,以及如何找到代理地址

企业用户最容易踩到的三个坑:

PAC 文件: 很多公司使用 Proxy Auto-Configuration(PAC)文件——也就是基于 JavaScript 的脚本,用来告诉浏览器不同 URL 应该走哪个代理。Wget 没有 JavaScript 解释器,所以它不能读取 PAC 文件curl 文档也明确指出了这一点。解决办法是:打开 PAC 文件(或者直接问 IT),找到目标域名对应的 PROXY host:port,再把这个静态地址配置到 Wget 中。

NTLM 认证: Wget 的代理认证 只实现了 Basic auth。如果公司的代理要求 NTLM,并且你一直收到 407 Proxy Authentication Required,那就别再浪费时间尝试各种 --proxy-user 写法了。直接安装 Cntlm——它是一个本地中继,可以处理 NTLM/NTLMv2 认证,再把 Basic auth 接口提供给 Wget。Cntlm 仍在维护中(最近更新为 2025 年 10 月,约每周 395 次下载)。

企业代理用户决策树:

  1. 先试试 set http_proxy=http://YOUR_PROXY:PORT/,然后运行 Wget。
  2. 如果出现 407 错误,而且公司用的是 NTLM → 安装 Cntlm,配置域账号,再让 Wget 指向 Cntlm 的本地端口(通常是 http://127.0.0.1:3128/)。
  3. 如果公司使用 PAC 文件 → 从 PAC 中提取实际的 PROXY host:port,或者直接向 IT 索要静态代理地址。

常见企业代理端口:3128(类似 Squid)、8080(通用 HTTP 代理)、8888(Fiddler/Charles 这类调试代理)。这些只是惯例,不是保证。

使用 Wget 代理时常见的坑(附真实报错输出)

现在进入标题里承诺的“干货部分”。下面的所有输出,都在 2026-06-01 使用 Wget 1.25.0(macOS,Homebrew)复现。

wget-troubleshooting-diagnostic-flow.webp

坑 1:漏写 http:// 前缀

一些老教程声称这一定会坏掉。但在 Wget 1.25.0 里,设置 http_proxy=127.0.0.1:3128 实际上是可以工作的——Wget 会悄悄帮你补上 http://

Prepended http:// to '127.0.0.1:3128'
Spider mode enabled. Check if remote file exists.
--2026-06-01 10:38:15--  http://example.com/
Connecting to 127.0.0.1:3128... failed: Operation not permitted.

它仍然连接到了正确的代理。不过我还是建议你始终写上 http:// 前缀,并保留结尾的斜杠。这样能避免不同 Wget 版本之间的歧义,也能让带凭据的写法(http://user:pass@host:port/)更清晰。

坑 2:use_proxy=yesuse_proxy=on

在我测试的 Wget 1.25.0 里,yeson 都能工作。不过非法值会直接报出明确错误:

wget: use_proxy: Invalid boolean 'true'; use `on' or `off'.

为了兼容性最好,建议用 on——它符合 手册里定义的布尔值格式,也和 Wget 自己的错误提示一致。

坑 3:大写 HTTP_PROXY 会被静默忽略

这是最让人抓狂的坑,因为它根本不会报错。Wget 就像没设置代理一样,直接去连目标站点。

大写写法(错误——没有走代理):

HTTP_PROXY=http://127.0.0.1:3128/ wget --no-config --spider http://example.com/
Spider mode enabled. Check if remote file exists.
--2026-06-01 10:40:06--  http://example.com/
Resolving example.com (example.com)... 198.18.58.61
Connecting to example.com (example.com)|198.18.58.61|:80... connected.
HTTP request sent, awaiting response... 200 OK

小写写法(正确——尝试走代理):

http_proxy=http://127.0.0.1:3128/ wget --no-config --spider http://example.com/
Spider mode enabled. Check if remote file exists.
--2026-06-01 10:40:16--  http://example.com/
Connecting to 127.0.0.1:3128... failed: Connection refused.

看出区别了吗?大写版本是直接解析并连接 example.com,小写版本则尝试连接代理。两者都不会给出警告。curl 也有类似行为——它对大多数代理变量接受大写,但出于安全原因,会明确拒绝大写的 HTTP_PROXY

修复方法: 始终使用小写的 http_proxyhttps_proxy

坑 4:.wgetrc 里残留旧代理,导致“Connection refused”

如果你(或者系统管理员,或者 Docker 镜像)在配置文件里留下了旧代理地址,通常会看到类似这样的报错:

Spider mode enabled. Check if remote file exists.
--2026-06-01 10:39:10--  http://example.com/
Connecting to 127.0.0.1:3128... failed: Connection refused.

错误信息指向的是旧代理 IP,而不是目标站点。排查顺序应当按照优先级来:

  1. 检查命令里有没有 -e 参数或 shell 别名
  2. 检查 ~/.wgetrc(或者 WGETRC 指向的文件)
  3. 检查系统配置(wget --version 输出里显示的路径)
  4. 检查环境变量:env | grep -i proxy

调试时,--no-config 非常有用——它会让 Wget 跳过所有配置文件:

wget --no-config --spider http://example.com/

如果这样就正常了,那问题一定出在某个配置文件里。

坑 5:HTTPS 代理语法容易搞混

这个问题会让很多人卡住。设置 https_proxy 时,代理 URL 本身通常还是 http://,而不是 https://。因为 Wget 会通过代理发送一个 HTTP CONNECT 请求,为加密的 HTTPS 会话建立隧道。

正确写法:

https_proxy=http://proxy.company.com:8080/
wget https://example.com/

Wget 会先向代理发送 CONNECT example.com:443 HTTP/1.1,然后再通过该隧道传输 HTTPS。

错误写法(对 HTTP 目标 URL 使用 HTTPS 代理端点):

http_proxy=https://127.0.0.1:18082/
wget http://example.com/
Error in proxy URL https://127.0.0.1:18082/: Must be HTTP.

Wget 1.25.0 会直接拒绝把 https:// 当作 HTTP 目标的代理 URL。除非你的组织明确文档说明了 HTTPS 代理端点,并且你已经用当前 Wget 构建测试通过,否则请使用 https_proxy=http://HOST:PORT/

Wget 代理命令速查表(建议收藏)

把这张表收藏起来。它把所有与代理相关的 Wget 参数和配置项都放在一起了。

参数 / 指令使用场景示例说明
-e use_proxy=on命令行-e use_proxy=onon 最稳妥;某些构建也接受 yes
-e http_proxy=命令行-e http_proxy=http://proxy:8080/请保留 http:// 前缀和结尾的 /
-e https_proxy=命令行-e https_proxy=http://proxy:8080/即使目标是 HTTPS,代理 URL 通常仍是 http://
--proxy-user命令行--proxy-user=admin会覆盖 URL 中的 user:pass@
--proxy-password命令行--proxy-password=secret会出现在 ps 中——共享系统上尽量别用
--no-proxy命令行--no-proxy跳过所有来源的代理设置
--no-config命令行--no-config跳过所有配置文件——调试时非常有用
--config=FILE命令行--config=/tmp/wgetrc让配置路径可控——Windows 和 CI 很适合
http_proxy.wgetrc / 环境变量http_proxy = http://proxy:8080/配置文件里 = 两边要有空格;环境变量必须小写
https_proxy.wgetrc / 环境变量https_proxy = http://proxy:8080/格式与 http_proxy 相同
ftp_proxy.wgetrc / 环境变量ftp_proxy = http://proxy:8080/用于 FTP 下载
no_proxy.wgetrc / 环境变量no_proxy = localhost,127.0.0.1,.corp用逗号分隔的域名列表
proxy_user.wgetrcproxy_user = admin等同于 --proxy-user
proxy_password.wgetrcproxy_password = secretchmod 600 保护文件权限

什么时候 Wget + 代理不是最佳方案(以及该用什么替代)

data-extraction-workflow.webp

把代理配置讲了这么多之后,我想给一个反直觉的建议:有时候你其实不该这么折腾。

很多搜索“wget proxy”的人,其实并不是想下载单个文件,而是想从网站里收集结构化数据——比如商品价格、联系人列表、房产信息——只是因为他们熟悉 Wget,就顺手用了它。问题在于,Wget 只会给你原始 HTML。你后面还得自己解析、清洗、整理结构化。而如果你还要靠轮换代理避封,那就等于同时维护代理列表、下载脚本、解析器和导出流程。

你的目标最佳工具原因
通过代理下载单个文件带代理参数的 wget简单,一条命令搞定
通过代理镜像站点或目录wget --recursive + 代理配置Wget 的递归抓取本来就是强项
抓取结构化数据(表格、列表、联系人)ThunderbitWget 只会给你原始 HTML,你还得自己解析。Thunderbit 的 AI 会直接识别页面,并把结构化数据输出到 Excel、Google Sheets、Airtable 或 Notion,全程无需写代码。它的云端爬取还能处理 IP 轮换和反爬措施,让你完全不用折腾代理设置。
通过代理调用 REST APIcurlHeader 控制更强,原生支持 JSON,也支持 SOCKS5
持续、定时的数据采集Thunderbit 定时爬虫cron + wget页面结构变动时,Thunderbit 能自动适应;而 cron + wget 脚本经常会悄悄失效

Wget 在文件下载方面非常强。但如果你的真实需求是“配置代理 → 轮换 IP → 下载 HTML → 写解析器 → 导出到表格”,那就有太多零碎环节了。而你真正想要的,其实往往只是一个数据表。要是你说的正是这种情况,我们的 Chrome 扩展 两次点击就能把整个流程搞定。想了解更多,可以看看我们关于 AI 网页爬虫无需编程的网页抓取 的文章。

但如果你的目标只是“通过公司代理把这个 ZIP 文件下载下来”,那 Wget 依然是对的工具,而且你现在已经知道该怎么正确配置它了。

核心要点

简短总结如下:

  • 四种方法,优先级清晰: 命令行参数覆盖用户配置,用户配置覆盖系统配置,系统配置覆盖环境变量。--no-proxy 则会覆盖一切。
  • 环境变量一定要用小写http_proxy,而不是 HTTP_PROXY)。大写会被静默忽略。
  • 代理 URL 里始终带上 http://,即使是 https_proxy 也一样。代理端点本身是 HTTP,它通过 CONNECT 隧道转发 HTTPS。
  • .wgetrc-e 参数里的布尔值建议用 on。这是跨版本最稳妥的选择。
  • Windows 用户:--config=C:\path\to\wgetrc 避免配置文件路径歧义;会话级代理变量用 set(CMD)或 $env:(PowerShell)。
  • 企业代理用户: Wget 不能读 PAC 文件,也不原生支持 NTLM 认证。必要时可以用 Cntlm 作为本地中继。
  • 把上面的速查表收藏起来——每次忘记参数名时,它都能帮你省掉重看整篇文章的时间。

如果你的真实目标是结构化数据提取,Thunderbitcurl 可能更适合你。最好的调试,是你根本不用开始的那次调试。

常见问题 FAQ

1. Wget 支持 SOCKS5 代理吗?

不支持。GNU Wget 1.x 只支持 HTTP、HTTPS 和 FTP 代理。Wget2 项目里有人提过 SOCKS5 需求,但这并不是标准且明确记录的选项。如果你需要 SOCKS5,可以直接用 curlsocks5://socks5h:// 原生方案,或者用 proxychains4 强制让 Wget 走 SOCKS 路由。

2. 为什么我设置了大写 HTTP_PROXY,代理却被忽略了?

Wget 只读取小写环境变量名(http_proxyhttps_proxyftp_proxyno_proxy)。像 HTTP_PROXY 这样的大写写法会被静默忽略——没有报错,也没有警告。这也是最常见、最让人崩溃的问题之一,因为表面上完全看不出哪里出错了。务必使用小写。

3. 怎么让某些域名不走代理?

使用 no_proxy 指令,可以写成环境变量,也可以写进 .wgetrc

export no_proxy=localhost,127.0.0.1,.mycompany.com

或者写到 ~/.wgetrc

no_proxy = localhost,127.0.0.1,.mycompany.com

域名之间用逗号分隔。前面的点号(.mycompany.com)会匹配所有子域名。

4. Wget 可以配合轮换代理使用吗?

Wget 本身没有内置代理轮换功能。你有两种做法:一种是使用会在服务端自动轮换 IP 的代理服务商(这样你每次都连同一个网关地址,但出口 IP 会变化);另一种是自己写一个 shell 脚本,从代理列表里随机挑一个,然后每次调用时通过 -e http_proxy=... 传入。至于更复杂的需求——自动轮换、重试逻辑、反爬处理——通常专门的抓取工具会更合适。

5. 在 Wget 里,http_proxyhttps_proxy 有什么区别?

当目标 URL 是 http:// 时,会使用 http_proxy;当目标 URL 是 https:// 时,会使用 https_proxy。但这两种情况下,代理 URL 本身通常仍然是 http:// 地址。对于 HTTPS 目标,Wget 会先通过代理发送 HTTP CONNECT 请求来建立隧道,真正的 HTTPS 加密则在 Wget 与目标服务器之间端到端完成。代理能看到 CONNECT 请求中的主机名,但无法读取已加密的内容。

试用 Thunderbit,进行 AI 网页爬取 Get Started Free

了解更多

Ke
Ke
Thunderbit 首席技术官 | 高级数据科学家与机器学习专家 Ke Shen 拥有近十年的机器学习和数据科学经验,毕业于哥伦比亚大学,曾任 Walmart Labs 高级数据科学家。他在 Python、R、Java 和统计学方面拥有深厚且备受同行认可的专业能力,并分享如何将复杂的 AI 算法从理论落地到生产级架构的实战经验。
目录

只要开口,就能抓取网页

用简单英文说出你的需求。或者更简单,什么都不用说。

试用 Thunderbit 免费
使用 AI 提取数据
轻松将数据传输到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week