CasperJS

概述 

       项目组有个网络爬虫的需求,Java有个爬页面的Jsoup,虽然可以一定程度上借助cookie,sessionId,TCP/IP通信等相关实现一定程度上的模拟浏览器行为,但作为服务器开发语言,在前端交互上,显然不能挥洒自如.老大推荐了CasperJs,同事在搞,顺便也偷喵的学习下.

      CasperJs 是一个开源的导航脚本处理和测试工具,基于PhantomJS(前端自动化测试工具)编写.CasperJS简化了完整的导航场景的过程定义.提供了用于完成常见任务的实用的高级函数,方法和语法.

       Phantomjs 一个基于webkit内核的无头浏览器,提供Headless Testing,Screen Capture,Page Automation,Network Monitoringj 解决方案.

       Phantomjs 提供javascript API,通过js就可以实现与Phantomjs交互,而CasperJs 用js开发的脚本工具,其功能的实现依赖Phantomjs API.因此利用Caperjs 进行爬虫,其核心还是Phantomjs.

环境搭建

学习之用,window环境搭建
  • 下载phantomjs (官网下载太慢,镜像下载),选择下载window版-phantomjs-2.1.1-windows.zip
  • 下载Casperjs - -casperjs-1.1.4-1
  • 解压以上压缩包,配置环境变量(到bin目录下)
  • cmd 分别执行phantomjs --version 与casperjs --version,有返回值,即安装成功
js测试.编写sample.js
var casper = require('casper').create();
casper.start('http://casperjs.org/');casper.then(function() {this.echo('First Page: ' + this.getTitle());
});casper.thenOpen('http://phantomjs.org', function() {this.echo('Second Page: ' + this.getTitle());
});casper.run();
        在sample.js的目录下执行cmd命令 casperjs  sample.js,即可看到返回值
First Page: CasperJS - a navigation scripting & testing utility for PhantomJS and SlimerJS written in Javascript
Second Page: PhantomJS | PhantomJS
         至此,安装成功.

使用

官网很详细,例子也很多 CasperJS documentation         phantomjs documentation 小案例,测试登录163邮箱(测试登录成功,但测试写信失败了...)
phantom.outputEncoding = "GBK"; //设置编码
var fs = require('fs'); //来自phantomjs model
var utils = require('utils'); //casperjs 自身的model
var casper = require('casper').create({verbose: true,silentErrors: true,//logLevel: "info", //日志级别viewportSize: {width: 800, height: 600},clientScripts: [//这里可以随意设置你的自定义js文件'jquery-3.2.1.min.js' //可在evaluate 方法中使用(注入到page中)//'polyfill.min.js'],pageSettings: {loadImages: true, //加载图片loadPlugins: true, //插件XSSAuditingEnabled: false,localToRemoteUrlAccessEnabled: false,//userAgent: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36' //伪造头userAgent: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0' //伪造头},onError: function (casper, msg, backtrace) {this.echo("onError msg:", msg);backtrace.forEach(function (i, index) {this.echo("onError backtrace:", msg);});},onLoadError: function (casper, requestUrl, sta) {casper.echo("onLoadError requestUrl: " + requestUrl);casper.echo("onLoadError status :" + sta);},onResourceRequested: function (casper, resource,request) { //处理请求,如不加载一些adobe无关urlvar skip = ['adobe.com','web.yixin'];skip.forEach(function (needle) {if (resource.url.indexOf(needle) > 0) {casper.echo('abort: ' + needle);request.abort();}})}});var email = "****";//163邮箱
var password = "*****";//密码
var sendEmail = "****";//var page = webPage.create(); //在casperjs启动后,自动创建一个page 可以使用casper.page获取(options 中有page 默认为空)casper.start("http://mail.163.com/", function () {this.echo("loaded : " + new Date());//print console.logthis.page.onConsoleMessage = function (e) {console.log(e);}
});
casper.waitForSelector("#x-URS-iframe", function () {//登录iframe,指的是#x-URS-iframethis.switchToFrame(3); //进入登录的iframethis.echo("frameName  "+ this.page.frameName);this.waitForSelector("form#login-form", function () {//填充登录表单this.fill('form#login-form', {'email': email,'password': password,}, false);//点击登录按钮this.click("#dologin");this.wait(2000, function () {//登录名if (this.exists("span[id$='_dvGreetName']")) {this.echo("login success username:  " + this.fetchText("span[id$='_dvGreetName']"));
/* 				var flag=this.evaluate(function(){ //jquery用法,在phantomjs的方法中使用console.log("login success username:  " + $("span[id$='_dvGreetName']").html());return true;}); */} else {this.echo("login fail");}//点击写信this.click("li.js-component-component.ra0.mD0 > span.oz0");this.wait(2000, function () {//以下测试写信,不过失败了this.wait(2000, function () {casper.waitForSelector("div[id^='_mail_toolbar_']", function () {//进入写信页面this.echo("access writer letter page");this.wait(2000, function () {this.capture("1.png");this.sendKeys("div[id^='_mail_input_'] > input[id$='_subjectInput']", 'hello'); //发信主题//填写发送邮箱的时候失败了,页面上填写完邮件,有绑定事件检测你填写的邮箱格式,然后包装你的邮箱(用em标签包装),但casperjs模拟此行为失败this.sendKeys("input.nui-editableAddr-ipt", sendEmail); //发送qq邮箱this.switchToFrame(4);this.sendKeys("body.nui-scroll", '123');this.switchToMainFrame();//this.switchToParentFrame();this.echo(this.exists("div[id^='_mail_input_'] > input[id$='_subjectInput']"));this.echo(this.exists("input.nui-editableAddr-ipt"));this.echo("frameName  "+ this.page.frameName);this.wait(3000, function () {this.capture("2.png");//点击发送按钮this.click("div.nui-toolbar-item > div.js-component-button.nui-mainBtn.nui-btn.nui-btn-hasIcon.nui-mainBtn-hasIcon  >  span.nui-btn-text");this.wait(3000, function () {this.capture("3.png");})});});}, function () {this.echo("access writer letter page fail").exit();}, 10000);});});})}, function () {this.echo("form#login-form not found").exit();}, 10000);
});casper.run(function () {this.echo("end").exit();
});


      


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部