標籤:依賴 一段 包含 完成 ret ports instance encode pen
什麼是phantomjs
phantomjs官網是這麼說的,‘整站測試,螢幕捕獲,自動翻頁,網路監控’,目前比較流行用來爬取複雜的,難以通過api或正則匹配的頁面,比如頁面是通過非同步載入。phantomjs就是一個完整的瀏覽器只能沒有介面,因此我們可以用它來類比真正的瀏覽器去訪問頁面,然後再擷取頁面。我要說的重點是如何在node中調用phantomjs來擷取頁面。
node與phantomjs通訊
- 命令列傳參 只能在phantomjs開啟時對其傳參,運行過程中無能為力。
- 標準輸出 能從phantomjs向node輸出資料,但是沒法反過來。
- http phantomjs向node發http請求,然後node返回資料,但是請求只能由phantomjs發出
- websocket websocket通訊,能夠雙向通訊但是實現略麻煩。
- phantomjs-node 實際上也是使用websocket或者http通訊,但是畢竟是別人寫好的我們直接用就行,缺點是依賴略龐大。
如何使用phantom-node
GitHub地址:https://github.com/amir20/phantomjs-node
這裡只做簡單說明詳細api見github。
1.安裝
npm install phantom
2.模組封裝(以下代碼基於es7,需支援async/await,node版本>7.0),更詳細使用可查看phantomjs官方文檔
1 ‘use strict‘ 2 3 const phantom = require(‘phantom‘); 4 5 let getPic = async ( name ) => { 6 //url路徑 7 let url = ‘http:///‘+name; 8 //建立一個執行個體 9 const instance = await phantom.create();10 //建立一個頁面11 const page = await instance.createPage();12 //設定頁面參數13 await page.property( ‘viewportSize‘ , { width : 1800 , height : 1200 } );14 //開啟url,返回狀態(url有轉碼,解決中文問題)15 const status = await page.open( encodeURI( url ) );16 console.log( status );17 //延時等待頁面js執行完成(phantomjs只是等待頁面上全部資源載入完畢,不包含頁面js執行時間,所以需延時一段時間等待js)18 await lateTime( 500 );19 //輸出頁面到目前的目錄下20 await page.render(`${ name }--${Date.now()}.png`);21 //銷毀執行個體22 await instance.exit();23 //返回資料24 return ‘xxx‘;25 };26 27 let lateTime = ( time ) =>{28 return new Promise( function(resolve,reject){29 setTimeout(function(){30 resolve();31 }, time );32 } );33 }34 //暴露介面35 module.exports = getPic ;
node調用phantomjs-node爬取複雜頁面