在爬蟲、天然語言時偶然接觸到phantomjs、casper等相對於httpclient較新的框架及採集解決方案,微查以後發現方案可行,故盡清明三日之力,將其二次開發應用於百度元搜索信息採集項目中,達到預期效果,下一步將重點應用到騰訊微博採集和搶票搶手機項目中。下面,將分步驟介紹一下。javascript
1、phantomjs介紹java
(1)一個基於webkit內核的無頭瀏覽器,即沒有UI界面,即它就是一個瀏覽器,只是其內的點擊、翻頁等人爲相關操做須要程序設計實現。jquery
(2)提供JavaScript API接口,即經過編寫js程序能夠直接與webkit內核交互,在此之上能夠結合Java語言等,經過java調用js等相關操做,從而解決了之前c/c++才能比較好的基於webkit開發優質採集器的限制。linux
(3)提供windows、Linux、mac等不一樣os的安裝使用包,也就是說能夠在不一樣平臺上二次開發採集項目或是自動項目測試等工做。c++
2、phantomjs經常使用API介紹web
近幾天的學習找了很多資料,也包括官網的,但其相關學習資料仍是相對較少的,不少問題都是進行N多測試才搞清楚,在此耗費了很多時間。在學習時,結合官網和本篇博文效果會更好。ajax
(1)經常使用內置幾大對象json
1windows 2瀏覽器 3 |
var system=require('system'); //得到系統操做對象,包括命令行參數、phantomjs系統設置等信息 var page = require('webpage'); //獲取操做dom或web網頁的對象,經過它能夠打開網頁、接收網頁內容、request、response參數,其爲最核心對象。 var fs = require('fs'); //獲取文件系統對象,經過它能夠操做操做系統的文件操做,包括read、write、move、copy、delete等。 |
(2) 經常使用API
1 2 3 4 5 6 7 8 9 10 11 12 |
page.open(url,function (status) {} //經過page對象打開url連接,並能夠回調其聲明的回調函數,其回調發生的時機爲該URL被完全打開完畢,即該URL所引起的請求項被所有加載完,但ajax請求是與它的加載完成與否沒有關係 page.onLoadStarted = function() {}//當page.open調用時,回首先執行該函數,在此能夠預置一些參數或函數,用於後邊的回調函數中 page.onResourceError = function(resourceError) {} //page的所要加載的資源在加載過程當中,出現了各類失敗,則在此回調處理 page.onResourceRequested = function(requestData, networkRequest) {} //page的所要加載的資源在發起請求時,均可以回調該函數 page.onResourceReceived = function(response) {} //page的所要加載的資源在加載過程當中,每加載一個相關資源,都會在此先作出響應,它至關於http頭部分, 其核心回調對象爲response,能夠在此獲取本次請求的cookies、userAgent等 page.onConsoleMessage = function (msg) {}//欲在執行web網頁時,打印一些輸出信息到控制檯,則能夠在此回調顯示。 page.onAlert = function(msg) {} //phantomjs是沒有界面的,因此對alert也是沒法直接彈出的,故phantomjs以該函數回調在page在執行過程當中的alert事件 page.onError = function(msg, trace) {} //當page.open中的url,它本身(不包括所引發的其它的加載資源)出現了異常,如40四、no route to web site等,都會在此回調顯示。 page.onUrlChanged = function(targetUrl) {} // 當page.open打開的url或是該url在打開過程當中基於該URL進行了跳轉,則可在此函數中回調。 page.onLoadFinished = function(status){} // 當page.open的目標URL被真正打開後,會在調用open的回調函數前調用該函數,在此能夠進行內部的翻頁等操做 page.evaluate(function(){});// 在所加載的web page內部執行該函數,像翻頁、點擊、滑動等,都可在此中執行 page.render("");//將當前page的現狀渲染成圖片,輸出到指定的文件中去。 |
(3)注意事項
一、區分phantomjs的對象和打開的web page的對象,如document、window等,二者都有,在調用page.evaluate和不調用的時候,注意區分兩者的範圍,容易在調試時出現不少的問題,且很差發現。
二、page.injectJs和page.includeJs的區別,前者側重本地的js文件,與libraryPath掛購,後者側重網絡js文件,尤爲在引入jQuery等第三方庫時,會常常遇到。
三、編碼問題,兩個重要參數,--output-encoding,--script-encoding,前者爲輸出編碼,後者爲所使用js、參數配置文件的編碼,爲方便起鑑,建議均採用utf-8編碼,並注所應用到的目標文件的編碼,以避免引發很難以想象的異常,又無從查起。
3、百度元搜索採集器
主要是Java SE+js+phantomjs的應用,
(1) 編寫好js腳文程序,預留出全部可配置參數,並提供json文件傳輸相關參數。
(2) 經過java程序,定義相關參數並生成對應的json文件。
(3) 經過java命令行調用API,調用phantomjs命令,並傳入js、配置文件路徑,從而開啓爬蟲。
(4) 首先採集關鍵詞的搜索頁的連接集合,最後統一去遍歷採集具體的對象網頁。
4、應用小結
通過上述的項目實測應用,它將很是方便的應用於模擬登錄,如微博、電商類,或是小米、火車票搶票等項目中,下一步計劃將其與上述項目結合,開發更有意思的項目。
歡迎加入以爬蟲、天然語言處理爲主題的技術羣320349384,更多問題與建議,歡迎交流。