Phantomjs學(xué)習(xí)筆記

因為項目的需要,需要使用無殼瀏覽器來抓取一些js生成的網(wǎng)頁內(nèi)容殉簸。因此學(xué)習(xí)到了phantomjs的用法蝶怔。

所謂無殼瀏覽器(Headless browser),指的是沒有圖形用戶界面的瀏覽器私痹。它具有瀏覽器的頁面解析和js代碼執(zhí)行的功能,并提供了一些API用于網(wǎng)頁的自動化控制统刮。這在自動化測試和獲取頁面Ajax異步獲取的內(nèi)容時非常有用紊遵。

下面是一些來自官方文檔的例子。

Hello world!

創(chuàng)建一個包含兩行代碼的文本文件:

console.log('Hello, world!');
phantom.exit();

保存為hello.js,然后在命令行而不是REPL中運(yùn)行它侥蒙。

REPL是一個簡單交互的編程環(huán)境暗膜。具體可以在這里閱讀文檔。

在命令行運(yùn)行該腳本phantomjs hello.js鞭衩,會輸出Hello, world!学搜。

注意在腳本中調(diào)用phantom.exit(), 否則腳本程序不會終止運(yùn)行。

頁面加載

一個頁面可以通過創(chuàng)建一個web page對象來進(jìn)行加載分析和顯示醋旦。

下面的腳本演示了最簡單的web page對象的用法恒水。它加載example.com并將頁面保存為截圖example.png, 該截圖保存在腳本所在的目錄。

var page = require('webpage').create();
page.open('http://example.com', function(status) {
  console.log("Status: " + status);
  if(status === "success") {
    page.render('example.png');
  }
  phantom.exit();
});

由于phantomjs的渲染特性饲齐,phantomjs可以用來對網(wǎng)頁內(nèi)容進(jìn)行截圖钉凌。

下面的loadspeed.js用于測量網(wǎng)頁的加載時間。

var page = require('webpage').create(),
  system = require('system'),
  t, address;

if (system.args.length === 1) {
  console.log('Usage: loadspeed.js <some URL>');
  phantom.exit();
}

t = Date.now();
address = system.args[1];
page.open(address, function(status) {
  if (status !== 'success') {
    console.log('FAIL to load the address');
  } else {
    t = Date.now() - t;
    console.log('Loading ' + system.args[1]);
    console.log('Loading time ' + t + ' msec');
  }
  phantom.exit();
});

使用下邊的命令運(yùn)行腳本:
phantomjs loadspeed.js http://www.google.com
它會輸出類似下邊的內(nèi)容捂人。
Loading http://www.google.com Loading time 719 msec

代碼求值

為了執(zhí)行網(wǎng)頁上下文中的js代碼御雕,我們需要使用evaluate函數(shù)矢沿。執(zhí)行代碼是運(yùn)行在一個沙盒中的,沙盒中的代碼無法訪問網(wǎng)頁上下文以外的javascript對象和變量酸纲。evaluate可以返回一個對象捣鲸,該對象必須是一個簡單對象,不能包含函數(shù)和閉包闽坡。

下面是一個顯示網(wǎng)頁標(biāo)題的例子栽惶。

var page = require('webpage').create();
page.open(url, function(status) {
  var title = page.evaluate(function() {
    return document.title;
  });
  console.log('Page title is ' + title);
  phantom.exit();
});

evaluate內(nèi)部代碼網(wǎng)頁上下文產(chǎn)生的任何控制臺信息,默認(rèn)都不會被打印出來疾嗅。我們可以使用onConsoleMessage回調(diào)函數(shù)來覆蓋默認(rèn)行為外厂。上面的例子可以重寫為:

var page = require('webpage').create();
page.onConsoleMessage = function(msg) {
  console.log('Page title is ' + msg);
};
page.open(url, function(status) {
  page.evaluate(function() {
    console.log(document.title);
  });
  phantom.exit();
});

由于網(wǎng)頁內(nèi)部的js代碼執(zhí)行過程和在真正的網(wǎng)頁瀏覽器中并沒有什么區(qū)別,標(biāo)準(zhǔn)的DOM方法和CSS選擇器都可以在evaluate內(nèi)部很好的使用代承。這使得phantonjs適用于執(zhí)行各種網(wǎng)頁自動化測試汁蝶。

網(wǎng)絡(luò)請求和響應(yīng)

當(dāng)一個網(wǎng)頁從遠(yuǎn)程服務(wù)器請求一個資源,請求和響應(yīng)可以通過onResourceRequestedonResourceReceived回調(diào)函數(shù)進(jìn)行追蹤论悴。這在示例netlog.js中有演示掖棉。

var page = require('webpage').create();
page.onResourceRequested = function(request) {
  console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function(response) {
  console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膀估,隨后出現(xiàn)的幾起案子幔亥,更是在濱河造成了極大的恐慌,老刑警劉巖察纯,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紫谷,死亡現(xiàn)場離奇詭異,居然都是意外死亡捐寥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門祖驱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來握恳,“玉大人,你說我怎么就攤上這事捺僻∠缤荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵匕坯,是天一觀的道長束昵。 經(jīng)常有香客問我,道長葛峻,這世上最難降的妖魔是什么锹雏? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮术奖,結(jié)果婚禮上礁遵,老公的妹妹穿的比我還像新娘轻绞。我一直安慰自己,他們只是感情好佣耐,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布政勃。 她就那樣靜靜地躺著,像睡著了一般兼砖。 火紅的嫁衣襯著肌膚如雪奸远。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天讽挟,我揣著相機(jī)與錄音懒叛,去河邊找鬼。 笑死戏挡,一個胖子當(dāng)著我的面吹牛芍瑞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褐墅,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼拆檬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妥凳?” 一聲冷哼從身側(cè)響起竟贯,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逝钥,沒想到半個月后屑那,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡艘款,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年持际,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哗咆。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜘欲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晌柬,到底是詐尸還是另有隱情姥份,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布年碘,位于F島的核電站澈歉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屿衅。R本人自食惡果不足惜埃难,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凯砍,春花似錦箱硕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至座泳,卻和暖如春惠昔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挑势。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工镇防, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潮饱。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓来氧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親香拉。 傳聞我的和親對象是個殘疾皇子啦扬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容