puppeteer中如何複用啟動中的瀏覽器

melor發表於2019-02-11

眾所周知,puppeteer是個爬蟲利器,但是在遇到一些驗證碼很強大的網站時,你是不是在突破登入的限制的一步被弄得焦頭爛額? 本文不會告訴你如何通過指令碼突破驗證碼,而是提供一種另闢蹊徑的方法。首先介紹下文字大題內容。本文提供的一個方案是先通過指令碼啟動瀏覽器,然後人工方式輸入登入資訊,然後再次通過指令碼爬取頁面內容。 用到的主要api分別是

browser.wsEndpoint()
puppeteer.connect()
複製程式碼

完整程式碼如下

// launch.js
const puppeteer=require('puppeteer');
const fs=require('fs');
const launchConfig={
    headless:false
};
puppeteer.launch(launchConfig).then(browser=>{
    const wsEPAddress=browser.wsEndpoint();
    const w_data=new Buffer(wsEPAddress);
    fs.writeFile(__dirname + '/wsa.txt', w_data, {flag: 'w+'}, function (err) {
        if(err) {
            console.error(err);
        } else {
            console.log('寫入成功');
        }
    });
});
複製程式碼
// aciton.js
const puppeteer=require('puppeteer');
const fs=require('fs');
const getWSAddress=()=>new Promise(resolve => {
    fs.readFile(__dirname + '/wsa.txt', {flag: 'r+', encoding: 'utf8'}, function (err, data) {
        if(err) {
            console.error(err);
            return;
        }
        console.log(data);
        resolve(data);
    });
});
(async ()=>{
    const wsa=await getWSAddress();
    const browserConfig={
        browserWSEndpoint :wsa
    };
    const browser= await puppeteer.connect(browserConfig);
    const page=await browser.newPage();
    // todo 你的指令碼內容
})().catch(err=>{
    console.log(err);
    process.exit();
});
複製程式碼

程式碼簡析,launch.js主要負責啟動瀏覽器,並記錄瀏覽器的wsEndpoint地址,此處簡單處理用fs直接寫在本地目錄(如果你有其他資料快取方案,可以替代它);aciton.js主要負責指令碼任務,這個檔案是用來寫登入後的具體指令碼命令的。 整體執行方案先node relativePathTo/launch.js,手工在開啟的瀏覽器完成登入操作,然後再node relativePathTo/aciton.js完成具體指令碼。注意,本文中兩個檔案是處在同一目錄下的,因為用來傳遞browserWSEndpoint的檔案使用相對路徑存放,如果想更改,也是可以的,但不是文章重點。 以上是一次使用puppeteer實踐的記錄~如果你有更好的方案實現,歡迎留言~

相關文章