2017-04-07 77 views
0

我最近買了到目前使用我的第一個開發者的工作PhantomJS PhantomJS。PhantomJS網頁抓取Cisco交換機Web界面

我已責成給網絡刮網絡切換信息(主機名,的productID,ip地址,MAC地址等)從通過LAN電纜連接到PC的舊思科催化劑2960 x開關。

我得到的HTTP authenticatiion做工精細用phantomJS無頭的瀏覽器,可以打開第一開關頁面,但下面的圖片中看到它導致啓動頁面。 cisco switch startup report

此啓動頁面僅在用戶必須單擊具有下面顯示的表單按鈕輸入屬性的繼續按鈕後纔會首次登錄/訪問交換機。 (用AJAX寫的)

<form METHOD="GET"> 
<input type="button" name="button1" value="Continue" 
onclick="setcookiesandLoadCiscoDeviceManager()"></form> 

通常在Chrome瀏覽器上,我們點擊它並繼續前進。隨後給我們帶來了一個利益的主要頁面,包含交換機信息思科設備管理器頁面。(不允許張貼圖片,但它是可用的phantomjs小組討論頁)

我的問題是,旁路使用PhantomJS無頭瀏覽器的啓動報告是什麼是最好的方法?無論是...在表單提交方法

  • 模擬按下按鈕GET上述觸發鏈接,進入到下一個頁面($阿賈克斯()想到)或...
  • 調用函數setcookiesandLoadCiscoDeviceManager()通過.js文件(更多關於後者)。這更像是一種黑客攻擊手段。

開關網頁的體系結構概述here

當URL 10.44.39.252是第一請求3 FRAME SRC被調用。我通過phantomjs回調

page.onNavigationRequested 
  • Frmwrkresource.htm
  • topbannernofpv.shtml
  • setup_report.htm

輸入 「Button1的」 setup_report.htm框架內部存在知道這一點。當「Button1的」按下

setscookiesandLoadsCiscoDeviceManager(); 

僅在所有被稱爲startup_report和Cisco設備管理器(10.44.39.252/xhome之間過渡的JavaScript資源之間preflight.js稱爲

此函數調用存在熱媒)。我在想瀏覽器cookies是這個問題的主要部分。附

是我的源代碼。這是各級completeion

var page = require('webpage').create(); 
var fs = require('fs'); 

console.log("\n:Welcome to my Crawler Scrapper:"); 

var url = 'http://10.44.39.252/'; 

page.settings.userName='star'; 
page.settings.password='----------'; 
page.customHeaders={'Authorization': 'Basic '+btoa('star:xzsawq4321')}; 

page.settings.userAgent = 'PMG Web Crawler Bot/1.0'; 

page.onNavigationRequested = function(url,type,willNavigate, main){ 
console.log("\n----------------------------------------------"); 
console.log("Navigation Request Information:\n") 
console.log('Trying to navigate to: ' + url);//where are you going? 
console.log('Caused by: ' + type);   //request type 
console.log('Will it actually navigate: ' + willNavigate); 
console.log('Sent from the page\'s main frame: ' + main); 
console.log("----------------------------------------------\n"); 
}; 

page.onResourceError = function(resourceError){ 
console.log("\nHold Up, We have Errors!") 
console.log("Resource Error Information: \n") 
console.log('Resoruce ErrorID:' + resourceError.id + '\nURL:' + 
resourceError.url); 
console.log('Resource Error Code: ' + resourceError.errorCode + 
'\nDescription: ' + resourceError.errorString); 
}; 

page.onConsoleMessage = function(msg) { 
console.log("The Browser Replied:" + msg); 
}; 

////////////////////////////////////////////////////////////////// 
page.onLoadStarted = function(){ 
console.log("Loadng Page...") 

}; 

page.onLoadFinished = function(){ 
console.log("Loading finished:\n"); 
}; 
////////////////////////////////////////////////////////////////// 

page.viewportSize = { 
width: 1920, 
height: 1200 
}; 

var sel = 'button1'; //DOM manipulate, selector 
var type = 'click', //action 

//webpage.open 
page.open(url,function(status){ 
if(status === "success"){ 
page.includeJs( 
"http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js",function() 
{//jquery syntax has been successfully included 
setTimeout(function(){ 
var t = page.evaluate(function(sel) { 

var a = $('title').text(); 
return a; 
},0,sel); 
console.log("Title: " + t + "\n\n"); 

phantom.addCookie({ 
Cisco_DeviceManager  : 'value', /* required property */ 
SSLPreference : 2, /* required property */ 
gettingstarted : 1 
}); 

page.open('http://10.44.39.252/xhome.htm', function (status) { 
$(document).ready(function(){ 
console.log("Your Document is Ready:"+ document.title +"\n"); 

/*ajax assynchronous http request 
$.ajax({ 
async: false,//blocks the ajax call, SYNCHRONOUS ajax Request 
url: 'http://10.44.39.252/setup_report.htm?button1=Continue', 
type: 'GET', 
data: {button1: 'Continue'}, 
success: function (out) { 
    console.log("REQUEST SENT!\n\n"); 
    console.log(typeof(out)); 
    $('button1').trigger(sel); 
    console.log($('.homecontent').text); 
    //$("button1").click(function(){ 
    // $("input").trigger("select"); 
    //}); 

}, 
error: function(){ 
console.log("Nein!"); 
} 
}); 
*/ 


}); 
}); 
},3000); 

setTimeout(function() { 
page.render("phantomspecs1.jpg"); 
console.log("\nNow GTFO!") 
phantom.exit(); 
},20000); 

console.log("Wait for the Async...");//prints first! 

},0);//closes includejs which doesnt operate in the next open... 
}else{ 
    console.log("Connect fail"); 
    phantom.exit(); 
} 
}); 

我需要phantomJS繞過啓動頁並轉到CiscoDeviceManager在那裏我可以使開關的信息。但我對JavaScript,JQuery和AJAX的知識仍然不足(本身並不是程序員,但在大學畢業後讓自己成爲編碼工作,但我確實有一些基本概念)

如果你們中的任何人都可以幫助我指出正確的方向爲了下一步,我可以完成任務並對其做文檔。毫無疑問,將是有價值的幻影社區(其中我很自豪能成爲的一部分)

真誠, Afiq阿卜杜勒·哈米德, 賽博馬來西亞

+1

PhatnomJS組版本:https://groups.google.com/forum/#!topic/phantomjs/qLz36fGuVdk – PhamtomanJS

回答

1

由於您使用的是無頭的瀏覽器做這項工作中,最合乎邏輯的方法是使用無頭瀏覽器,就像普通用戶使用一樣。不要做瘋狂的cookie操作等等,它只是創造比你需要做的更多的工作。

PhantomJS用於自動使用JavaScript的瀏覽器的交互,所有你需要做的是注入一些簡單的JavaScript與UI交互。

,只有當用戶登錄時應該是微不足道的處理顯示一次的形式。

用戶登錄後,只要嘗試獲得按鈕元素,如果存在的話,一下就可以了。

var btn1 = document.querySelector('input[name="button1"]') 
if(btn1 !== null) { 
    //continue button exists trigger a click. 
    btn1.click(); 
} 

而且當你正在做的工作刮,有一個名爲casperJS夢幻般的圖書館,你可以PhantomJS的頂部安裝的抽象了大量的複雜性。

+0

偉大的答案。此外,OP,一定要使用永久性Cookie'--cookies文件= cookies.txt'使飛濺頁面將顯示只有一次(如果我理解你的問題正確) – Vaviloff

+0

謝謝丹尼爾裏。現在我將專注於按鈕觸發方法。我試着實現你的代碼建議,但控制檯返回'按鈕不存在' 我認爲我必須在InjectJS({和page.evaluate({和{0})中實現一個waifor.js或$ .ajax你有任何提示或者我應該要求它在一個不同的問題? 是的,我已經考慮Casper.js和我都安裝了,但現在我會用幻影。可能會移動到後面這一次完成卡斯帕。 – PhamtomanJS

+0

平時最好問另一個這就是說,如果你確定知道它是通過ajax /動態javascript加載的,你可以在setInterval函數(輪詢)中執行querySelector查找,直到找到該元素。 –