Playwright 主要通过 browserType.launch() 或 browser.newContext() 的选项,为 Python 和 Node.js 脚本提供代理配置,可指定代理服务器地址、端口和身份验证凭据。该配置会让所启动的浏览器实例或上下文之后的全部网络请求都经由指定代理。
Playwright 代理配置概览
Playwright 支持在两个主要层级配置代理:
- 浏览器启动层级: 将代理应用于整个浏览器实例。该浏览器内创建的所有上下文和页面都会使用指定代理。适用于所有自动化任务都需要同一个代理的场景。
- 浏览器上下文层级: 将代理应用于特定的浏览器上下文。这样同一浏览器实例中的不同上下文可以使用不同代理,或某些上下文完全不走代理,便于管理多样化的抓取或测试场景。
Playwright 的代理配置对象或字典通常包含 server 地址(例如 http://proxy.example.com:8080、socks5://localhost:9050),以及可选的 username 和 password,用于需要认证的代理。
支持的代理类型
Playwright 支持标准代理协议:
- HTTP 代理: 使用
http://或https://方案指定。 - SOCKS 代理: 使用
socks5://或socks4://方案指定。
省略方案时(例如 proxy.example.com:8080),Playwright 默认按 HTTP 代理处理。建议显式指定方案,以便表述清晰并确保使用正确的协议。
Python 中的 Playwright 代理配置
在 Python 中,代理配置以字典形式传给 browser_type.launch() 或 browser.new_context() 的 proxy 参数。
基础 HTTP/HTTPS 代理配置
使用无需认证的 HTTP 或 HTTPS 代理:
from playwright.sync_api import sync_playwright
# For browser-wide proxy
with sync_playwright() as p:
browser = p.chromium.launch(proxy={"server": "http://your.proxy.server:8080"})
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# For context-specific proxy
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(proxy={"server": "http://another.proxy.server:8080"})
page = context.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
context.close()
browser.close()
带认证的 HTTP/HTTPS 代理配置
对于需要认证的代理,在代理字典中加入 username 和 password 键:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://user.proxy.server:8080",
"username": "proxy_user",
"password": "proxy_password"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
SOCKS 代理配置
在 server 字符串中指定 SOCKS 协议:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={"server": "socks5://your.socks.proxy:9050"}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
SOCKS 代理同样支持认证,只需在字典中加入 username 和 password。
为特定域名绕过代理
代理字典中的 bypass 键可指定一组以逗号分隔的主机或域名,这些目标不走代理。支持通配符(*)。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://your.proxy.server:8080",
"bypass": "*.local, .example.com, 192.168.1.1"
}
)
page = browser.new_page()
page.goto("http://example.com") # 若 example.com 在 bypass 列表中则绕过代理
page.goto("https://google.com") # 将使用代理
browser.close()
Node.js 中的 Playwright 代理配置
在 Node.js 中,代理配置以对象形式传给 browserType.launch() 或 browser.newContext() 的 proxy 属性。
基础 HTTP/HTTPS 代理配置
使用无需认证的 HTTP 或 HTTPS 代理:
const { chromium } = require('playwright');
(async () => {
// For browser-wide proxy
const browser = await chromium.launch({
proxy: {
server: 'http://your.proxy.server:8080'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
// For context-specific proxy
const browser2 = await chromium.launch();
const context = await browser2.newContext({
proxy: {
server: 'http://another.proxy.server:8080'
}
});
const page2 = await context.newPage();
await page2.goto('https://httpbin.org/ip');
console.log(await page2.content());
await context.close();
await browser2.close();
})();
带认证的 HTTP/HTTPS 代理配置
对于需要认证的代理,在代理对象中加入 username 和 password 属性:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://user.proxy.server:8080',
username: 'proxy_user',
password: 'proxy_password'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
})();
SOCKS 代理配置
在 server 字符串中指定 SOCKS 协议:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'socks5://your.socks.proxy:9050'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
})();
SOCKS 代理同样支持认证,只需在对象中加入 username 和 password。
为特定域名绕过代理
代理对象中的 bypass 属性可指定一组以逗号分隔的主机或域名,这些目标不走代理。支持通配符(*)。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://your.proxy.server:8080',
bypass: '*.local, .example.com, 192.168.1.1'
}
});
const page = await browser.newPage();
await page.goto('http://example.com'); // 若 example.com 在 bypass 列表中则绕过代理
await page.goto('https://google.com'); // 将使用代理
await browser.close();
})();
Playwright 代理配置对比
| 特性/语言 | Python (dict) |
Node.js (object) |
说明 |
|---|---|---|---|
| Server | {"server": "http://host:port"} |
{ server: "http://host:port" } |
必填。代理地址和端口,方案可选。 |
| Username | {"username": "user"} |
{ username: "user" } |
可选。用于需要认证的代理。 |
| Password | {"password": "pass"} |
{ password: "pass" } |
可选。用于需要认证的代理。 |
| Bypass | {"bypass": "*.local,domain.com"} |
{ bypass: "*.local,domain.com" } |
可选。以逗号分隔的主机/域名列表,这些目标绕过代理。 |
| Launch Level | browser_type.launch(proxy={...}) |
browserType.launch({ proxy: {...} }) |
将代理应用于整个浏览器实例。 |
| Context Level | browser.new_context(proxy={...}) |
browser.newContext({ proxy: {...} }) |
将代理应用于特定的浏览器上下文。 |
进阶代理注意事项
用 page.route() 代理特定请求
若需要非常精细的控制,page.route() 可以拦截网络请求,并根据特定条件把它们转发到不同代理。该方法比全局或上下文级代理设置更灵活,但需要手动处理请求。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
def handle_route(route):
if "example.com" in route.request.url:
route.fulfill(status=200, body="Blocked by route handler.")
else:
# 将其他请求通过指定代理转发
# 这需要手动配置 HTTP 客户端,直接代理可能较为复杂
# 简单场景下建议使用全局/上下文级代理。
# 复杂的代理路由建议使用外部代理管理器。
route.continue_({"url": route.request.url}) # 示例:不做修改直接继续
page.route("**/*", handle_route)
page.goto("https://www.google.com") # 将被路由处理
page.goto("https://www.example.com") # 将被直接返回
browser.close()
page.route() 通常用于 mock、修改请求或拦截,而不是动态改用不同代理——除非与自定义的代理处理逻辑结合使用。
验证代理是否生效
配置代理后,访问 IP 地址查询服务(例如 https://httpbin.org/ip 或 https://httpbin.org/ip)来验证其运行情况。显示的 IP 地址应当是代理服务器的地址,而不是本机地址。
处理代理错误与超时
代理会引入额外的故障点。使用代理时,请为网络请求实现健壮的错误处理,包括:
- 重试: 当代理连接失败或超时时重新发起请求。
- 超时: 为 Playwright 操作配置合适的网络超时。
- 代理轮换: 在大规模作业中,轮换使用一个代理池,以缓解速率限制、IP 封禁或单个代理故障。这通常需要维护一份代理列表,并为新的上下文或重试动态更新
proxy配置。
安全注意事项
使用需要认证的代理时,避免把凭据硬编码在源代码中。应改用环境变量或安全的配置管理系统来获取 username 和 password。这样可以防止凭据泄露,并简化不同环境下的凭据管理。
