Puppeteer 代理设置:认证、SOCKS5 与轮换 IP | Proxy302
让采集脚本或自动化脚本走住宅出口 IP,一个启动参数加一次认证调用就够了:用 --proxy-server 启动 Puppeteer,在第一次导航之前把账号密码交给 page.authenticate(),之后每个页面的加载都从 Proxy302 的网关出去。
开跑之前要准备什么
一个装好 Puppeteer 的 Node.js 项目,外加一个能启动浏览器的脚本。
一个买了动态住宅流量的 Proxy302 账号。Budget 线任意数量都是 US$1.50/GB(100 GB 档 US$1.35/GB),最低买 1 GB;价格看价格页。
你的 Proxy302 代理用户名和密码。控制台「我的资产」页能查到你买的每项资产的 HOST、PORT、USERNAME 和 PASSWORD。
连接参数逐字段说清
网关地址: proxy.proxy302.com — HTTP 和 SOCKS5 共用这一个网关
HTTP 端口: 2222 — Puppeteer 推荐走的入口
SOCKS5 端口: 3333
启动参数: --proxy-server=http://proxy.proxy302.com:2222
认证方式: await page.authenticate({ username, password }),放在第一次 page.goto() 之前
这些值从哪来: Proxy302 控制台「我的资产」
一个能直接跑通的完整脚本
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
args: ['--proxy-server=http://proxy.proxy302.com:2222'],
});
const page = await browser.newPage();
await page.authenticate({
username: 'YOUR_PROXY_USERNAME',
password: 'YOUR_PROXY_PASSWORD',
});
await page.goto('https://ipinfo.io/json');
console.log('出口:', await page.$eval('body', (el) => el.textContent));
await browser.close();
})();按原样可运行:填入你的 Proxy302 凭据后用 Node.js 执行。
启动参数干了什么
--proxy-server 是 Chromium 的命令行开关,Chromium 源码里的注释是 "Uses a specified proxy server, overrides system settings."(使用指定的代理服务器,覆盖系统设置)。Puppeteer 通过 puppeteer.launch() 的 args 选项把它转交给浏览器,API 文档对 args 的说明是 "Additional command line arguments to pass to the browser instance."(传给浏览器实例的额外命令行参数)。浏览器默认以无头模式运行。
Chromium 认 http、https、socks4、socks5 四种代理协议,所以同一个参数两种入口都能带:--proxy-server=http://proxy.proxy302.com:2222 或 --proxy-server=socks5://proxy.proxy302.com:3333。
page.authenticate() 干了什么
Puppeteer API 文档写明 page.authenticate() 为页面提供 "credentials for HTTP authentication"(HTTP 认证凭据),并注明 "Request interception will be turned on behind the scenes to implement authentication."(后台会打开请求拦截来实现认证)。在第一次 page.goto() 之前调用;传 null 即可关闭。
这也是推荐走 HTTP 2222 端口的原因:Proxy302 每条连接都要用户名密码登录,而这条路径让浏览器在页面内部就把登录完成。用户名密码跟你其他工具用的是同一套,都显示在「我的资产」里。
确认出口 IP
在页面里加载 https://ipinfo.io/json。ip 和 country 字段应该属于代理出口,而不是你本机的连接。如果打出来的是自己的 IP,说明启动参数没传到这个脚本驱动的浏览器实例:先打印出口 IP,再检查脚本启动和配置的到底是哪个浏览器。各字段怎么看,代理归属指南里有讲。
流量、价格和有效期
动态住宅按 GB 计费,分两条线:Budget 线 US$1.50/GB 起(100 GB 档 US$1.35/GB),Premium 线 US$5.00/GB 起。最低买 1 GB。预付费、用多少付多少、没有订阅,买到的 GB 永不过期。
Puppeteer 里的轮换 IP 与粘性会话
动态住宅产品页写明了两种行为:每个请求走一条不同的真实住宅 IP;粘性(sticky)会话在一串请求里保持同一条住宅 IP。按请求轮换适合大批量翻页采集、比价这类不想让单个 IP 积累访问历史的任务;粘性会话适合登录流程、购物车这类带会话状态的操作。
你不用维护代理列表:一个网关、一套账号密码就承载全部流量。一条线怎么在这两种行为之间切换,产品页没有写,所以别想当然——直接在脚本里连发两次 https://ipinfo.io/json 对比出口 IP:每次地址都不同就是按请求轮换,两次相同就是会话正抓着同一条 IP。
跑完一轮 URL,再确认出口行为
// 网关和账号密码在任务之间不变。
for (const url of urls) {
await page.goto(url, { waitUntil: 'domcontentloaded' });
// ...提取你要的内容
}
// 确认你这条线的行为:连开两次 IP 回显页,对比出口 IP。
for (let i = 0; i < 2; i++) {
await page.goto('https://ipinfo.io/json', { waitUntil: 'domcontentloaded' });
console.log('出口:', await page.$eval('body', (el) => el.textContent));
}按原样可运行:填入你的 Proxy302 凭据后用 Node.js 执行。
Puppeteer 里用 SOCKS5
SOCKS5 入口在同一网关的 3333 端口。但浏览器本身有个坑:Chromium——也就是 Puppeteer 驱动的那套引擎——的 SOCKS5 客户端在握手问候里只提供一种方法:"no authentication"(无认证),而且只有服务器选中它握手才继续。Chromium 永远不会提供 SOCKS5 的用户名密码认证,而 Proxy302 每条连接都要求用户名密码。
实际可行的路子有三条。一:走 HTTP 2222 端口——认证由 page.authenticate() 端到端完成(见上文示例),其余什么都不用改。二:在本机跑一个小型转发器,接收浏览器不带认证的连接,再转发到带认证的 SOCKS5 入口——只有任务非 SOCKS5 不可才值得这么做,普通网页流量走 HTTP 效果一样。三:在浏览器之外用自己实现了 SOCKS5 用户名密码认证的工具走 SOCKS5。
浏览器外的 SOCKS5:curl
curl -x socks5h://USERNAME:[email protected]:3333 https://ipinfo.io/json按原样可运行:填入你的 Proxy302 凭据后用 Node.js 执行。
为什么写 socks5h 而不是 socks5
保留 socks5h:// 里的那个 h。libcurl 文档对 socks5h:// 的定义是 "SOCKS5 Proxy. Proxy resolves URL hostname"(SOCKS5 代理,由代理端解析 URL 主机名),而普通的 socks5:// 是先在你本机解析域名再去连代理。把解析留在代理端,网站看到的 DNS 才和你的出口 IP 对得上。同一份文档也确认了上条命令里的凭据写法 scheme://username:password@hostname。
常见报错和排查
net::ERR_NO_SUPPORTED_PROXIES: Chromium 错误表的原话是 "There are no supported proxies in the provided list."(提供的列表里没有受支持的代理)。检查 --proxy-server 的值:协议要在支持范围内(http:// 或 socks5://),host:port 要写对。
net::ERR_PROXY_CONNECTION_FAILED: 按 Chromium 错误表的原文:"Could not create a connection to the proxy server. An error occurred either in resolving its name, or in connecting a socket to it"(无法建立到代理服务器的连接,错误出在域名解析或套接字连接)。检查网关拼写 proxy.proxy302.com、端口 2222(HTTP)或 3333(SOCKS5),以及你的网络放不放行到网关的出站连接。
HTTP 407 或反复弹认证: page.authenticate() 必须在第一次 page.goto() 之前执行。重新抄一遍用户名密码,别带上多余的空格或换行。
页面能打开,但显示的是自己的 IP: 启动参数没传到这个浏览器实例。先打印出口 IP,再确认脚本配置和启动的是同一个浏览器。
目标站慢、超时: 给这个任务的 page.goto() 调大超时,并确认账号里还有流量。
常见问题
Puppeteer 怎么挂代理?
启动浏览器时带 args: ['--proxy-server=http://proxy.proxy302.com:2222'],在第一次导航之前对页面调用 page.authenticate({ username, password }),再打开 https://ipinfo.io/json 确认出口 IP 变了。动态住宅流量 US$1.50/GB 起,最低买 1 GB。
Puppeteer 怎么设置 SOCKS5 代理?
Chromium 接受在 --proxy-server 里写 socks5://proxy.proxy302.com:3333,但它的 SOCKS5 客户端只提供无认证这一种方法,所以 Proxy302 每条连接都要求的用户名密码登录没法在浏览器里完成。走 HTTP 2222 端口配 page.authenticate(),或在 3333 前面放一个本地转发器,或改用浏览器外自己支持 SOCKS5 用户名密码认证的工具,比如 curl 的 socks5h://。
Puppeteer 怎么轮换代理?
不用维护代理列表。一个网关、一套账号密码承载动态住宅流量,产品页写明了两种行为:每个请求走不同的住宅 IP,或粘性会话在一串请求里保持同一条住宅 IP。页面没写一条线怎么在两者之间切换,依赖哪一种之前先确认:在脚本里连开两次 https://ipinfo.io/json 对比出口 IP。
代理的用户名密码怎么传?
在每个页面上用 page.authenticate({ username, password }),放在第一次 page.goto() 之前。它为页面提交 HTTP 认证凭据;传 null 可清除。用的就是你其他工具同一套 Proxy302 用户名密码——「我的资产」里能看到。
Puppeteer 用 HTTP 还是 SOCKS5?
HTTP,2222 端口。这是浏览器端认证能配合 page.authenticate() 端到端走通的入口。SOCKS5 3333 留给能自己做 SOCKS5 用户名密码认证的工具,比如 curl 的 socks5h://。
Puppeteer 里为什么报 407 或代理连接错误?
407 说明认证没送到代理那边:把 page.authenticate() 挪到第一次导航之前,重新抄一遍账号密码。连接失败多半是 --proxy-server 里的主机、端口或协议写错——http:// 加 proxy.proxy302.com:2222——或者你的网络拦了到网关的出站连接。
参考资料
10
- Puppeteer API 文档:LaunchOptions
外部网站资料 · 确认日期:
2026 年 10 月 28 日通读:args 是 "Additional command line arguments to pass to the browser instance."(传给浏览器实例的额外命令行参数);headless 是 "Whether to run the browser in headless mode",默认 true。
- Puppeteer API 文档:page.authenticate()
外部网站资料 · 确认日期:
2026 年 10 月 28 日通读:为页面提供 "credentials for HTTP authentication"(HTTP 认证凭据);"Request interception will be turned on behind the scenes to implement authentication."(后台打开请求拦截来实现认证);"To disable authentication, pass null."(传 null 关闭认证)。
- Chromium 源码:chrome/common/chrome_switches.h
外部网站资料 · 确认日期:
2026 年 10 月 28 日读自 chromium/chromium 官方仓库(main 分支):kProxyServer[] = "proxy-server" 上方注释(640–641 行)为 "Uses a specified proxy server, overrides system settings."(使用指定的代理服务器,覆盖系统设置)。
- Chromium 源码:net/socket/socks5_client_socket.cc
外部网站资料 · 确认日期:
2026 年 10 月 28 日读自 chromium/chromium 官方仓库(main 分支):SOCKS5 问候写死为 kSOCKS5GreetWriteData {0x05, 0x01, 0x00},注释为 "no authentication"(无认证);客户端要求服务器选中方法 0x00,否则握手失败(ERR_SOCKS_CONNECTION_FAILED)。Chromium 不会提供 SOCKS5 用户名密码认证。
- Chromium 源码:net/base/proxy_server.cc
外部网站资料 · 确认日期:
2026 年 10 月 28 日读自 chromium/chromium 官方仓库(main 分支):有效代理协议包括 SCHEME_HTTP、SCHEME_SOCKS4、SCHEME_SOCKS5、SCHEME_HTTPS 和 SCHEME_QUIC;SOCKS4 与 SOCKS5 的默认端口是 1080。
- Chromium 源码:net/base/net_error_list.h
外部网站资料 · 确认日期:
2026 年 10 月 28 日读自 chromium/chromium 官方仓库(main 分支):NO_SUPPORTED_PROXIES (-336) "There are no supported proxies in the provided list.";PROXY_CONNECTION_FAILED (-130) "Could not create a connection to the proxy server. An error occurred either in resolving its name, or in connecting a socket to it."
- libcurl 文档:CURLOPT_PROXY
外部网站资料 · 确认日期:
2026 年 10 月 28 日读自 curl/curl 官方仓库(master 分支):"socks5h:// — SOCKS5 Proxy. Proxy resolves URL hostname."(SOCKS5 代理,由代理端解析 URL 主机名;普通 socks5:// 没有这条说明);代理凭据可用 scheme://username:password@hostname 的 URL 写法。
- Proxy302 指南:代理地址、端口与登录
产品观察 · 确认日期:
2026 年 10 月 28 日在线读取:动态住宅代理的网关为 proxy.proxy302.com,HTTP 2222、SOCKS5 3333;HOST、PORT、USERNAME 和 PASSWORD 显示在「我的资产」页。
- Proxy302:动态住宅代理页
产品观察 · 确认日期:
2026 年 10 月 28 日在线读取:每个请求走一条不同的真实住宅 IP;粘性会话在一串请求里保持同一条住宅 IP;HTTP 与 SOCKS5;按 GB 计费。
- Proxy302 价格页
产品观察 · 确认日期:
2026 年 10 月 28 日在线读取(页面声明价格来自 2026 年 10 月 18 日的实时价格目录,美元计价,1 PTC = US$1.00):Budget 住宅线任意数量 US$1.50/GB、100 GB 档 US$1.35/GB;Premium 线 US$5.00/GB 起;最低购买 1 GB;已购 GB 永不过期;无订阅、按用量付费。
准备好试试了吗?
注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。