使用PhantomJS实现模拟登陆(Java爬虫)

来源:互联网 发布:ubuntu修改用户名 编辑:程序博客网 时间:2024/06/03 19:10

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,感觉可以用这门语言做好多事情。

参考网页:
本文主要参考的代码
填写表单的方法