Socks5Proxy

Puppeteer代理設置,用--proxy-server同page.authenticate連接

本指南說明Puppeteer啟動Chrome時,透過--proxy-server參數與page.authenticate驗證連接Socks5Proxy的HTTP代理、SOCKS5連線設定,以及多IP瀏覽器分流實作程式碼。

Puppeteer嘅代理點樣運作?

Puppeteer通過Chrome啟動參數設定代理。--proxy-server傳入地址後,該瀏覽器所有頁面都用同一個代理。HTTP代理嘅用戶名同密碼唔可以用參數傳入,要喺打開頁面後用page.authenticate傳入。咁樣代理請求認證時Puppeteer會自動回應。

示例使用 IP 198.51.100.23,HTTP 端口 8000,SOCKS5 端口 1080,用戶名 spx_user,密碼 spx_pass。

npm install puppeteer

如何連接 HTTP 代理和認證?

在launch的args中加入--proxy-server=198.51.100.23:8000,並於newPage建立頁面後立即透過page.authenticate傳遞帳密。需注意每個新頁面均需重新認證。

HTTPS 網站也可以正常打開。瀏覽器會建立 CONNECT 隧道,並在隧道內進行加密通信。

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

如何使用 SOCKS5 代理?

在 --proxy-server 中填入 socks5:// 地址即可。但 Chrome 不支持 SOCKS 代理的用户名和密码验证,因此 page.authenticate 不适用于 SOCKS5。要使用 SOCKS5 连接,请在仪表板中注册运行此代码的服务器的 IPv4 地址,使用 IP 授权。

如果需要使用用戶名·密碼連接,最簡單的方法是使用相同 IP 的 HTTP 端口。由於 IP 相同,目標網站顯示的位置也相同。

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--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.evaluate(() => document.body.innerText));
await browser.close();

如何用多個IP同時啟動多個瀏覽器?

Chrome 每個運行的瀏覽器只能使用一個代理,如果需要不同的 IP,則需要單獨運行瀏覽器。以下代碼通過 API 獲取 ip:port:user:pass 列表,並使用前三個 IP 分別啟動瀏覽器,並在每個頁面上顯示 IP。

開啟過多瀏覽器會佔用大量內存。建議設置任務隊列並限制同時運行的瀏覽器數量。

import puppeteer from "puppeteer";

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);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

如何讓頁面開啟更快?

經代理傳輸圖片、字體和視頻會消耗更多帶寬和時間。若僅需文本數據,可用page.setRequestInterception攔截非必要資源請求,既能提速又能節省共享方案的月度帶寬。

waitUntil參數同樣重要。networkidle0會等待所有請求完成可能導致延遲,建議改用page.waitForSelector在目標元素載入後立即執行後續操作。

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

一個瀏覽器中每個頁面能使用不同IP嗎?

Chrome 的 --proxy-server 應用於整個瀏覽器,難以為每個頁面提供不同的 IP。Puppeteer 22 及以上版本可以在 browser.createBrowserContext 中使用 proxyServer 選項,為每個上下文使用不同的代理。上下文分離了 cookie 和存儲,非常適合帳戶特定的任務。

用page.authenticate傳遞用戶名同密碼,連上下文創建嘅頁面都可以用。相比開多個瀏覽器,呢種方法更慳記憶體。

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

要模擬該國用戶,需設定哪些參數?

透過 page.setExtraHTTPHeaders 設定 Accept-Language,並用 page.emulateTimezone 調整時區以匹配 IP 國家。語言或時區不符可能導致頁面顯示異常。

使用page.setViewport設定畫面大小,如需手機畫面可將puppeteer的KnownDevices設備設置傳入page.emulate。

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

如何保持長時間運行的瀏覽器穩定?

長時間運行的任務建議定期重啟瀏覽器而非持續使用。長時間運行的瀏覽器會逐漸佔用更多內存,一旦出錯可能導致後續任務全部中斷。

每個頁面務必使用 try 和 finally 調用 page.close,並為 goto 設置 timeout 以避免在無響應頁面卡住。失敗的操作可換用其他代理開啟新瀏覽器重試。

記錄各代理的響應時間和錯誤率,有助於識別慢速節點並聯繫客服或調整任務分配。

如何解決常見錯誤?

net::ERR_INVALID_AUTH_CREDENTIALS或407錯誤表示page.authenticate值錯誤或未於newPage後呼叫。請確認每個頁面在goto前已完成認證。

net::ERR_PROXY_CONNECTION_FAILED表示地址或端口錯誤。請確認HTTP地址使用HTTP端口,SOCKS5地址使用SOCKS5端口。若SOCKS5連線被拒,請檢查伺服器出口IP是否已加入IP認證清單。

Puppeteer代理設置,page.authenticate認證 | Socks5Proxy