Puppeteer设置浏览器代理的三种思路
0 背景
Puppeteer是google推出的操作瀏覽器的框架。當我們通過框架操作瀏覽器去訪問頁面通常需要設(shè)置代理。本文簡要總結(jié)設(shè)置代理的方式。
1 通過啟動參數(shù)設(shè)置代理
我們通過puppeteer啟動瀏覽器通常可以指定參數(shù),通過--proxy-server參數(shù)[1]指定代理。http及https請求的將通過代理服務(wù)器訪問。若每次需要更換代理就需要重新通過launch方法來啟動瀏覽器。
const browser = await puppeteer.launch({args: [],ignoreHTTPSErrors: true,headless: false,executablePath: "/chrome-mac/Chromium.app/Contents/MacOS/Chromium", });這種方式啟動后,默認會有一個打開的page,因此不用再重新打開page對象。用默認的page進行后續(xù)訪問即可。
const [page] = await browser.pages();2 通過代理服務(wù)器控制代理邏輯
可以看到--proxy-server設(shè)置了代理后,如果ip是一個固定的目標代理地址,那么需要重新啟動瀏覽器才能更換。如果我們自己開發(fā)了一個代理服務(wù),與實際代理機器交互的邏輯都集中在這個服務(wù)上,那么實際代理機器的訪問通過我們的代理服務(wù)控制,這樣我們每次啟動瀏覽器后就固定一個地址即可。
3 通過攔截器與第三方庫實現(xiàn)設(shè)置代理功能
1中介紹的方式需要每次重新調(diào)用的launch方式啟動瀏覽器更換IP。但我們知道現(xiàn)在很多http庫都可以設(shè)置代理。例如在Java中可以通過okhttp,unirest等庫來設(shè)置代理。同理nodejs中也有這樣的庫。我們不再通過--proxy-server指定地址,而是通過puppeteer的攔截器功能,將請求攔截,隨后改寫請求。再通過第三方的http庫設(shè)置上代理信息。這樣就可以達到不通過launch重啟瀏覽器而是直接在一個page中設(shè)置代理的目的。每次有新請求來了也可以達到動態(tài)變化的目標。不過這樣處理邏輯還是比較復(fù)雜,設(shè)計改寫請求,響應(yīng)結(jié)果緩存處理等問題。這篇討論[2]中已經(jīng)給出了處理方式,可以參考。
4 總結(jié)
如果在上規(guī)模的系統(tǒng)中代理控制一般統(tǒng)一由統(tǒng)一的代理服務(wù)來管理,使用時通過proy-server指定代理信息即可。如果是小規(guī)模系統(tǒng),都是集中式控制可以考慮使用1,3的方式處理。
5 參考資料
[1]chrome命令行參數(shù),https://peter.sh/experiments/chromium-command-line-switches/
[2]代理設(shè)置的幾種方法討論,https://github.com/GoogleChrome/puppeteer/issues/678
?
總結(jié)
以上是生活随笔為你收集整理的Puppeteer设置浏览器代理的三种思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS实现数组去重(重复的元素只保留一个)
- 下一篇: Genymotion设置代理至BurpS