如何在 Puppeteer 中設定驗證 Proxy(Node.js 指南)
更新於:
Puppeteer 透過 Chrome DevTools Protocol(CDP)控制 Chrome 與 Chromium,並提供原生的 await page.authenticate({ username, password }) API 處理 HTTP 407 代理驗證。將 --proxy-server=http://ip:port 與 page.authenticate() 搭配使用,能讓你的 Node.js 爬蟲直接透過 VinaProxy 靜態代理發送請求,完全不需要安裝額外的瀏覽器外掛模組。
--proxy-server=http://ip:port + page.authenticate({ username, password })- 1 個IP₫40,000
- 5+ 個IP₫35,000
- 10+ 個IP₫25,000
- 20+ 個IP₫25,000
- 50+ 個IP₫25,000
- 100+ 個IP₫25,000
- 200+ 個IP₫25,000
- 500+ 個IP₫25,000
- 1000+ 個IP₫22,000
- 2000+ 個IP₫20,000
- 1 個IP₫40,000
- 5+ 個IP₫35,000
- 10+ 個IP₫25,000
- 20+ 個IP₫25,000
- 50+ 個IP₫25,000
- 100+ 個IP₫25,000
- 200+ 個IP₫25,000
- 500+ 個IP₫25,000
- 1000+ 個IP₫22,000
- 2000+ 個IP₫20,000
Puppeteer 兩步驟 Proxy 配置流程
請勿將 user:pass@ 直接寫在 --proxy-server 啟動參數中。正確做法是在啟動時傳入主機與連接埠,並在各 Page 實例上進行身分驗證:
| 步驟 | Puppeteer 程式碼範例 | 重要性與運作原理 |
|---|---|---|
| 1. 啟動 Chromium | puppeteer.launch({ args: ['--proxy-server=http://ip:port'] }) | 將 Chromium 底層網路連線指向你的 VinaProxy 代理伺服器 |
| 2. 驗證 Page 實例 | await page.authenticate({ username, password }) | 透過 CDP 提供認證資訊以回應 HTTP 407 代理驗證請求 |
| 3. 頁面導航 | await page.goto(url, { waitUntil: 'domcontentloaded' }) | 經由已通過身分驗證的代理通道載入目標網站 |
利用 proxy-chain 在多分頁間輪替多組 Proxy
- 請記住
page.authenticate()僅限於個別Page分頁生效,由browser.newPage()建立的每個新分頁都必須個別呼叫 - 若想在單一 Chromium 處理程序內的隱私瀏覽環境中分配不同 Proxy,可透過
proxy-chainnpm 套件的anonymizeProxy()轉換各http://user:pass@ip:port,並傳入browser.createBrowserContext({ proxyServer }) - 完全相容於
puppeteer-extra與反偵測模組puppeteer-extra-plugin-stealth
操作步驟
- 1
傳入 --proxy-server 參數至 puppeteer.launch()
使用
const browser = await puppeteer.launch({ args: ['--proxy-server=http://ip:port'] });啟動瀏覽器實例。 - 2
在新建分頁上呼叫 await page.authenticate()
建立新分頁
const page = await browser.newPage();並執行await page.authenticate({ username: 'USER', password: 'PASS' });。 - 3
測試對外出口 IP 位址
執行
await page.goto('https://vinaproxy.com/api/my-ip');並檢查回傳的 JSON IP 資訊。 - 4
釋放並關閉瀏覽器程序
工作結束時呼叫
await browser.close();以確保背景資源完全釋放。
常見問題
為什麼 Puppeteer 會出現 ERR_NO_SUPPORTED_PROXIES 錯誤?
這是因為在啟動參數中包含了 --proxy-server=http://user:pass@ip:port 的使用者帳密。請保持 --proxy-server=http://ip:port 乾淨,並改用 await page.authenticate({ username, password }) 傳入帳密。
為什麼由 browser.newPage() 開啟的第二個分頁會回傳 HTTP 407?
因為 page.authenticate() 僅對單一分頁生效。在任何新分頁導航前,必須先呼叫 await secondPage.authenticate({ username, password })。
使用無頭 Chrome 執行網頁爬蟲時,VinaProxy 代理是否計算流量?
不會。所有 VinaProxy 專屬 IPv4 與靜態 ISP 方案皆享有每月無限數據流量。
為你的 Node.js Puppeteer 爬蟲架構導入專屬靜態 IP
橫跨全球 7 大地區、即時開通且不限流量的專屬 IPv4 與靜態 ISP 代理方案。
購買 Puppeteer 代理