node調用phantomjs-node爬取複雜頁面

什麼是phantomjs

phantomjs官網是這麼說的,‘整站測試,屏幕捕獲,自動翻頁,網絡監控’,目前比較流行用來爬取複雜的,難以經過api或正則匹配的頁面,好比頁面是經過異步加載。phantomjs就是一個完整的瀏覽器只能沒有界面,所以咱們能夠用它來模擬真正的瀏覽器去訪問頁面,而後再獲取頁面。我要說的重點是如何在node中調用phantomjs來獲取頁面。node

node與phantomjs通訊

  1. 命令行傳參   只能在phantomjs開啓時對其傳參,運行過程當中無能爲力。
  2. 標準輸出       能從phantomjs向node輸出數據,可是無法反過來。
  3. http                 phantomjs向node發http請求,而後node返回數據,可是請求只能由phantomjs發出
  4. websocket     websocket通信,可以雙向通信可是實現略麻煩。
  5. phantomjs-node        實際上也是使用websocket或者http通信,可是畢竟是別人寫好的咱們直接用就行,缺點是依賴略龐大。

如何使用phantom-node

GitHub地址:https://github.com/amir20/phantomjs-nodegit

這裏只作簡單說明詳細api見github。github

    1.安裝web

        npm install phantomnpm

    2.模塊封裝(如下代碼基於es7,需支持async/await,node版本>7.0),更詳細使用可查看phantomjs官方文檔api

 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 ;
相關文章
相關標籤/搜索