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帳密認證,建議改用IP認證。請於控制台登記伺服器IPv4後,僅填寫server欄位無需帳密。
如果需要使用用戶名·密碼連接,可以使用相同 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()如何讓結果看起來像該國家的使用者?
設定 context 的 locale 與 timezoneId 以匹配 IP 國家,頁面將以當地語言與時間呈現。例如德國 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表示伺服器地址或端口錯誤。407或認證相關錯誤請檢查username與password。若遇「Browser does not support socks5 proxy authentication」錯誤,建議改用IP認證或使用HTTP端口。