眾所周知,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實踐的記錄~如果你有更好的方案實現,歡迎留言~