Playwright的代理设置哪种最方便?
Playwright通过单个proxy选项接收代理地址和认证信息,无需单独处理认证弹窗。Chromium、Firefox、WebKit三浏览器使用相同配置方式。
此外,当只运行一个浏览器并在其中创建多个上下文时,可以为每个上下文分配不同的代理。上下文是独立的配置文件,具有分离的cookie和存储,因此可以在一个浏览器中管理多个IP和会话,节省内存。
示例使用IP 198.51.100.23,HTTP端口8000,SOCKS5端口1080,用户名spx_user,密码spx_pass。
npm install playwright
npx playwright install chromium如何为整个浏览器配置HTTP代理?
在launch的proxy选项中设置server、username和password后,该浏览器所有页面都将使用同一代理。HTTPS网站将通过CONNECT隧道加密传输。
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body")); // proxy IP
await browser.close();如何为不同上下文配置不同IP?
在newContext中添加proxy选项可使该上下文独享代理。以下代码通过API获取代理列表,创建三个使用不同IP的上下文,并输出各上下文显示的IP。处理多账户并行操作时,建议为每个上下文分配专属账户和IP。
部分Chromium版本和Windows环境中,要实现上下文级代理需同时在launch中设置proxy选项。此时可在launch设置首个代理,再在各上下文中覆盖。
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);
const browser = await chromium.launch();
for (const line of lines) {
const [ip, port, user, pass] = line.trim().split(":");
const context = await browser.newContext({
proxy: { server: "http://" + ip + ":" + port, username: user, password: pass },
locale: "en-US",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(ip, await page.textContent("body"));
await context.close();
}
await browser.close();如何使用SOCKS5代理?
server地址使用socks5://前缀即可。由于Chromium不支持SOCKS5的用户名密码认证,建议SOCKS5代理采用IP认证方式。请在仪表板注册运行服务器的IPv4地址,仅设置server参数无需username和password。
如果需要使用用户名和密码连接,可以使用同一IP的HTTP端口。目标网站看到的IP和位置相同。
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "socks5://198.51.100.23:1080" }, // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await browser.close();Python中如何使用?
Python版Playwright结构相同。proxy字典包含server、username、password字段。下方提供同步示例,异步模式选项名相同。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://198.51.100.23:8000",
"username": "spx_user",
"password": "spx_pass",
})
page = browser.new_page()
page.goto("https://api.ipify.org")
print(page.text_content("body"))
browser.close()要使结果看起来像该国用户,需要匹配哪些内容?
为上下文配置locale和timezoneId参数,页面将按目标国家用户的习惯渲染。例如德国IP应设为locale de-DE和timezoneId Europe/Berlin。
如果不需要图片和视频,可以使用page.route阻止这些请求,节省带宽和时间。共享套餐的月带宽有限,尤其有帮助。
- 根据IP国家设置locale和timezoneId
- 单账号单IP单上下文
- 使用page.route屏蔽不必要的图片和视频请求
- SOCKS5支持IP认证,用户名和密码用于HTTP端口
如何自动下载列表并按任务分开使用?
GET /proxies返回每行IP、端口、国家信息的JSON。添加国家参数可快速生成定向任务列表。以下代码演示获取美国代理并创建对应数量上下文的示例,字段说明详见API文档。
任务量大时请及时关闭上下文释放内存,避免长时间保持开启状态。
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies?country=us&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const { proxies } = await res.json();
const browser = await chromium.launch();
for (const p of proxies.slice(0, 5)) {
const context = await browser.newContext({
proxy: { server: "http://" + p.host + ":" + p.http_port, username: p.username, password: p.password },
locale: "en-US",
timezoneId: "America/New_York",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await context.close();
}
await browser.close();如何屏蔽不必要的请求以节省带宽?
使用page.route或context.route拦截图片、字体和视频请求,可加速页面加载并节省代理带宽。这在只需采集数据的任务中效果尤为显著。
await context.route("**/*", (route) => {
const type = route.request().resourceType();
return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});Firefox和WebKit是否使用相同代理?
是的,Playwright支持三种浏览器使用相同的proxy选项。测试团队可以使用同一代理依次启动Chromium、Firefox和WebKit,检查不同浏览器的页面是否一致。
Firefox与Chromium同样不支持浏览器原生SOCKS5用户名密码认证,请使用IP授权连接SOCKS5。HTTP端口在三款浏览器中均支持用户名密码认证。
使用Playwright Test时,可在playwright.config的use项配置proxy全局应用,或按国家分项目分配不同代理。
import { defineConfig } from "@playwright/test";
export default defineConfig({
projects: [
{ name: "us", use: { locale: "en-US", proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" } } },
{ name: "de", use: { locale: "de-DE", proxy: { server: "http://198.51.100.24:8000", username: "spx_user", password: "spx_pass" } } },
],
});常见错误如何解决?
net::ERR_PROXY_CONNECTION_FAILED表示server地址或端口错误。407或其他认证错误请检查username和password值。若出现"Browser does not support socks5 proxy authentication"错误,说明SOCKS5代理尝试使用用户名密码认证,建议改用IP认证或使用HTTP端口。