当前位置: 首页 > Web前端 > HTML5

PhantomJS,隐身浏览器

时间:2023-04-05 12:51:54 HTML5

PhantomJSPhantomJS是一款无界面浏览器,它实现了传统浏览器的所有功能,只是没有界面,所以它是一款隐身浏览器。PhantomJS官网API,特别是WebPageModule中的内容根据官网的解释,PhantomJS用于网站测试(HEADLESSWEBSITETESTING)、屏幕截图(SCREENCAPTURE)、页面自动化(PAGEAUTOMATION)和网络监控(网络监控)。下载安装我只是简单学习了一下,所以没有把软件配置到环境变量里,直接从官网下载了对应系统的压缩包。以下是我的安装过程:下载压缩包,解压压缩包/Users/negivup/phantomjs,在命令行输入exportPATH="$PATH:/Users/negivup/phantomjs/bin"。如果要配置永久环境变量,需要自己百度,我试过了,没用,汗。..HelloWorld学习程序的第一步就是HelloWorld,这次也不例外。让我们在下面编写第一个示例。varpage=require('webpage').create()//网页是核心模块/***page.open常用方法*第一个参数是地址,第二个参数是回调*/page.open('http://www.baidu.com',function(status){console.log("Status:"+status)if(status==="success"){console.log(page.title)}else{console.log('failtoload')}phantom.exit()//如果没有这行代码,PhantomJS永远不会退出})需要注意的是,phantom.exit必须存在,否则PhantomJS永远不会退出并保存名称为:hello.js命令行执行(下面的例子也是这样执行):$phantomjshello.js执行结果:状态:成功百度一下,对应的截图就知道了文档地址:http://phantomjs.jsorg/screen-capture.html截屏使用render函数,地址:http://phantomjs.org/api/webpage/method/render.html简单截屏varurl='http://example.com/'varpage=require('webpage').create()page.open(url,function(status){if(status==="success"){page.render('example.png')//保存截图}else{console.log('failtoload')}phantom.exit()})截图保存的位置就是js文件的位置。指定页面的宽高截图的尺寸是手机尺寸怎么办?这个很简单,设置page.viewportSize就可以了。varurl='http://example.com/'varpage=require('webpage').create()page.viewportSize={//设置尺寸为iPhone6width:375,height:667}page.open(url,function(status){if(status==="success"){page.render('example.png')//保存截图}else{console.log('failtoload')}phantom.exit()})截取页面的某部分现在只需要截取30*30的部分,如何解决?请参阅下面的代码。varurl='http://example.com/'varpage=require('webpage').create()page.viewportSize={width:375,height:667}page.clipRect={//设置实际大小屏幕截图尺寸顶部:0,左侧:0,宽度:30,高度:30}page.open(url,函数(状态){if(状态===“成功”){page.render('example.png')//savescreenshot}else{console.log('failtoload')}phantom.exit()})这样screenshot的简单使用就结束了。页面自动化页面自动化其实就是通过自己编写的程序来操作页面的DOM。DocumentAddressInterfaceAddress简单的DOM操作在Phantomjs中,可以使用JavaScript中的所有选择器。varurl='http://example.com/'varpage=require('webpage').create()page.open(url,function(status){if(status==="success"){var内容=page.evaluate(function(){varele=document.querySelector('h1')returnele//返回当前DOM对象})console.log(content.innerHTML)//打印出内容}else{console.log('failtoload')}phantom.exit()})上面的代码是不是有点难受,直接在page.evaluate中使用console.log根本打印不出来内容,获取不到内容通常在page.evaluate中??如果不使用return,能获取到内容吗?答案是肯定的。上面代码的优化:onConsoleMessage可以通过这个事件直接打印输出内容:varurl='http://example.com/'varpage=require('webpage').create()page.onConsoleMessage=function(msg){console.log(msg)}page.open(url,function(status){if(status==="success"){varcontent=page.evaluate(function(){varele=document.querySelector('h1')console.log(ele.innerHTML)})}else{console.log('failtoload')}phantom.exit()})这个方法和上面的实现效果一样。需要补充触发事件网络监听网络监听就是绑定两个事件:onResourceRequested和onResourceReceived.varurl='http://example.com/'varpage=require('webpage').create()page.onResourceRequested=function(request){//请求的内容console.log('Thisistherequest...')}page.onResourceReceived=function(response){//响应的内容console.log('Thisis响应...')}page.open(url,function(status){if(status==="success"){console.log(document.title)}else{console.log('加载失败')}phantom.exit()})以上内容只能算是介绍,以后尽量多研究。