Socks5Proxy

Playwright代理設定:為瀏覽器與上下文配置不同IP

本指南示範Playwright中透過proxy選項,以server、username、password參數連接Socks5Proxy的HTTP與SOCKS5代理,並以Node.js與Python程式碼實作單一瀏覽器不同上下文切換IP的方法。

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 端口。

Playwright代理設定:瀏覽器·上下文獨立IP | Socks5Proxy