跳到正文

Playwright 代理账号密码:按 context 设置

账号密码写在哪、什么时候一个浏览器一个代理就够、怎么让每个 context 各用各的 IP。

整个浏览器还是每个 context:怎么选

写在 launch() 里的代理管整个浏览器,里面所有 context 和页面都从同一个 IP 出去。写在 new_context() 里的代理只管这一个 context,所以一个浏览器进程可以同时跑几个互相隔离的会话,各用各的 IP。

只跑一个任务、只要一个出口地区,就按浏览器设置。并发跑多个任务、一个账号对应一个 context,或者要轮流用一批 IP,就按 context 设置。cookie 和本地存储本来就按 context 隔离,代理要再单独设上去。

launch() 和 new_context() 对照

launch() 和 new_context() 对照
项目在哪里设置管多大范围账号和密码
按浏览器chromium.launch(proxy=...)这个浏览器里所有 context 和页面有 server、username、password 三个字段
按 contextbrowser.new_context(proxy=...)只管这个 context 里打开的页面字段相同;浏览器本身可以不设代理
浏览器启动参数args=["--proxy-server=..."]Chromium 命令行,管整个浏览器不适合放账号密码:要带账号密码就用 Playwright 的 proxy 对象

来源:Playwright 官方文档 Network 页和 Browser.new_context 页,2026 年 11 月 13 日读取。启动参数一行是 Chromium 命令行的写法;需要账号密码时请用 proxy 对象。

整个浏览器用一个代理(Python)

# pip install playwright   then   playwright install chromium
from playwright.sync_api import sync_playwright

proxy = {
    "server": "http://HOST:PORT",   # HTTP endpoint from My assets
    "username": "LOGIN",
    "password": "PASSWORD",
}

with sync_playwright() as p:
    browser = p.chromium.launch(proxy=proxy)   # every context in this browser uses it
    page = browser.new_page()
    page.goto("https://ipinfo.io/json")
    print(page.inner_text("body"))             # shows the proxy's exit IP
    browser.close()

仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。

每个 context 一个代理,并行运行(Python)

# pip install playwright   then   playwright install chromium
import asyncio
from playwright.async_api import async_playwright

PROXIES = [  # one entry per IP, copied from My assets
    {"server": "http://HOST:PORT", "username": "LOGIN_1", "password": "PASSWORD_1"},
    {"server": "http://HOST:PORT", "username": "LOGIN_2", "password": "PASSWORD_2"},
]

async def check(browser, proxy):
    context = await browser.new_context(proxy=proxy)   # this context only
    try:
        page = await context.new_page()
        await page.goto("https://ipinfo.io/json")
        print(proxy["username"], await page.inner_text("body"))
    finally:
        await context.close()

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()            # no proxy on the browser itself
        await asyncio.gather(*(check(browser, x) for x in PROXIES))
        await browser.close()

asyncio.run(main())

仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。

同样的写法(Node.js)

// npm i playwright   then   npx playwright install chromium
import { chromium } from 'playwright'

const proxies = [ // one entry per IP, copied from My assets
  { server: 'http://HOST:PORT', username: 'LOGIN_1', password: 'PASSWORD_1' },
  { server: 'http://HOST:PORT', username: 'LOGIN_2', password: 'PASSWORD_2' },
]

const browser = await chromium.launch() // no proxy on the browser itself
await Promise.all(proxies.map(async (proxy) => {
  const context = await browser.newContext({ proxy }) // this context only
  try {
    const page = await context.newPage()
    await page.goto('https://ipinfo.io/json')
    console.log(proxy.username, await page.textContent('body'))
  } finally {
    await context.close()
  }
}))
await browser.close()

仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。

server 填 HTTP 还是 SOCKS5

server 字段既能写 http:// 也能写 socks5://,但用户名和密码字段在文档里是写给 HTTP 代理的。Chromium 自带的 SOCKS5 客户端只发「无需认证」,所以需要账号密码的 SOCKS5 代理在 Chromium 里用不了,字段填了也一样。

所以 Chromium 请用代理的 HTTP 地址。在 Proxy302,就是 proxy.proxy302.com 的 2222 端口。一个资产支持哪种协议要看产品,请以「我的资产」里该资产显示的协议为准。如果一定要在浏览器里用带账号密码的 SOCKS5,请看下面链接的那篇。

确认代理真的生效

  1. 第 1 步

    先不带代理运行上面的单代理脚本,记下 ipinfo.io/json 返回的你自己的 IP。

  2. 第 2 步

    加上 proxy 对象再运行。ip 字段应该变成代理的出口 IP,国家也应该是你选的那个国家。

    预期结果 JSON 里的 IP 和国家与你自己的不同。

  3. 第 3 步

    按 context 设置时,给每个 context 都打印一次 IP。两个 context 用两个不同的静态 IP,应该看到两个不同的地址。

  4. 第 4 步

    如果打印出来的是你自己的 IP,说明 proxy 对象传给了别的调用,不是创建这个页面的那个。检查页面来自哪个浏览器或 context。

先在浏览器之外测一下账号密码

# HTTP endpoint (the one Chromium can log in to)
curl -x http://LOGIN:PASSWORD@HOST:PORT https://ipinfo.io/json

# SOCKS5 endpoint (works in curl, not in Chromium with a login)
curl -x socks5h://LOGIN:PASSWORD@HOST:PORT https://ipinfo.io/json

仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。

Playwright 和代理对不上时

出现错误页,或 407 Proxy Authentication Required

检查 用户名或密码有错字,或者资产已过期、流量已用完。

处理 在「我的资产」里重新复制 LOGIN 和 PASSWORD,并用上面的 curl 命令测试。先把这一步修好,再动 Playwright。

停止条件 curl 也返回 407 就别再改代码了:问题在账号密码或资产本身。带上订单号提交 Support 工单。

http:// 能用,带账号密码的 socks5:// 在 Chromium 里不能用

检查 Chromium 的 SOCKS5 没有密码认证方式。

处理 把 server 改成同一个资产的 HTTP 地址。

HTTP 端口上连接被重置或超时

检查 资产发放的是另一种协议,或者 HOST、PORT 写错了。

处理 核对资产显示的协议和端口:proxy.proxy302.com 上 HTTP 用 2222,SOCKS5 用 3333。需要哪种协议,就用那种协议重新生成或购买。

每个 context 显示的 IP 都一样

检查 launch() 和 new_context() 用了同一条代理,或者几条记录指向同一个 IP。

处理 给每个 new_context() 传不同的账号密码。动态住宅不开会话时每个新连接可能换一个 IP;某个 context 要一直用同一个地址,就用静态 IP。

页面能打开,但网站认成了别的国家

检查 出口 IP 不在你想要的国家。

处理 在 ipinfo.io 查这个 IP,并在生成或购买资产时重新选出口国家。

用 Proxy302 怎么做

每个 context 需要一个固定地址,选静态 ISP 比较合适:租期内 IP 不轮换,1 天 US$0.50,30 天 US$7.99(折合约每天 US$0.27),一次最多能买 100 个。需要从一个池里用很多不同的 IP,可以用动态住宅,低价线路每 GB US$1.50;不开会话时,每个新连接会换一个 IP。

两种都请在生成或购买时选 HTTP 协议,这样同一组账号密码可以直接填进 Playwright 的 proxy 对象。Playwright 页面里有完整配置和其他选项。

在 Proxy302 的操作步骤

  1. 第 1 步

    打开静态 ISP 页面(或动态住宅页面),选国家,协议选 HTTP,核对费用后用钱包付款。

  2. 第 2 步

    打开「我的资产」,复制主机、端口、用户名和密码。要给多个 context 用,就买或生成多个资产。

  3. 第 3 步

    把这些值填进 proxy 对象:server 写 http://主机:端口,再填 username 和 password。

  4. 第 4 步

    像上面的例子那样,在 Playwright 里访问 https://ipinfo.io/json 确认出口。

Playwright 代理常见问题

Playwright 怎么设置带账号密码的代理?

把 proxy={"server": "http://HOST:PORT", "username": "LOGIN", "password": "PASSWORD"} 传给 chromium.launch(),整个浏览器生效;传给 browser.new_context(),只对这个 context 生效。

每个 browser context 能用不同的代理吗?

能。Playwright 文档写明代理可以按 context 单独设置,所以一个浏览器里可以有不同 IP 的 context。

Playwright 支持带密码的 SOCKS5 代理吗?

server 字段可以写 socks5:// 地址,但用户名和密码在文档里是写给 HTTP 代理的。在 Chromium 里,需要登录的 SOCKS5 用不了,请改用 HTTP 地址。

还需要 --proxy-server 参数吗?

不需要。launch() 和 new_context() 的 proxy 选项就是设置地址和账号密码的正规位置。

怎么确认 Playwright 用的是哪个 IP?

在同一个 context 的页面里打开 https://ipinfo.io/json,看 ip 字段。

参考资料

4
  1. Playwright: Network, HTTP proxy

    官方文档 · 确认日期:

    Read on 13 November 2026: proxy can be set globally for the whole browser or for each browser context; username and password are optional fields for an HTTP(S) proxy; examples use launch(proxy={server, username, password}) and new_context(proxy={server}).

  2. Playwright: Browser.new_context, proxy option

    官方文档 · 确认日期:

    Read on 13 November 2026: server accepts HTTP and SOCKS proxies, for example http://myproxy.com:3128 or socks5://myproxy.com:3128; bypass is a comma-separated list of domains; username and password are used "if HTTP proxy requires authentication".

  3. Chromium source: socks5_client_socket.cc

    官方文档 · 确认日期:

    Read on 13 November 2026: the SOCKS5 greeting Chromium sends is 05 01 00 (one method, "no authentication"), and a reply that selects any other method is treated as an unexpected-auth error.

  4. Proxy302 产品事实与价目表

    产品观察 · 确认日期:

    站点产品事实文件,2026 年 11 月 13 日对照控制台、后端和价目表核对:静态 ISP 按 IP 租赁价格(US$,1 PTC = US$1)、动态住宅低价线路每 GB 价格、proxy.proxy302.com 上 HTTP 2222 端口和 SOCKS5 3333 端口、各产品支持哪种协议、无免费试用。

准备好试试了吗?

注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。