phantomjs的使用
PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。
1.安装
phantomjs是完全开源的软件,可以直接下载源码编译后安装,也可以直接下载官网上编译好的文件安装。
各平台下的安装文件包地址:
windows
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-windows.zip
Mac os
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-macosx.zip
Linux
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
下载安装包完毕后,直接解压即可。安装完成之后命令行输入
phantomjs -v
后如果出现版本号即为安装成功。
2.常用的内置对象
1.system:获得系统操作对象,包括命令行参数、phantomjs系统设置等信息
var system=require('system');
2.webpage:获取操作dom或web网页的对象,通过它可以打开网页、接收网页内容、request、response参数,其为最核心对象。提供了一套可以访问和操作web文档的核心方法,包括操作DOM、事件捕获、用户事件模拟等等。
var page = require('webpage');
3.fs:获取文件系统对象,通过它可以操作操作系统的文件操作,包括read、write、move、copy、delete等。
var fs = require('fs');
4.webserver:可以启动一个web服务。目前有10个并发请求的限制;任何其他请求都将排队等候。
var webserver = require('webserver');
3.常用API
1.通过page对象打开url链接,并可以回调其声明的回调函数,其回调发生的时机为该URL被彻底打开完毕,即该URL所引发的请求项被全部加载完,但ajax请求是与它的加载完成与否没有关系
page.open(url,function (status) {})
2.当page.open调用时,回首先执行该函数,在此可以预置一些参数或函数,用于后边的回调函数中
page.onLoadStarted = function() {}
3.page的所要加载的资源在加载过程中,出现了各种失败,则在此回调处理
page.onResourceError = function(resourceError) {}
4.page的所要加载的资源在发起请求时,都可以回调该函数
page.onResourceRequested = function(requestData, networkRequest) {}
5.page的所要加载的资源在加载过程中,每加载一个相关资源,都会在此先做出响应,它相当于http头部分, 其核心回调对象为response,可以在此获取本次请求的cookies、userAgent等
page.onResourceReceived = function(response) {}
6.欲在执行web网页时,打印一些输出信息到控制台,则可以在此回调显示。
page.onConsoleMessage = function (msg) {}
7.phantomjs是没有界面的,所以对alert也是无法直接弹出的,故phantomjs以该函数回调在page在执行过程中的alert事件
page.onAlert = function(msg) {}
8.当page.open中的url,它自己(不包括所引起的其它的加载资源)出现了异常,如404、no route to web site等,都会在此回调显示。
page.onError = function(msg, trace) {}
9.当page.open打开的url或是该url在打开过程中基于该URL进行了跳转,则可在此函数中回调。
page.onUrlChanged = function(targetUrl) {}
10.当page.open的目标URL被真正打开后,会在调用open的回调函数前调用该函数,在此可以进行内部的翻页等操作
page.onLoadFinished = function(status){}
11.在所加载的web page内部执行该函数,像翻页、点击、滑动等,均可在此中执行
page.evaluate(function(){})
12.将当前page的现状渲染成图片,输出到指定的文件中去。
page.render("")
4.例子
1.输出内容。新建hello.js。
"use strict";
console.log('Hello, world!');
phantom.exit();
命令行输入phantomjs hello.js。程序输出了 Hello,world!程序第三句话终止phantom 的执行。
2.获取输入的参数。新建arguments.js.
"use strict";
var system = require('system');
if (system.args.length === 1) {
console.log('Try to pass some args when invoking this script!');
} else {
system.args.forEach(function (arg, i) {
console.log(i + ': ' + arg);
});
}
phantom.exit();
命令行输入phantomjs arguments.js https://www.baidu.com 20180106 jie
输出结果:
0: phantomjs/arguments.js
1: https://www.baidu.com
2: 20180106
3: jie
其中第一个值是当前js文件的路径
3.页面加载,并返回页面标题
"use strict";
phantom.outputEncoding="utf-8";
var page = require('webpage').create();
page.open("http://blog.csdn.net", function(status) {
var title = page.evaluate(function() {
return document.title;
});
console.log('Page title is ' + title);
phantom.exit();
});
返回的结果:
Page title is CSDN首页-全球最大中文IT社区
4.创建web服务
var webserver = require('webserver');
var server = webserver.create();
var service = server.listen('127.0.0.1:9999', function(request, response) {
response.statusCode = 200;
response.write('<html><body>Hello!</body></html>');
response.close();
});
5.设置代理
"use strict";
var page = require('webpage').create(),
system = require('system'),
host, port, address;
if (system.args.length < 4) {
console.log('Usage: openurlwithproxy.js <proxyHost> <proxyPort> <URL>');
phantom.exit(1);
} else {
host = system.args[1];
port = system.args[2];
address = system.args[3];
phantom.setProxy(host, port, 'manual', '', '');
page.open(address, function (status) {
if (status !== 'success') {
console.log('FAIL to load the address "' +
address + '" using proxy "' + host + ':' + port + '"');
} else {
console.log('Page title is ' + page.evaluate(function () {
return document.title;
}));
}
phantom.exit();
});
}
phantomjs的使用的更多相关文章
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...
- Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...
- 使用PhantomJS实现网页截图服务
这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Canvas.Html2Image.Cobra),就是性能不怎么样(如SWT的Brower). ...
- 如何用phantomjs去抓取js渲染后的页面
1.安装phantomjs 网上有很多. 2.执行官网上的示例代码 // Read the Phantom webpage '#intro' element text using jQuery and ...
- Python爬虫学习(10):Selenium的好基友PhantomJS
上一节中我们学习了selenium,用python来操作浏览器,在做网页自动化测试的时候最好不过了 .如果我们来做爬虫用一个带界面的浏览器似乎不太好吧,那可咋办呢?别着急,下来我们要介绍的就是一款不带 ...
- phantomjs 双向认证,访问nginx,https
应用背景: phantomjs的一个爬虫,访问https站点,单向认证(只认证服务器身份)的都可以,双向认证(服务器和客户端都需要认证)必须上传本地证书: 开始用一个包含公钥私钥的PEM证书访问,怎么 ...
- selenium phantomjs 关闭问题
一个获取供应商余额的项目中,使用了 selenium 来爬虫,原因是获取余额不用太频繁,对性能要求不高.第二是 selenium 更好应对各种页面. 项目中,selenium webdriver使用了 ...
- 利用PhantomJS进行网页截屏,完美解决截取高度的问题
关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...
- phantomjs+selenium实现爬取动态网址
之前使用 selenium + firefox驱动浏览器来实现爬取动态网址,但是firefox经常更新,更新后时常会导致webdriver启动不来,所以改用phantomjs+selenium来改善一 ...
- 爬虫:selenium + phantomjs 解决js抓取问题(一)
selenium模块主要用来做测试,模拟键盘.鼠标来操作浏览器. phantomjs 就像一个无界面的浏览器一样. 两个结合能很好的解决js抓取的问题. 测试代码: #coding=utf-8 fro ...
随机推荐
- 自学Zabbix2.1-安装需求
zabbix的安装需求通常就是硬件配置.软件需求,或者说我安装zabbix需要什么软件,服务器需要什么样的配置,监控100台服务器需要怎样的一台服务器,或者我有一台8核16G的服务器,我能监控多少台服 ...
- mybatis分页练手
最近碰到个需求,要做个透明的mybatis分页功能,描述如下:目标:搜索列表的Controller action要和原先保持一样,并且返回的json需要有分页信息,如: @ResponseBody @ ...
- 后台程序处理 (一)python asyncio 协程使用
由于脚本需要在完成事件处理后N秒检查事件处理结果,当执行失败时再执行另一个事件处理. 想要最小化完成这个功能.同时在第一时间就将执行完毕的结果反馈给接口. 因此想到使用协程. 使用之前先翻阅了一下现有 ...
- idea历史版本下载
https://confluence.jetbrains.com/display/IntelliJIDEA/Previous+IntelliJ+IDEA+Releases
- 虚拟机修改静态ip
1.设置虚拟机的网络选择方式,使用NAT模式,选择这个模式后网段与主机的网段不是一个网段,一般选择桥接模式 2.选择VMnet8, 去掉 使用本地DHCP服务将ip分配给虚拟机 这个选项,不然设置ip ...
- iOS pch文件创建使用,和info.plis文件路径改变,路径的设置
一 路径报错: 二 pch创建设置: 一:如果要更改Info.plist与Prefix.pch文件实际路径,也就是实际文件的位置(不是在工程中的组织路径),需要到Build Settings中修改对应 ...
- MySQL操作时间的函数集
求两个Timestamp之间的秒差值: select TIMESTAMPDIFF(SECOND,TIMESTAMP("2017-03-01 07:58:20"),timestamp ...
- 每周.NET前沿技术文章摘要(2017-05-10)
汇总国内外.NET社区相关文章,覆盖.NET ,ASP.NET和Docker容器三个方面的内容: .NET Debugging .NET core with SOS everywhere 链接:htt ...
- MySQL 如何存储长度较大的varchar与blob
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/96 最近,在工作中遇到了MySQL中如何存储长度较长的字段类型问 ...
- uptime 命令详解
作用: 打印系统总共运行了多长时间和系统的平均负载. uptime 命令可以显示的信息依次为: 现在时间, 系统已经运行时间, 目前登录用户个数, 系统1,5,15 分钟内的平均负载 实例: up ...