文档章节

phantomjs使用

acutesun
 acutesun
发布于 2017/07/30 13:53
字数 1194
阅读 63
收藏 1

页面加载

使用webpage模块创建一个page对象,然后通过page对象打开 https://my.oschina.net/acutesun/网址,如果请求响应的状态为success,则通过render方法将当前界面保存test.png

var page = require('webpage').create();
page.open('https://my.oschina.net/acutesun', function (status) {
    console.log('status:' + status);
    if (status ==='success'){
        page.render('sun.png')
    }
    phantom.exit()
});

运行 命令可以看到效果

sun@OMEN:/python/SPIDERdemo/chapter9$ phantomjs pageload.js 
status:success

对打开的网页进行测试

loadspeed.js:

var page = require('webpage').create(),
    system = require('system'),
    t, address;
//需要传递一个url做参数
if (system.args.length === 1){
    console.log('usage: loadspeed.js <some URL>');
    phantom.exit();
}

t = Date.now();
address = system.args[1];
page.open(address, function (status) {
    if (status != 'success'){
        console.log('fail to load the address');
    }else {
        t = Date.now()-t;
        console.log('loading ' + system.args[1]);
        console.log('loading time ' + t +'msec');
    }
    phantom.exit()
});

输出结果:

sun@OMEN:/$ phantomjs loadspeed.js https://my.oschina.net/acutesun/
loading https://my.oschina.net/acutesun/
loading time 2907msec

 

代码评估

使用 evaluate,不会执行网页外的js, 返回一个对象,返回值仅限于对象,不能包含函数(闭包)

var url = 'https://my.oschina.net/acutesun';
var page = require('webpage').create();
page.open(url, function (status) {
    var title = page.evaluate(function () {
        return document.title;
    });
    console.log('page title is '+ title);
    phantom.exit();
});

输出:

sun@OMEN:/$ phantomjs evaluate.js 
page title is acutesun的个人空间 - 开源中国社区

 

屏幕捕获

由于PhantomJS使用的WebKit内核,一个真正的布局和渲染引擎。可以捕捉一个网页的屏幕截图

page对象有两个非常重要的属性:viewportSize和clipRect

viewportSize 可以看做是将打开的浏览器窗口进行缩放。

clipRect 是在这个视区中裁剪矩形的大小,需要四个参数,前两个是基准点,后两个参数是宽高

var page = require('webpage').create();
page.viewportSize = {width: 1024, height: 768};
page.clipRect = {top: 0, left: 0, width:512, height:256};
page.open('https://my.oschina.net/acutesun', function (status) {
    console.log('status: '+ status);
    if (status === 'success'){
        page.render('screen.png')
    }
    phantom.exit()
});

可以运行查看效果,发现只截取类一部分图片

 

网络监控

PhantomJS允许检验网络流量,因此它适合分析网络行为和性能,实现对网络的监听。当向远程服务器发送请求时,可以使用onResourceRequested和onResourceReceived两个方法嗅探所有的资源请求和响应

var url = 'https://my.oschina.net/acutesun';
var page = require('webpage').create();
page.onResourceRequested = function (request) {
    console.log('Request ' + JSON.stringify(request, undefined, 4));
};

page.onResourceReceived = function (response) {
    console.log('Received ' + JSON.stringify(response, undefined, 4));
};
page.open(url);

请求或者响应信息会以JSON格式显示

sun@OMEN:/$ phantomjs netmonitor.js 
Request {
    "headers": [
        {
            "name": "Accept",
            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        },
        
    "id": 1,
    "method": "GET",
    "time": "2017-07-30T05:09:54.265Z",
    "url": "https://my.oschina.net/acutesun"
}
Received {
    "body": "",
    "bodySize": 29685,
    "contentType": "text/html;charset=UTF-8",
    "headers": [
        {
            "name": "Server",
            "value": "Qnginx/1.4.0"
        },
        
        {
            "name": "Set-Cookie",
            "value": "_user_behavior_=ca6a7b33-322d-4b04-b0de-ce8f0a9908d8; Domain=.oschina.net; Expires=Mon, 30-Jul-2018 05:09:59 GMT; Path=/; HttpOnly"
        },
        {
        ,

 

页面自动化

PhantomJS中标准JavaScript的DOM操作和CSS选择器都是生效的

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36';
page.open('http://movie.mtime.com/229733/', function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        var ua = page.evaluate(function () {
            return document.getElementById('ratingRegion').textContent;
        });
        console.log(ua);
    }
    phantom.exit();
});

首先创建page对象, 修改user-agent,打开指定网页,执行DOM操作,获取id为ratingRegion元素的内容

输出

sun@OMEN:/$ phantomjs autojs.js 
The default user agent is Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1
7.6总分:106,941人评分 4,399人想看音乐 画面 导演 故事 …票房:7.52 亿元获奖:1次

 

常用模块

phantom, webpage, system, fs

phantom

webpage

includeJs(url,callback){void}

功能是包含从指定的URL获取远程javaScript脚本,并执行回调方法

var webPage = require('webpage');
var page = webPage.create();
page.includeJs(
// Include the https version, you can change this to http if you like.
    'https:// ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js',
    function () {
        (page.evaluate(function () {
// jQuery is loaded, now manipulate the DOM
            var $loginForm = $('form# login');
            $loginForm.find('input[name="username"]').value('phantomjs');
            $loginForm.find('input[name="password"]').value('c45p3r');
        }))
    }
);

open方法有四种函数重载的方式

  • open(url,callback) {void}
  • open(url,method,callback){void}
  • open(url,method,data,callback){void}   method为GET或POST请求,data为附加的数据,callback为回调函数        
var webPage = require('webpage');
var page = webPage.create();
var postBody = 'user=username&password=password';
page.open('http://www.google.com/', 'POST', postBody, function(status) {
    console.log('Status: ' + status);
    // Do other things here...
});
  • open(url,settings,callback){void} setting为对请求头和内容的设置
var webPage = require('webpage');
var page = webPage.create();
var settings = {
    operation: "POST",
    encoding: "utf8",
    headers: {
        "Content-Type": "application/json"
    },
    data: JSON.stringify({
        some: "data",
        another: ["custom", "data"]
    })
};
page.open('http://your.custom.api', settings, function (status) {
    console.log('Status: ' + status);
// Do other things here...
});

onInitialized 是回调方法,在webpage对象被创建之后,url被加载之前被调用,主要是用来操作一些全局变量

var webPage = require('webpage');
var page = webPage.create();
page.onInitialized = function () {
    page.evaluate(function () {
        document.addEventListener('DOMContentLoaded', function () {
            console.log('DOM content has loaded.');
        }, false);
    });
};

onLoadFinished是回调方法,在页面加载完成之后调用,方法还有一个参数status。如果加载成功status为success,否则为fail。webpage中open方法就是用这个方法作为回调函数

var webPage = require('webpage');
var page = webPage.create();
page.onLoadFinished = function (status) {
    console.log('Status: ' + status);
// Do other things here...
};

 

system

system模块只有属性,没有方法

fs

fs模块全称为File System,主要是对文件系统进行操作。该模块方法很多,创建文件、判断文件是否存在、读写文件的方法

© 著作权归作者所有

上一篇: selenium使用
下一篇: mongodb基础
acutesun
粉丝 0
博文 71
码字总数 83152
作品 0
程序员
私信 提问
聊聊phantomjs的优化措施

序 本文主要小结一下phantomjs的优化措施 phantomjs phantomjs相当于一个后台浏览器,有点内嵌jetty的味道,通常在自动化测试或者爬虫领域用。 优化点 池化技术,避免重复启动 对于其他语言进...

go4it
2017/11/07
72
0
ubuntu 安装phantomjs、chromedriver、geckodriver

一、安装phantomjs 1.从官网下载http://phantomjs.org/download.html 2.加压 tar -zxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 3.mv phantomjs-2.1.1-linux-x86_64 /usr/local/share/phanto......

littlemesieV
2018/04/18
304
0
如何在无头模式下运行WebDriver?

如何在无头模式下运行WebDriver?如果您的CI工具(例如Jenkins)不支持UI,则可能需要这样做。 在无头模式下运行WebDriver自动测试在测试执行速度和更轻松地集成到CI管道方面具有优势。 下面...

程序猿拿Q
2018/11/26
134
0
PhantomJS+Echarts生成图片(POI第三方集成工具,HttpClient.post)

网友结论:PhantomJS技术方案老旧,推荐使用Puppeteer, 最差也用 casperjs PhantomJS+Echarts生成图片(https://gitee.com/liuzidong/PhantomJSForEcharts) 参考资料 1. ECharts - Java类库(...

近在咫尺远在天涯
09/02
32
0
php使用QueryList轻松采集JavaScript动态渲染页面

QueryList使用jQuery的方式来做采集,拥有丰富的插件。 下面来演示使用插件抓取JS动态创建的页面内容。 安装 使用Composer安装: 安装QueryList GitHub: https://github.com/jae-jae/QueryL...

土木x
2017/10/07
517
0

没有更多内容

加载失败,请刷新页面

加载更多

巨杉Tech | Hbase迁移至SequoiaDB 实战

背景 在传统银行 IT 架构中,联机交易与统计分析系统往往采用不同的技术与物理设备,通过定期执行的 ETL 将联机交易数据向分析系统中迁移。而作为数据服务资源池,同一份数据可能被不同类型的...

巨杉数据库
32分钟前
5
0
关于快速开发框架:网红妹纸,给了我一个idea!

我是一名软件公司的员工,从事撸码事业也有一段时间了。码代码已经成为我生活的一部分,我的撸码的生活几乎一成不变。直到有一天,写字楼搬来了一家网络红公司! 网红公司,什么是网红公司,...

我想造火箭
34分钟前
8
0
Java操作栈-表达式求值

package stack.demo;import java.io.IOException;import java.util.Scanner;import java.util.Stack;/** * 表达式求值 算符优先法 * 3*(5-2)# #在这里表示结尾 * ...

FeanLau
44分钟前
5
0
Java内功心法,Set集合的详解

本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门:https://mp.weixin.qq.com/s/Jzdd...

李红欧巴
45分钟前
23
0
微博 2 亿日活背后,广告系统不掉线的全景运维大法

https://www.infoq.cn/article/wfHffPqV2f4Y5M1y6Mf2

perofu
49分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部