1 介绍

PhantomJS是一个×××面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。官方文档

2 安装

PhantomJS分别提供了win、linux等多个平台的安装包,大家可以直接下载相应平台版本安装即可。
安装包
我是安装在win10下,下载完配置截图如下:
记住phantomjs.exe目录,下面要用

点击我的电脑右键---属性---高级系统设置---环境变量---系统变量---path--添加上面的路径

打开cmd,输入phantomjs -v查看:

图中返回版本信息表示成功。

3 快速开始

3.1 Hello, World!

创建一个hello.js文件,文件内容如下:

console.log('Hello, world!');
phantom.exit();

在cmd或pycharm中直接执行,结果如下:

在第一行中,日志将把传递的字符串打印到终端。第二行,退出执行。
注意:phantomjs.exit()一定不要忘记加,不然js不会被终止。

3.2 页面加载

可以通过创建web页面对象来加载、分析和呈现web页面。
下面的脚本演示了页面对象最简单的用法。保存为文件baidu.js,它加载百度页面,然后将其保存为一个图像,图像被保存在脚本运行的目录中。

var page = require('webpage').create();
page.open('https://www.baidu.com', function(status) {console.log("Status: " + status);if(status === "success") {page.render('baidu.png');}phantom.exit();
});

执行结果:

由于它的渲染特性,可以使用phantomjs来捕获web页面,本质上是对内容进行屏幕截图。

3.3 测试加载页面速度

以下loadspeed.js脚本加载指定的URL(不要忘记加http协议),并测量加载它所需的时间。

var page = require('webpage').create(),system = require('system'),t, address;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();
});

脚本运行结果如下:

3.4 代码评估

使用evaluate()函数在web页面的内容评估JavaScript代码,评估是一个“沙盒”,代码无法访问其自身页面内容之外的任何JavaScript对象和变量,从evaluate()返回一个不能包含函数或闭包的简单对象。
下面是一个展示网页标题的例子:

var page = require('webpage').create();
page.open('https://www.taobao.com', function(status) {var title = page.evaluate(function() {return document.title;});console.log('Page title is ' + title);phantom.exit();
});

执行结果:

图片里可以看到我加了--output-encoding=gb2312,如果不加会乱码,后续会研究这个问题,现在想到的解决办法就是这样。

任何来自web页面的控制台消息,包括来自evaluate()中的代码,都不会在默认情况下显示。要纠正这中方式,可以使用onConsoleMessage回掉。前面的例子可以重写为:

var page = require('webpage').create();
page.onConsoleMessage = function(msg) {console.log('Page title is ' + msg);
};
page.open('https://www.taobao.com', function(status) {page.evaluate(function() {console.log(document.title);});phantom.exit();
});

3.5 屏幕捕捉

因为 PhantomJS 使用了 WebKit内核,是一个真正的布局和渲染引擎,它可以像屏幕截图一样捕获一个web界面。因为PhantomJS 可以在web页面上呈现任何内容,所以它不仅用到HTML,CSS的内容转化,还用在SVG,Canvas的转化。
下面的例子展示了用PhantomJS加载github捕捉页面,生成github.png图片

var page = require('webpage').create();
page.open('http://github.com/', function() {page.render('github.png');phantom.exit();
});

PhantomJS除了支持png格式,还支持JPEG, GIF, and PDF格式。测试例子
你可以用页面的属性改变截图和网页的大小,见下面示例:

var page = require('webpage').create();
//viewportSize being the actual size of the headless browser
page.viewportSize = { width: 1024, height: 768 };
//the clipRect is the portion of the page you are taking a screenshot of
page.clipRect = { top: 0, left: 0, width: 1024, height: 768 };
//the rest of the code is the same as the previous example
page.open('https://www.baidu.com', function() {page.render('github.png');phantom.exit();
});

通过viewportSize 和 clipRect 属性。
viewportSize 是视区的大小,你可以理解为你打开了一个浏览器,然后把浏览器窗口拖到了多大。
clipRect 是裁切矩形的大小,需要四个参数,前两个是基准点,后两个参数是宽高。

3.6 网络监控

由于PhantomJS允许对网络流量进行检查,因此可以对网络行为和性能进行各种分析,所有的资源请求和响应都可以使用onResourceRequested和onResourceReceived来进行嗅探。一个简单的日志记录每个请求和响应的例子,脚本名称netlog.js:

var page = require('webpage').create();
page.onResourceRequested = function(request) {console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function(response) {console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);

运行结果会打印出所有以JSON格式输出资源的请求和接收状态。

3.7 页面自动化

因为PhantomJS可以加载和操作网页,所以执行各种页面自动操作是非常完美的。
DOM操作
由于脚本的执行方式就像是在web浏览器上运行,所以执行标准的DOM脚本和CSS选择器完全没有问题。
以下useragent.js示例演示了读取User-Agent的id为qua的textContent属性

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
page.open('http://www.httpuseragent.org', function(status) {if (status !== 'success') {console.log('Unable to access network');} else {var ua = page.evaluate(function() {return document.getElementById('qua').textContent;});console.log(ua);}phantom.exit();
});

执行结果:

使用jQuery 和其它库
在1.6版中,您还可以使用页面将jQuery包含到页面中。

var page = require('webpage').create();
page.open('http://www.sample.com', function() {page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {page.evaluate(function() {$("button").click();});phantom.exit()});
});

上面的代码片段将打开一个web页面,将jQuery库包含到页面中,然后单击所有使用jQuery的按钮。它将从web页面退出。确保在页面中放置退出语句。包括js,或者它可能在javascript代码被包含之前就退出。

更多例子

好吧,看完这一节是不是感觉一脸懵逼,不知道再干什么,跟python爬虫有毛关系,上张图供大家理解:

图片来源:知乎用户yea yee

转载于:https://blog.51cto.com/linuxliu/2054925

运维学python之爬虫工具篇(四)PhantomJS的用法相关推荐

  1. yield python3 知乎_运维学python之爬虫高级篇(七)scrapy爬取知乎关注用户存入mongodb...

    首先,祝大家开工大吉! 本篇将要介绍的是从一个用户开始,通过抓关注列表和粉丝列表,实现用户的详细信息抓取并将抓取到的结果存储到 MongoDB. 1 环境需求 基础环境沿用之前的环境,只是增加了Mon ...

  2. python urllib.request 爬虫 数据处理-运维学python之爬虫基础篇(二)urllib模块使用...

    1 何为爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  3. 运维学python哪部分_初入运维的小伙伴,别再问需不需要学Python了

    这篇文章来自百度知道(你可以搜索"运维需不需要学Python"),或许有些观点不一定正确,但运维学Python这事毫无疑问是主流了,不信可以到各大招聘网站,看看但凡招聘运维有编程技 ...

  4. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  5. 运维学python哪部分_运维新手们,别再问需不需要学PYTHON了

    经常有人在群里问,运维人员需不需要学开发?需不需要学PYTHON?PYTHON和SHELL有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲,求求新手们,以后别他妈瞎问了. 现阶段,掌握 ...

  6. 运维学python用不上_运维朋友们,别再问需不需要学 Python 了!

    运维人员需不需要学开发?需不需要学 Python?PythonN 和 Shell 有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲. 现阶段,掌握一门开发语言已经成为高级运维工程师的必 ...

  7. 运维学python用不上_数读 | 为什么运维朋友们都需要学Python?

    运维人员需不需要学开发?需不需要学Python?PythonN和Shell有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲. 现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能, ...

  8. 运维学python用不上_运维工程师为什么要学python?

    现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能,不会开发,你就不能充分理解你们系统的业务流程,你就不能帮助调试.优化开发人开发的程序, 开发人员有的时候很少关注性能的问题,这些问题就得运维人 ...

  9. 运维学python perl go_公开课|一个小运维的《Golang 入门心路历程》

    成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 视频版 公开课主要内容:缘起 初识 熟悉 实践 爱上 缘起 本人之前是 hadoop hbase 运维,为了节约成本 hadoop cli ...

最新文章

  1. 2021年大数据ELK(十七):Elasticsearch SQL 订单统计分析案例
  2. Java学习总结:32(Runtime类)
  3. UML中类图与对象图的区别
  4. 敏捷个人第五次练习:个人使命宣言
  5. paper reference
  6. ensp查看历史配置命令_华为eNSP常用命令
  7. leetcode(977)有序数组的平方
  8. 开发者在对项目失去信心后,该做什么?
  9. 理解Android安全机制
  10. 阿里云助贫困大学生用技能点亮人生
  11. Python游戏编程入门(一)——初识Pygame
  12. 七年级画图计算机教案,信息技术画图软件学习教案
  13. 关于Qt::WA_TransparentForMouseEvents的一些记录
  14. vPlayer 模块Demo
  15. python窗口截图快捷键_python 自定义截图快捷键
  16. fastjson不序列化空属性,解决办法
  17. node-onebot对接傻妞新版
  18. 攻防世界writeup——Web(持续更新)
  19. 怎样看待中小学stem教育特点
  20. 送给前端的你,推荐几篇前端汇总文章

热门文章

  1. keepalive+lvs负载均衡及高可用总结
  2. VB 实现UTF-8 与GB2312互转
  3. tomcat集群共享session
  4. 年底跳槽,都去哪儿?数万从业者的新选择即将揭幕
  5. 骗过70%的人!这个AI能自动给视频配音,真假难辨(不服来试)
  6. logback之使用demo
  7. [20180614]删除bootstrap$记录无法启动2.txt
  8. bzoj 4129 Haruna’s Breakfast 树上莫队
  9. Angular 4.x 自定义表单控件
  10. phpcms v9前台getshell