Playwright的代理設定哪種最方便?
Playwright以單一proxy選項接收代理地址與帳密,無需單獨處理認證彈窗。Chromium、Firefox、WebKit三瀏覽器適用相同設定。
還能在單一瀏覽器中建立多個上下文(Context),為每個上下文分配不同代理。上下文是擁有獨立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()要讓結果看起來像該國使用者,需要調整哪些部分?
根據 IP 國家,同時設定上下文的 locale 與 timezoneId,頁面將以該國用戶的語言與時間顯示。例如,若使用德國 IP,可設定 locale 為 de-DE,timezoneId 為 Europe/Berlin。
如果不需要圖片和影片,可以使用 page.route 阻止這些請求,節省頻寬和時間。共享計劃每月頻寬有限,這尤其有幫助。
- 根據 IP 國家設定 locale 和 timezoneId
- 一個上下文對應一個帳戶與一個IP
- 使用 page.route 屏蔽不必要的圖片和影片請求
- SOCKS5 支援 IP 授權,HTTP 端口支援帳號密碼驗證
如何自動接收列表並按任務分配使用?
API的GET /proxies以JSON回傳每行的IP、端口與國家。加入國家條件可立即建立符合需求的列表。以下程式碼為獲取美國代理並建立相應工作上下文範例。回應欄位名稱可於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 值。若使用 SOCKS5 帳密驗證時出現「Browser does not support socks5 proxy authentication」錯誤,建議改用 IP 授權或使用 HTTP 端口。