使用PhantomJS實現模擬登陸(Java爬蟲)

PhantomJS介紹

最近開發爬蟲的時候,遇到.aspx後綴的網頁需要去模擬登陸然後獲取cookie,本來計劃通過selenium進行登陸,但是效果很不好紅色警告很多,似乎selenium對於JavaScript支持不是很好。在查過資料之後,發現了PhantomJS這一大殺器,基本滿足爬蟲很多需要,便決定使用PhantomJS進行開發模擬登陸。
以下是對於PhantomJS的介紹
(1)一個基於webkit內核的無頭瀏覽器,即沒有UI界面,即它就是一個瀏覽器,只是其內的點擊、翻頁等人爲相關操作需要程序設計實現。
(2)提供javascript API接口,即通過編寫js程序可以直接與webkit內核交互,在此之上可以結合java語言等,通過java調用js等相關操作,從而解決了以前c/c++才能比較好的基於webkit開發優質採集器的限制。
(3)提供windows、linux、mac等不同os的安裝使用包,也就是說可以在不同平臺上二次開發採集項目或是自動項目測試等工作。
PhantomJS介紹資料來源

PhantomJS進行模擬登陸

這次計劃將使用Java+phantomjs進行開發,因爲本人開發爬蟲主要通過Java。
首先上JavaScript代碼

var page = require('webpage').create(),    
testindex = 0,
loadInProgress = false;

page.onLoadStarted = function() {
    loadInProgress = true;
};

page.onLoadFinished = function() {
    loadInProgress = false;
};
//構造一個步驟數組
var steps = [
    //第一步,打開需要登陸的網頁
    function() {
        page.open(你想要登陸的網頁);
    },
    //第二步,對於登陸的網頁的表單進行填寫和提交
    function() {
        page.evaluate(function(obj) {
            document.forms[0].login_id.value=用戶名;
            document.forms[0].passwd.value=用戶密碼;
            document.forms[0].submit();
            return document.title;
        });
        loadInProgress = true;
    },
    //第三步,獲取登陸之後跳轉的網頁截圖,並獲取cookie值
    function() {
        page.render('登陸成功.png');//獲取登陸成功夠的屏幕截圖
        var cookiesStr="";
        var cookies=page.cookies;
        for(var i in cookies){
            cookiesStr=cookiesStr+cookies[i].name+"="+cookies[i].value+";";         
        }
        console.log(cookiesStr);
    }
];
//使用循環,獲取數組中的內容
var interval = setInterval(function() {

    if (!loadInProgress && typeof steps[testindex] == "function") {
        steps[testindex]();
        testindex++;
    }
    if (typeof steps[testindex] != "function") {
        phantom.exit();
    }
}, 10);

接下來是Java代碼,本函數的主要功能是在利用phantomjs登陸之後,獲取cookie值,這個cookie值將會用於之後的數據獲取。

public String geCookie() throws IOException
    {
        Runtime rt=Runtime.getRuntime();
        Process p=rt.exec(phantomjs.exe的絕對路徑字符串+" "+js的絕對路徑字符串);
        InputStream is=p.getInputStream();
        BufferedReader br =new BufferedReader(new InputStreamReader(is));
        StringBuffer sbf=new StringBuffer();
        String tmp="";
        while((tmp=br.readLine())!=null){
            sbf.append(tmp);
        }
        return sbf.toString();
    }

登陸完成之後,生成的網頁截圖將輸出在本項目的根路徑中。不過,有的時候圖片會出問題,會出現網頁背景變成黑色的情況,科學上網查了一下,是一個bug,貌似還沒有解決。開發最後成功登陸,獲取cookie值,用時很短,使用感覺還是不錯的。

不過,在開發中我想使用FireFox的FirePath時候遇到網頁右鍵無法點擊的情況,這樣甚至網頁源碼都看不了了。在網上查過後,發現是網頁編寫者通過JavaScript將右鍵禁用了,最好將瀏覽器的JavaScript支持關掉,右鍵禁用就失效了。我是下載了Opera,直接關閉JavaScript支持,FireFox可以下載插件NoScript。

我也就決定以後再開發爬蟲的時候,考慮使用phantomjs+selenium+Java這樣的組合。由於自己不會JavaScript,很多時候都是照着網上的代碼進行開發的,也考慮之後也要學習一下JavaScript,感覺可以用這門語言做好多事情。

參考網頁:
本文主要參考的代碼
填寫表單的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章